> 文档中心 > JavaEE——MyBatis持久层框架(3)

JavaEE——MyBatis持久层框架(3)

目录

    • 1. Mapper 接口开发 dao
      • 1.1 Mapper 接口开发 dao 原理
      • 1.2 第一步:定义 Mapper.xml
      • 1.3 第二步:将 Mapper.xml 加载到配置文件
      • 1.4 第三步:定义 Mapper 接口
      • 1.5 第四步:单元测试

Mybatis 属于持久化层,因此 Mybatis 需要完成 dao 的开发。Mybatis 有两种方法开发dao,即原生 dao 开发和 Mapper 接口开发。
原生开发 dao 是指需要程序员编写 dao 接口和 dao 实现类。Mapper 接口开发 dao 是指需要程序员定义 Mapper 接口(相当于 dao 接口),由 Mybatis 框架根据 Mapper 接口的定义来创建 Mapper 接口的动态代理对象(相当于 dao 的实现类),由代理对象执行数据库操作。

1. Mapper 接口开发 dao

1.1 Mapper 接口开发 dao 原理

Mapper 接口开发 dao 是指需要程序员定义 Mapper 接口(相当于 dao 接口),由 Mybatis框架根据 Mapper 接口的定义来创建 Mapper 接口的动态代理对象(相当于 dao 的实现类),由代理对象执行数据库操作。
Mapper 接口开发需要遵循以下规范:

  1. Mapper.xml 文件中的 namespace 与 mapper 接口的路径相同。
  2. Mapper 接口方法名和 Mapper.xml 中定义的每个 mapper statement 的 id 相同
  3. Mapper 接口方法的输入参数类型和 Mapper.xml 中定义的每个 sql 的 parameterType的类型相同
  4. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同

Mapper 接口开发 dao 需要两步,一是定义 Mapper.xml 映射文件,映射文件的文件名可自定义,建议以表名称+Mapper 结尾;二是定义 Mapper 接口,建议使用表名称+Mapper 作为接口名。

1.2 第一步:定义 Mapper.xml

将 src/main/resources 目 录 下 创 建 映 射 文 件 , 命 名 为 userinfoMapper.xml , 并 将userinfoMapper.xml 加载 SqlMapConfig.xml 中,userinfoMapper.xml 的配置如下:

 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  <mapper namespace="cn.itlaobing.mybatis.mapper.IUserInfoMapper">            <select id="findUserInfoById" parameterType="int"     resultType="cn.itlaobing.mybatis.model.UserInfoModel">     select * from userinfo where id=#{id}      </select>      <select id="findAll" resultType="cn.itlaobing.mybatis.model.UserInfoModel">     select * from userinfo   </select>      <insert id="insertUserInfo" parameterType="cn.itlaobing.mybatis.model.UserInfoModel">     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select last_insert_id()     </selectKey>     insert into userinfo(userName,userPass,birthday,gender,address)     values(#{userName},#{userPass},#{birthday},#{gender},#{address});   </insert> </mapper> 

1.3 第二步:将 Mapper.xml 加载到配置文件

将 userinfoMapper.xml 加载到 SqlMapConfig.xml 配置文件中

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

1.4 第三步:定义 Mapper 接口

在项目的 src/main/java 中创建包 cn.itlaobing.mybatis.mapper,在该包下创建 Mapper 接口,命名为 IUserInfoMapper。

package cn.itlaobing.mybatis.mapper; import java.util.List; import cn.itlaobing.mybatis.model.UserInfoModel; /* 规范 1:mapper 接口路径等于 maper.xml 文件中的 namespace 的值 规范 2:mapper 接口中的方法名称与 mapper.xml 中 mapper statement id 的值必须相同   规范 3:mapper 接口方法的输入参数类型与 mapper.xml 中 mapper statement parameterType 的值必须相同 规范 4:mapper 接口方法的返回值类型与 mapper.xml 中 mapper statement resultType 的值必须相同 */ public interface IUserInfoMapper {   public UserInfoModel findUserInfoById(int id) throws Exception;   public List<UserInfoModel> findAll() throws Exception;   public void insertUserInfo(UserInfoModel model) throws Exception;   } 

1.5 第四步:单元测试

在 src/test/java 中的 com.xawl.mybatis.test 包中创建单元测试类,命名为 TestMapper,在 TestMapper 中编写单元测试方法。

package cn.itlaobing.mybatis.test; //省略导入包的代码 public class TestMapper {   //定义会话工厂对象 sqlSessionFactory   private SqlSessionFactory sqlSessionFactory = null;   @Before   public void setUp() throws IOException {     //  加载 MyBatis 配置文件     String resource = "SqlMapConfig.xml";     InputStream inputStream = Resources.getResourceAsStream(resource);     //  创建会话工厂,传入 mybatis 的配置文件信息     sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);   }   @Test   public void testFindUserInfoById() throws Exception {     SqlSession sqlSession = sqlSessionFactory.openSession();     //创建 IUserInfoMapper 对象,mybatis 自动生成 IUserInfoMapper 的代理对象     IUserInfoMapper userInfoMapper =  sqlSession.getMapper(IUserInfoMapper.class);     UserInfoModel model = userInfoMapper.findUserInfoById(1);     sqlSession.close();     System.out.println(model);   }   @Test   public void testFindAll() throws Exception {     SqlSession sqlSession = sqlSessionFactory.openSession();     //创建 IUserInfoMapper 对象,mybatis 自动生成 IUserInfoMapper 的代理对象     IUserInfoMapper userInfoMapper =  sqlSession.getMapper(IUserInfoMapper.class);     List<UserInfoModel> list = userInfoMapper.findAll();     sqlSession.close();     System.out.println(list);   }   @Test   public void testInsertUser() throws Exception {     SqlSession sqlSession = sqlSessionFactory.openSession();      //创建 IUserInfoMapper 对象,mybatis 自动生成 IUserInfoMapper 的代理对象     IUserInfoMapper userInfoMapper =  sqlSession.getMapper(IUserInfoMapper.class);     UserInfoModel model = new UserInfoModel();     model.setUserName("李应");     model.setUserPass("liying");     model.setBirthday(new Date());     model.setGender("男");     model.setAddress("山东聊城");     userInfoMapper.insertUserInfo(model);     sqlSession.commit();     sqlSession.close();   } } 
  1. 使用 Mapper 接口开发 dao 需要定义 Mapper.xml 映射文件和 Mapper 接口,并使得二者遵循 4 条规范,4 条规范的映射关系如下图所示:
    在这里插入图片描述

  2. 由于使用 mapper 代理方法时,输入参数必须与 Mapper.xml 中的parameterType 一致,而 parameterType 只能设置一个参数,因此 mapper 代理方法只能定义一个输入参数,可以使用 POJO 对象或 map 对象作为 mapper 代理方法的输入参数,以保证 dao 的通用性

  3. 使用 Mapper 接口开发 dao 只需定义 Mapper 接口,由 Mybatis 生成代Mapper 接口的
    代理对象,由理代理对象操作数据库。Mybatis 官方推荐使用 mapper 代理方法开发 mapper接口。调试程序,可发现 userInfoMapper 对象是代理对象,如下图所示,$Proxy4 就是代理对象。
    JavaEE——MyBatis持久层框架(3)
    动态代理查询数据时,调用 sqlSession.selectOne()和 sqlSession.selectList()是根
    据 mapper 接口方法的返回值决定,如果返回 list 则调用 selectList 方法,如果
    返回单个对象则调用 selectOne 方法。