1、分析SqlSession使用范围

  1.1、SqlSessionFactoryBuilder

  通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory

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

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

  1.2、SqlSessionFactory

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

  将来 mybatis 和 spring 整合后,通过单例模式管理 SqlSessionFactory。

  1.3、SqlSession

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

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

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

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

2、原始 dao 的开发(程序员需要写 dao 接口和 dao 实现类)

  2.1、思路:

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

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

  

  2.2、dao接口:

public interface UserDao {// 根据id查询用户信息public User findUserById(int id) throws Exception;// 添加用户信息public void insertUser(User user) throws Exception;// 删除用户信息public void deleteUser(int id) throws Exception;
}

  2.3、dao层实现类:

public class UserDaoImpl implements UserDao {//向dao实现类中注入 SqlSessionFactory//通过构造方法注入private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}public User findUserById(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("test.findUserById", id);// 释放资源
        sqlSession.close();return user;}public void insertUser(User user) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();// 执行插入的操作sqlSession.insert("test.insertUser", user);// 提交事务
        sqlSession.commit();// 释放资源
        sqlSession.close();}public void deleteUser(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();// 执行删除的操作sqlSession.insert("test.deleteUser", id);// 提交事务
        sqlSession.commit();// 释放资源
        sqlSession.close();}}

  2.4、测试代码:

public class UserDaoImplTest {private SqlSessionFactory sqlSessionFactory;// 此方法是在执行 testFindUserById 之前执行
    @Beforepublic void setUp() throws Exception{//创建sqlSessionFactory// mybatis配置文件String resource = "config/SqlMapConfig.xml";// 得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() throws Exception {// 创建UserDao对象UserDao userDao = new UserDaoImpl(sqlSessionFactory);// 调用UserDao的方法 User user = userDao.findUserById(1);System.out.println(user);}}

  2.5、总结原始 dao 开发问题

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

  (2)调用 sqlSession 方法时将 statement 的 id 硬编码。

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

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

  3.1、思路(Mapper代理开发规范):

    程序员还需要编写 mapper.xml 映射文件(核心)

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

   

  3.2、mapper 开发规范:

    (1)在 mapper.xml 中,namespace 等于mapper接口的地址

    

    (2)mapper.java 接口中的方法名和 mapper.xml 中 statement 的 id 一致

    (3)mapper.java 接口中的方法输入参数类型 和 mapper.xml 中 statement 的 parameterType 指定的类型一致

      

    (4)mapper.java 接口中的方法返回值类型和 statement 的 resultType 的类型一致

      Mapper.xml 对比 Mapper.java

    

        

      

    

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

sqlSession.selectOne("test.findUserById", id);sqlSession.selectList("test.findUserById", name);sqlSession.insert("test.insertUser", user);sqlSession.delete("test.deleteUser", id);

  3.3、mapper.java:

  

  3.4、mapper.xml:

  

  3.5、在 SqlMapConfig.xml 中加载 mapper.xml 文件

  

  3.6、测试代码

@Test
public void testFindUserById() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建一个 UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用userMapper的方法User user = userMapper.findUserById(1);System.out.println(user);}

  

3、一些问题的总结  

  3.1、代理对象内部调用 selectOne 或 selectList

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

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

  3.2、mapper 接口方法参数只能有一个,这是否影响系统开发  

    mapper 接口方法参数只能有一个,系统是否不利于维护,系统框架中,dao 层的代码是被业务层公用的。

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

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

  

转载于:https://www.cnblogs.com/xb1223/p/10198072.html

Mybatis 开发 dao 的方法相关推荐

  1. Mybatis学习记录(二)----mybatis开发dao的方法

    1  SqlSession使用范围 1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将Sq ...

  2. mybatis开发dao的方法——(三)

    ------------------------1.    SqlSession使用范围------------------- 1.1     SqlSessionFactoryBuilder 通过S ...

  3. MyBatis开发Dao的方法

    1.SqlSession的使用范围 1.1 SqlSessionFactoryBuilder:用来创建SqlSessionFactory,只需要把SqlSessionfactoryBuilder当成一 ...

  4. mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...

    5 mybatis开发dao的方法 5.1 SqlSession使用范围 5.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂 ...

  5. 【MyBatis框架】Mybatis开发dao方法第二部分

    下面来继续讨论mybatis开发Dao的方法 我们前面使用原始的Dao开发方法,发现了许多弊端,我们下面使用mapper代理来写Dao方法. 1.mapper代理方法(程序员只需要mapper接口(相 ...

  6. 【MyBatis框架】Mybatis开发dao方法第一部分

    下面来讨论mybatis开发Dao的方法 先来说一下基本架构流程中使用到的几个类 1.SqlSession使用范围 1.1SqlSessionFactoryBuilder  通过SqlSessionF ...

  7. 【mybatis基础】mybatis开发dao两种方法

    mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目.mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.mybat ...

  8. mybatis教程--原始方式和mapper方式开发dao详解

    mybatis开发dao的两种方式 一.原始的dao开发方式 所谓的原始的dao的开发方式,其实就是和hibernate的开发方式类似的,需要dao的接口和dao的实现类,这个就是原始的开发方式,而m ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao ...

最新文章

  1. 独立云计算服务商的多维实践之道:用户需求驱动变革
  2. etcd分布式之消息发布与订阅
  3. matlab撤销上一步命令_CAD快速入门技巧:CAD软件中撤销操作的方法汇总
  4. linux临时启动进程命令,Linux常用命令(一)服务控制及优化启动过程
  5. SQL生成日期维度(到小时)
  6. ​asp家教交流平台系统设计网站作品
  7. CDR 制作“决战高考”海报
  8. SOLARIS SYSTEM COMMAND(个人整理笔记)
  9. Jenkins项目配置-maven项目-全面
  10. list_for_each_entry解析
  11. 有没有比图灵机能力更强的计算模型?
  12. 计算机网络实验感想6,计算机网络实验项目六
  13. 2021-03-4:task04_NFM模型
  14. 江南怎么用计算机弹,怎样在电脑上玩江南百景图
  15. python盘整之路
  16. win10 网卡无法搜索到5G频段网络
  17. itx机箱尺寸_ITX方案推荐--机箱篇
  18. 在浙江大学做全校单点登录接入的心得体会,采用sun公司的单点登录技术
  19. ionic2 tab切换控制
  20. 夜雨数竞笔记-不定积分(7)-待定系数法

热门文章

  1. CentOS下搭建测试WEB平台
  2. eclipse使用不需要配置jdk的环境变量
  3. 代码风格研究:左花括号 是否换行???
  4. 使用git时提示Could not create directory #39;%USERPROFILE%/.ssh#39;.percent_expand:unkown key %U...
  5. 将Sublime Text 添加到鼠标右键菜单的教程方法
  6. 影响Unix多版 FTP曝严重远程执行漏洞
  7. ios::sync_with_stdio(true);
  8. SVM与feature
  9. (12) 需求征集 -- 序列管理、编号管理
  10. 某医院信息化硬件平台建设方案