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


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 的配置如下:

<?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"> 
<!--  规范 1:namespace 等于 mapper 接口路径  --> 
<mapper namespace="cn.itlaobing.mybatis.mapper.IUserInfoMapper"> 
  <!--  规范 2:id 的值必须和 mapper 接口中的方法名称相同  --> 
  <!--  规范 3:parameterType 的类型必须与 mapper 接口方法的输入参数类型相同  --> 
  <!--  规范 4:resultType 的类型必须与 mapper 接口方法的返回值类型相同  --> 
  <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 就是代理对象。
    在这里插入图片描述
    动态代理查询数据时,调用 sqlSession.selectOne()和 sqlSession.selectList()是根
    据 mapper 接口方法的返回值决定,如果返回 list 则调用 selectList 方法,如果
    返回单个对象则调用 selectOne 方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值