[关闭]
@MrXiao 2018-02-27T09:27:43.000000Z 字数 4121 阅读 679

Mybatis(2)——Dao层开发方法

Mybatis


mybatis的dao层通常有两种开发方式,原始dao开发及mapper接口发开方法。

1、SqlSession的使用范围

SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

1.1 SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

1.2 SqlSessionFactory

SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

1.3 SqlSession

SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。

执行过程如下:
1、 加载数据源等配置信息
Environment environment = configuration.getEnvironment();
2、 创建数据库链接
3、 创建事务对象
4、 创建Executor,SqlSession所有操作都是通过Executor完成
5、 SqlSession的实现类即DefaultSqlSession,此对象中对操作数据库实质上用的是Executor

结论:
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

2、原始Dao开发

原始开发方式需要编写dao接口及接口实现类。

2.1 编写映射文件(sql)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="test">
  6. <select id="queryById" parameterType="long" resultType="com.topvision.maven.mybatis.domain.Book">
  7. select book_id bookId,name,number from book where book_id = #{id}
  8. </select>
  9. </mapper>

2.2 编写Dao接口

  1. public interface BookDao {
  2. public Book queryById(long id);
  3. }

2.3 编写Dao实现类

  1. public class BookDaoImpl implements BookDao {
  2. private SqlSessionFactory sqlSessionFactory;
  3. // 注入SqlSessionFactory
  4. public BookDaoImpl(SqlSessionFactory sqlSessionFactory) {
  5. this.setSqlSessionFactory(sqlSessionFactory);
  6. }
  7. @Override
  8. public Book queryById(long id) {
  9. SqlSession sqlSession = null;
  10. Book book = null;
  11. try {
  12. sqlSession = sqlSessionFactory.openSession();
  13. book = sqlSession.selectOne("test.queryById", id);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. } finally {
  17. sqlSession.close();
  18. }
  19. return book;
  20. }
  21. public SqlSessionFactory getSqlSessionFactory() {
  22. return sqlSessionFactory;
  23. }
  24. public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
  25. this.sqlSessionFactory = sqlSessionFactory;
  26. }
  27. }

2.4 测试用例

  1. public class BookDaoImplTest {
  2. private SqlSessionFactory sqlSessionFactory;
  3. @Before
  4. public void createSqlSessionFactory() throws IOException{
  5. String resource = "sqlMapConfig.xml";
  6. InputStream inputStream = Resources.getResourceAsStream(resource);
  7. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  8. }
  9. @Test
  10. public void testQueryById() {
  11. BookDao bookDao = new BookDaoImpl(sqlSessionFactory);
  12. Book book = bookDao.queryById(1000l);
  13. System.out.println(book);
  14. }
  15. }

3、Mapper接口开发

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

3.1 Mapper.xml(映射文件)

在classpath下新建mapper文件夹,新建BookMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.topvision.maven.mybatis.dao.BookDao">
  6. <select id="queryById" parameterType="long" resultType="book">
  7. select book_id bookId,name,number from book where book_id = #{id}
  8. </select>
  9. </mapper>

3.2 BookDao接口

  1. public interface BookDao {
  2. public Book queryById(long id);
  3. }

接口定义有如下特点:
1、 Mapper接口方法名和Mapper.xml中定义的statement的id相同
2、 Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
3、 Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

3.3 加载BookMapper.xml

  1. <mappers>
  2. <mapper resource="mapper/BookMapper.xml"/>
  3. </mappers>

3.4 测试

  1. @Test
  2. public void testQueryByIdInProxy() {
  3. SqlSession sqlSession = null;
  4. try {
  5. sqlSession = sqlSessionFactory.openSession();
  6. BookDao bookDao = sqlSession.getMapper(BookDao.class);
  7. Book book = bookDao.queryById(1000l);
  8. System.out.println(book);
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. } finally {
  12. if (sqlSession != null) {
  13. sqlSession.close();
  14. }
  15. }
  16. }

3.5 小结

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注