mybatis(二).MyBatis的接口映射器规则

                                  MyBatis的接口映射器规则

目录

一.为什么要用接口映射器规则?

二.这个规则是什么?

三.实例

1.新建实体类

2.编写sql操作文件

3.编写对应接口。

4.测试

我们再来巩固下:


一.为什么要用接口映射器规则?

前面的一篇文章中,用户表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框架自动生成该接口的实现类),这样开发起来就清晰多了。

发布了45 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41968788/article/details/83963868