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 之前执行
@Before
public void setUp() throws Exception{
//创建sqlSessionFactory // mybatis配置文件
String resource = "config/SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public 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 方法中建议不要使用包装类型。(不利于我们业务层的可扩展性)

  

Mybatis 开发 dao 的方法的更多相关文章

  1. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  2. 四 mybatis开发dao的方法

    mybatis开发dao的方法 1.1     SqlSession使用范围 1.1.1     SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...

  3. mybatis学习记录二——mybatis开发dao的方法

    4.1     SqlSession使用范围 4.1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...

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

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

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

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

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

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

  7. 02_mybatis开发dao的方法

    MyBatis开发dao的方法 1. SqlSession使用范围 1.1 SqlSessionFactoryBuilder ​ 通过SqlSessionFactoryBuilder创建会话工厂Sql ...

  8. 使用mybatis开发dao方法

    使用mybatis开发dao的时候, 主要涉及到SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession 这三个类 现在将这三个类的使用方法简单的说下 ...

  9. 11Mybatis_mybatis开发Dao的方法

    在介绍开发Dao的方法之前先介绍下SqlSession. 1.先介绍一下SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSess ...

随机推荐

  1. 金融BI是什么?为什么金融同行都在讨论这个!

    最近,我和金融行业的几位朋友聚会,觥筹交错之间听到最多的竟然是「金融BI」这个词!这可触及到我的知识盲区了,到底什么是金融BI呢? 朋友向我解释:BI商业智能是一种提高企业智能化的手段和工具,既可以满 ...

  2. 解决shell脚本错误$’r’ command not found

    从windows上传了一个脚本到Linux上执行 出现如下错误:$'\r': command not found这是windows与Unix文本编辑的默认格式不同造成的,需要转成unix格式. 解决方 ...

  3. Docker遇到的一些问题和感想

    Docker 是"不可变"架构. 当你希望改变一个服务的时候(比如更新版本.修改配置.开放端口),不允许直接登录到服务器上改变某个文件,而是应该把这个服务整个删掉,然后替换成新的版 ...

  4. 动态语言运行时(DLR)

    前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...

  5. C#帕斯卡命名法

    帕斯卡命名法 命名规则. 单字之间不以空格断开或 连接号 (-).底线(_)连结,第一个单词首字母采用 大写字母 :后续单词的首字母亦用大写字母,例如:FirstName.LastName.. 每一个 ...

  6. C++ 字符串 string

    1.使用前应先包含头文件string.h,有的是cstring #include<string> 这样才能正确的cin和cout字符串. cin时,是按照空格.TAB和换行进行分割的 例如 ...

  7. iOS实现组件录屏视频不可见,用户肉眼可见(类似系统键盘效果)

    系统键盘在密码框输入时,如果用户开启录屏,键盘在录屏得到的视频里会不可见,但是用户在录屏时却能看到. 为了实现这个效果,利用UItextfield在录屏下视频不可见的特性,将实现这一效果的私有UIvi ...

  8. Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析

    Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...

  9. RENIX软件连接机箱测试RTSM基本操作——网络测试仪实操

    本文主要介绍了RENIX软件RTSM功能连接机箱测试的基本操作.文章分为三部分内容,第一部分为RTSM功能简介,第二部分为RTSM原理简介,第三部分为RTSM测试方案的具体介绍. 第一部分.RTSM功 ...

  10. (六)React Ant Design Pro + .Net5 WebApi:后端环境搭建-EF Core

    一. 简介 EFCore 是轻量化.可扩展.开源和跨平台版的常用数据访问技术,走你(官方文档) 二. 使用 1.安装数据库驱动包.PMC 工具包 不同的数据库有不同的包,参考,我用 PostgreSQ ...