MyBatis学习教程之开发Dao的方法教程

简介

使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。下面话不多说,来一起看看详细的介绍:

主要概念介绍:

MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。

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

1、SqlSessionFactoryBuilder

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

2、SqlSessionFactory

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

3、SqlSession

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

  SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象),SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性,SqlSession最佳应用场合在方法体内,定义成局部变量使用,绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。

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

如下:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

原始Dao开发方式

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

还是以前文提到的简单的增删改查为例,来简单介绍原始Dao开发方式。

1、映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="user">
 <!-- 根据id获取用户信息 -->
 <select id="findUserById" parameterType="int" resultType="user">
  select * from user where id = #{id}
 </select>
 <!-- 根据username模糊查询用户信息 -->
 <select id="findUserByName" parameterType="java.lang.String" resultType="com.luchao.mybatis.first.po.User">
  select * from user where username like '%${value}%'
 </select>
 <!-- 添加用户信息 -->
 <insert id="insertUser" parameterType="com.luchao.mybatis.first.po.User">
  <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
   select LAST_INSERT_ID()
  </selectKey>
  insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address});
 </insert>
 <!-- 根据id删除用户信息 -->
 <delete id="deleteUser" parameterType="int">
  delete from user where id=#{id}
 </delete>
 <!-- 修改用户信息 -->
 <update id="updateUser" parameterType="com.luchao.mybatis.first.po.User">
  update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  where id=#{id}
 </update>
</mapper>

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;
}

3、Dao接口实现类

public class UserDaoImpl implements UserDao{

 // 需要向dao实现类中注入SqlSessionFactory
 // 这里通过构造方法注入
 private SqlSessionFactory sqlSessionFactory;

 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
  super();
  this.sqlSessionFactory = sqlSessionFactory;
 }
 @Override
 public void deleteUser(int id) throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  //执行删除操作
  sqlSession.insert("user.deleteUser", id);
  // 提交事务
  sqlSession.commit();
  // 释放资源
  sqlSession.close();
 }
 @Override
 public User findUserById(int id) throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();//获取sqlSession
  User user = sqlSession.selectOne("user.findUserById", id);
  sqlSession.close();//关闭资源
  return user;
 }
 @Override
 public void insertUser(User user) throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  //执行插入操作
  sqlSession.insert("user.insertUser", user);
  // 提交事务
  sqlSession.commit();
  // 释放资源
  sqlSession.close();
 }
}

4、测试代码:

public class MyBatis_dao_test {
 private SqlSessionFactory sqlSessionFactory;
 @Before
 public void init() throws IOException{
  //创建sqlSessionFactory
  //MyBatis配置文件
  String resource = "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的方法,根据ID查找user
  User user = userDao.findUserById(10);
  //打印客户信息
  System.out.println(user);
 }
}

5、原始Dao方法总结:

  (1)、dao接口实现类方法中存在大量模板方法,如:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法。

  (2)、调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码。

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

Mapper动态代理方式

1、实现原理

  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的类型相同。

2、Mapper.xml(映射文件)

映射文件与原始Dao开发的映射文件相似,只需要将namespace定于为mapper接口全路径。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.luchao.mybatis.first.mapper.UserMapper">
 <!-- 根据id获取用户信息 -->
 <select id="findUserById" parameterType="int" resultType="user">
  select * from user where id = #{id}
 </select>
 <!-- 根据username模糊查询用户信息 -->
 <select id="findUserByName" parameterType="java.lang.String" resultType="com.luchao.mybatis.first.po.User">
  select * from user where username like '%${value}%'
 </select>
 <!-- 添加用户信息 -->
 <insert id="insertUser" parameterType="com.luchao.mybatis.first.po.User">
  <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
   select LAST_INSERT_ID()
  </selectKey>
  insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address});
 </insert>
 <!-- 根据id删除用户信息 -->
 <delete id="deleteUser" parameterType="int">
  delete from user where id=#{id}
 </delete>
 <!-- 修改用户信息 -->
 <update id="updateUser" parameterType="com.luchao.mybatis.first.po.User">
  update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  where id=#{id}
 </update>
</mapper>

3、Mapper.java(接口文件)

public interface UserMapper {
 //根据ID查询用户信息
 public User findUserById(int id) throws Exception;
 //添加用户信息
 public void insertUser(User user) throws Exception;
 //删除用户信息
 public void deleteUser(int id) throws Exception;
 //更新用户信息
 public void updateUser(User user) throws Exception;
 //根据用户名模糊查找
 public List<User> findUserByName(String user) throws Exception;
}

接口定义有如下特点:

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

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

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

4、加载UserMapper.xml文件

在SqlMapConfig.xml文件中加载UserMapper.xml,如下:

 <mappers>
  <mapper resource="mapper/UserMapper.xml"/>
 </mappers>

5、测试代码:

public class MyBatis_mapper_test {
 private SqlSessionFactory sqlSessionFactory;
 @Before
 public void init() throws IOException{
  //创建sqlSessionFactory
  //MyBatis配置文件
  String resource = "SqlMapConfig.xml";
  //得到配置文件流
  InputStream inputStream = Resources.getResourceAsStream(resource);
  //创建会话工厂,传入MyBatis的配置信息
  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 }
 @Test
 public void testFindUserById() throws Exception{
  //获取sqlSession对象
  SqlSession sqlSession = sqlSessionFactory.openSession();
  //创建UserMapper对象,MyBatis自动生成mapper代理
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  //调用userMapper的方法
  User user = userMapper.findUserById(10);
  //关闭资源
  sqlSession.close();
  //打印客户信息
  System.out.println(user);
 }
}

5、Mapper动态代理总结:

  (1)、动态代理对象调用sqlSession.selectOne()sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

  (2)、使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。在系统中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。

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

mybatis开发dao的方法有两种:原始Dao开发和Mapper动态代理开发,这两种各有优点。原始Dao开发:程序员要写Dao和Dao实现,需要些较多的代码,但是比较好理解。Mapper动态代理:程序员只需要写Mapper接口,然后按照规范进行配置,MyBatis就会自动实现类似Dao实现,减少模板方法。mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

    SqlSessionTemplate SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用. 当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的.此外,它管理session的生命周期,包

  • 对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点:无需清空无关数据:缺点:单元测试中需要进行数据库初始化过程,如果初始化过程复杂,单元测试工作量增大 使用dbunit.优点:数据库初始化简单,大大减轻单元测试工作量:缺点:目前官方提供jar包只支持xml格式文件,需要自己开发Excel格式文件 基于dbunit进行DAO单元测试 应用环境:Spri

  • Mybatis中通过generator生成mapper、Dao、mapper.xml的方法

    1.将如下东西复制到项目中,或某一个文件夹. 2.更改generator.xml (1)更改数据驱动包的位置,选择你所安装的目录: (2)更改你所要连接的数据库的名称,数据库的user和password (3)更改下图 targetPakage的地方,targetProject的地方,这里targetProject所在的地方一定要存在 要不然会报错 (4)在tableName中填写你所要填写的表名.domainObjectName填写你想要生成的名字. 3.进入命令行窗口运行: 1.进入项目 的

  • MyBatis实践之DAO与Mapper

    MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如注册驱动.设置参数.创建Connection/Statement.解析结果集等JDBC过程性代码.MyBatis基于XML/注解的方式配置Statement,执行SQL,并将执行结果映射成Java对象, 大大降低了数据库开发的难度. MyBatis is a first class pers

  • 详解MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig.xml 里面代码为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

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

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao,通常有两种方法,即原始Dao开发方法和Mapper接口开发方法. 1.SqlSession使用范围 1.1 SqlsessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBu

  • MyBatis学习教程之开发Dao的方法教程

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.下面话不多说,来一起看看详细的介绍: 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession. SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等.通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过

  • CentOS 7下配置Ruby语言开发环境的方法教程

    本文跟大家分享的是在CentOS 7下配置Ruby语言开发环境的方法教程,分享出来供大家参考学习,下面来看看详细的介绍: 安装Ruby 2.2 CentOS7存储库中的Ruby版本为2.0,但如果需要,可以使用RPM软件包安装2.2 1.添加CentOS SCLo软件集合存储库 [root@linuxprobe ~]# yum -y install centos-release-scl-rh centos-release-scl # set [priority=10] [root@linuxpr

  • 使用Docker快速搭建Oracle开发环境的方法教程

    前言 oracle太大了,对于开发人员来说,在本机安装一个oracle代价不菲. 在docker环境中,我找了很久,发现wnameless/oracle-xe-11g 镜像还不错,很方便搭建起来. 但是也发现一个问题,挂载本地卷遇到了麻烦.一旦挂载,就无法登陆了.从官方的issues中发现,有一个fork版本解决了这个问题,记录一下. 创建docker-compose工作目录 mkdir -p oracle/data cd oracle touch docker-compose.yml 配置do

  • MyBatis学习教程(五)-实现关联表查询方法详解

    一.一对一关联  1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR() ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VAR

  • MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题

    在项目开发中,我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的情况,下面小编给大家演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突问题,感兴趣的朋友一起学习吧. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, or

  • mybatis generator 使用方法教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis generator的使用. 现在项目写完了,闲暇之余把干货奉上,供大家直接使用. 需求场景: 当你的java 项目数据库有N张表需要使用mybatis进行数据库操作时,建议使用mybatis generator 自动生成工具.可以自动帮助你生成java实体类.dao.mapper.xml等. 首先给大家分享

  • MyBatis开发Dao层的两种方式实现(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方式) 本次使用的mybatis版本为mybatis-3.2.7,开发工具为eclipse,数据库为mysql,jdk版本jdk1.8.0_151. SqlSession使用范围 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlS

  • 详解MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路

  • MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作

    上一篇文章MyBatis入门学习教程(一)-MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对users表执行CRUD操作.在没奔主题之前,先给大家补充点有关mybatis和crud的基本知识. 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBa

  • Spring boot集成Mybatis的方法教程

    本章目标 整合 Mybatis ,并集成 Druid 数据源 可视化监控 Druid 数据源 使用 JPA 生成数据表 利用注解实现数据库的事物 利用注解动态配置数据源 全局异常捕获 校验请求参数,并将错误信息以JSON 格式返回 完成了对 Dao Service Mapper 的封装 集成 log4j2 为何 Mybatis 为何选择 Mybatis,最主要的原因大概有以下几点 它的动态绑定用起来特别爽 基本上是在写原生的 SQL 语句,看着也是很舒服,如果 SQL 写得好的话,后期维护什么的

随机推荐