mybatis开发dao的方法

mybatis开发dao的方法


1-SqlSession的使用范围

     1-1:SqlSessionFactoryBuilder(只当成一个工具类即可,不需要使用单例模式管理)

        通过SqlSessionFactoryBuilder创建SqlSessionFactory,

     1-2:SqlSessionFactory

          通过SqlSessionFactory创建SqlSession,使用单例模式管理SqlSessionFactory(工厂)

          将来mybatis和spring整合后喜用单例模式管理SqlSessionFactory

     1-3:SqlSession是一个面向用户(程序员)的接口。

          

       SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)selectList(返回单个或多个对象)、。

        SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。

        SqlSession最佳应用场合在方法体内,定义成局部变量使用。

1.1 原始dao开发方法(程序员需要写dao接口和dao实现类)

1.1.1 思路

程序员需要写dao接口和dao实现类。

需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession

2.1.2 dao接口


2.1.3 dao接口实现类

public class UserDaoImplimplements UserDao {

 

// 需要向dao实现类中注入SqlSessionFactory

// 这里通过构造方法注入

private SqlSessionFactorysqlSessionFactory;

 

public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {

this.sqlSessionFactory = sqlSessionFactory;

}

 

@Override

public User findUserById(int id)throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

User user = sqlSession.selectOne("test.findUserById", id);

 

// 释放资源

sqlSession.close();

 

return user;

 

}

 

@Override

public void insertUser(User user)throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

 

//执行插入操作

sqlSession.insert("test.insertUser", user);

 

// 提交事务

sqlSession.commit();

 

// 释放资源

sqlSession.close();

 

}

 

@Override

public void deleteUser(int id)throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

 

//执行插入操作

sqlSession.delete("test.deleteUser", id);

 

// 提交事务

sqlSession.commit();

 

// 释放资源

sqlSession.close();

 

}

 

}

2.1.4 测试代码:


2.1.5 总结原始 dao开发问题

1dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

 

2、调用sqlsession方法时将statementid硬编码了

3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。


 3.1 mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

 3.2 思路(mapper代理开发规范)

程序员还需要编写mapper.xml映射文件

程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

1、在mapper.xmlnamespace等于mapper接口地址



总结:

以上开发规范主要是对下边的代码进行统一生成:

 

User user = sqlSession.selectOne("test.findUserById", id);

sqlSession.insert("test.insertUser", user);

。。。。

3.3 mapper.java



3.4 mapper.xml


3.5 SqlMapConfig.xml中加载mapper.xml


3.6 测试


3.7 一些问题总结

3.7.1代理对象内部调用selectOneselectList

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

3.7.2 mapper接口方法参数只能有一个是否影响系统 开发mapper接口方法参数只能有一个,系统是否不利于扩展维护。

系统框架中,dao层的代码是被业务层公用的。

即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

 

注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。



发布了126 篇原创文章 · 获赞 145 · 访问量 17万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章