MyBatis的接口映射器规则
目录
一.为什么要用接口映射器规则?
前面的一篇文章中,用户表User表的sql操作文件中的全部sql都放在SqlSession中,那么如果要编写另外一个表的sql操作文件也要写很多sql,写的多了名称难免混淆或者不好记,容易出错。那么,有没有一种规则我们可以针对每个表的sql操作文件,把它封装成一个组件,处理那个表就调用哪个表的相关组件。答案是肯定的,这个规则就是接口映射器规则,我们可以根据这个接口映射器规则来编写代码,根据此接口编写的接口(该接口的方法都没有实现),不用实现类。在运行时MyBatis框架自动生成该接口的实现类,我们从SqlSession中拿到该接口的实现类,可以直接调用该实现类的方法。
二.这个规则是什么?
1.将SQL定义文件<mapper>的namespace属性指定成包名.接口名
2.根据Sql定义的id属性当接口方法名
3.根据Sql定义的ParameterType类型当方法参数类型
4.根据Sql定义的resultType类型定义方法返回参数,注:返回结果是多行使用List<T>泛型;单行使用T,泛型
三.实例
现在开始实战吧,看看这个如何运用这个规则的,接下来我们在上篇文章搭建一个MyBatis项目 mybaits_demo1项目的基础上来做,当然了大家也可以再自己搭建一个,也可以参照那篇文章。
我们今天要对record表做操作,大家可以看看这个表的结构,如下图:
1.新建实体类
在com.cdd.entity包下新建一个实体类Record,代码如下:
package com.cdd.entity;
import java.io.Serializable;
public class Record implements Serializable {
private Integer record_id; //记录id
private Integer user_id; //用户id
private String remark; //备注
private Integer status; //笔记状态,0-初始化,1-正常,-1-移除
public Integer getRecord_id() {
return record_id;
}
public void setRecord_id(Integer record_id) {
this.record_id = record_id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String toString() {
return "Record [record_id=" + record_id + ", user_id=" + user_id + ", remark=" + remark + ", status=" + status
+ "]";
}
}
2.编写sql操作文件
在com.cdd.sql包下,编写Record表的sql操作文件RecordMapper.xml,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.cdd.dao.RecordDao">
<!-- 查询所有记录 -->
<select id="findAll" resultType="com.cdd.entity.Record">
select *
from record
</select>
</mapper>
可以看到上面代码中:
namespace值为,com.cdd.dao.RecordDao,即,我们要创建一个接口为com.cdd.dao.RecordDao。
这个sql的id值为,findAll,所以要在该接口中定义一个无实现的方法findAll()。
这个sql的resultType值为,com.cdd.entity.Record,即返回对象为Record类对象,又因为查询结果是多个,所以这个方法
findAll()的返回类型是List<Record>。
注:别忘了把这个sql操作文件在主配置文件中配置,如下图:
3.编写对应接口。
在com.cdd包下新建一个包dao,在com.cdd.dao包下新建一个接口RecordDao,并且编写对应的无实现方法,代码如下:
package com.cdd.dao;
import java.util.List;
import com.cdd.entity.Record;
public interface RecordDao {
public List<Record> findAll(); //查询所有记录
}
4.测试
现在来测试,在com.cdd.test包,新建一个类TestRecordDao,注意SqlSession用完要关闭,代码如下:
package com.cdd.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.cdd.dao.RecordDao;
import com.cdd.entity.Record;
import com.cdd.util.MyBatisUtil;
public class TestRecordDao {
public static void main(String[] args) throws Exception{
SqlSession session = MyBatisUtil.getSqlSession(); //获取SqlSession
RecordDao dao = session.getMapper(RecordDao.class); //获取组件
System.out.println(dao);
List<Record> recordList = dao.findAll(); //调用方法
for(Record r : recordList){
System.out.println(r);
}
session.close(); //关闭session
}
}
点击运行,查看控制台输出:
注:我之前在写Record实体类时,重写了该类的toString方法,所以打印时才能打印出这个类对象的详细内容。
我们再来巩固下:
现在要查该条记录属于user_id为4的记录,即根据用户id查询记录。
(1),编写RecordMapper.xml
给该文件添加一个selset查询,如下:
要在RecordDao接口中添加无实现方法findByUserId,入参int类型,返回类型为Record,请往下看。
(2).在接口RecordDao中添加方法
代码如下:
(3).测试
在TestRecordDao类中添加调用findByUserId方法。如下图:
查看控制台输出:
到这里MyBatis的映射器规则就说完了,以后要对其他表进行操作,编写对应的sql操作文件,我们同时可以编写对应的接口,调用时,用到那个表就用那个表对应的接口组件(实际上在运行时MyBatis框架自动生成该接口的实现类),这样开发起来就清晰多了。