myBatis的Dao开发(4)

前记:这是很早之前自学学习myBatis时的笔记,内容比较基础,适合新手,内容基本是来自网络,如有雷同,敬请谅解!

      myBatis的Dao开发

使用Mybatis开发Dao,通常有两个方法,即 原始Dao开发方法和Mapper接口开发方法。

     SqlSession的使用范围

         SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。

通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

 SqlSessionFactoryBuilder

   通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory

   将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。

   在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

  SqlSessionFactory

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

通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。

将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。

  SqlSession

SqlSession是一个面向用户(程序员)的接口,

sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。

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

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

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

执行过程如下:

1、  加载数据源等配置信息

Environment environment = configuration.getEnvironment();

2、  创建数据库链接

3、  创建事务对象

4、  创建Executor,SqlSession所有操作都是通过Executor完成,mybatis源码如下:

if (ExecutorType.BATCH == executorType) {

      executor = new BatchExecutor(this, transaction);

 } else if (ExecutorType.REUSE == executorType) {

      executor = new ReuseExecutor(this, transaction);

 } else {

      executor = new SimpleExecutor(this, transaction);

 }

if (cacheEnabled) {

      executor = newCachingExecutor(executor, autoCommit);

    }

5、  SqlSession的实现类即DefaultSqlSession,此对象中对操作数据库实质上用的是Executor

结论:

         每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

         打开一个SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:

         SqlSession session = sqlSessionFactory.openSession();

         try {

                  // do work

         } finally {

                session.close();

         }

    原始Dao开发方法

     原始Dao开发方法需要程序员编写Dao接口和Dao实现类。

    思路

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

  Dao接口

Public interface UserDao {

    public User getUserById(int id) throws Exception;

    public void insertUser(User user)throws Exception;

}

  Dao接口实现类

Public class UserDaoImplimplements UserDao {

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

    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){

       this.setSqlSessionFactory(sqlSessionFactory);

    }

    private SqlSessionFactorysqlSessionFactory;

    @Override

    public UsergetUserById(int id)throws Exception {

       SqlSession session = sqlSessionFactory.openSession();

       User user = null;

       try {

           //通过sqlsession调用selectOne方法获取一条结果集

           //参数1:指定定义的statementid,参数2:指定向statement中传递的参数

           user = session.selectOne("test.findUserById", 1);

           System.out.println(user);             

       } finally{

           session.close();

       }

       return user;

    }

    @Override

    Public void insertUser(User user)throws Exception {

       SqlSession  sqlSession= sqlSessionFactory.openSession();

       try {

           sqlSession.insert("insertUser", user);

           sqlSession.commit();

       } finally{

           session.close();

       }

    }

}

  总结原始Dao开发问题

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

2、调用sqlsession方法时将statement的id硬编码了

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

  Mapper代理方法开发Dao

  思路(Mapper代理开发规范)

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

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

开发规范:

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


2、mapper.java接口中的方法名和mapper.xmlstatementid一致

3、mapper.java接口中的方法输入参数类型和mapper.xmlstatementparameterType指定的类型一致。

4、mapper.java接口中的方法返回值类型和mapper.xmlstatementresultType指定的类型一致。


总结:

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

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

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


Mapper.java(接口文件)--------------接口定义有如下特点:

1、Mapper接 口方法名和Mapper.xml中定义的statement的id相同

2、  Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同

3、  Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

Mapper.xml(映射文件)

定义mapper映射文件 UserMapper.xml(内容同Users.xml),需要修改namespace的值为 UserMapper接口路径。将UserMapper.xml放在classpath 下mapper目录 下

 在SqlMapConfig.xml中加载mapper.xml

修改SqlMapConfig.xml文件:

 <!--加载映射文件 -->

 <mappers>

   <mapperresource="mapper/UserMapper.xml"/>

  </mappers>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值