Mybatis基于动态代理(接口开发)的CRUD

上一篇:Mybatis基础方式的CRUD

在上一篇中,我们测试了Mybatis基础方式的CRUD,在实际的开发中,更推荐mapper动态代理方式的CRUD(也称为基于接口方式的开发)。

硬编码方式配置方式约定
abc.javaabc.xmlinterface
Configuration conf = new Configuration();con.setName(“myProject”) ;<name>myProject</name>默认值就是myProject
String statement = “org.ltx.entity.personMapper”+".queryPersonById"; Person person = session.selectOne(statement, 1001);PersonMapper personMapper = session.getMapper(PersonMapper.class); personMapper.(方法);
配置mapper,调用时通过 namespace.id 的方式来定位SQL配置mapper,开发对应的接口,调用时通过 接口名.方法 定位到mapper.xml的SQL语句
相比基础方式,主要多了 开发接口 这个步骤,同时在调用时有区别。

mapper动态代理(接口开发)

原则:约定优于配置

具体实现的步骤:

1.基础环境:mybatis.jar/ojdbc.jar、conf.xml、mapper.xml

2.约定的目标:
省略掉statement,即根据约定 直接可以定位出SQL语句

a.接口,接口中的方法必须遵循以下约定:

*1.方法名和mapper.xml文件中标签的id值相同
*2.方法的 输入参数 和mapper.xml文件中标签的 parameterType类型一致 (如果mapper.xml的标签中没有 parameterType,则说明方法没有输入参数)
*3.方法的返回值 和mapper.xml文件中标签的 resultType类型一致 (无论查询结果是一个 还是多个(student、List<Person>),在mapper.xml标签中的resultType中只写 一个(Person);如果没有resultType,则说明方法的返回值为void)

b.接口名

除了以上约定,要实现 接口中的方法 和 Mapper.xml中SQL标签一一对应,还需要以下1点:
namespace的值 ,就是 接口的全类名( 接口 - mapper.xml 一一对应)(不区分大小写)

tips: 该接口不需要实现。

匹配的过程:(约定的过程)

1.根据 接口名 找到 mapper.xml文件(根据的是namespace=接口全类名)
2.根据 接口的方法名 找到 mapper.xml文件中的SQL标签 (方法名=SQL标签Id值)

以上2点可以保证: 当我们调用接口中的方法时,
程序能自动定位到 某一个Mapper.xml文件中的sqL标签

习惯:SQL映射文件(mapper.xml) 和 接口放在同一个包中 (注意修改conf.xml中加载mapper.xml文件的路径)

以上,可以通过接口的方法->SQL语句。

好处:在比较大的项目中,因为每条SQL语句的id值不同,基础的开发方式每次使用不同的SQL都需要写statement定位到对应的SQL语句再使用,而动态代理的方式,只需要配置好想个接口的方法,就能直接通过 接口,方法() 的方式直接使用。

代码:
部分代码可参照 上一篇:Mybatis基础方式的CRUD

personMapper.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">

<mapper namespace="org.ltx.mapper.PersonMapper">

	<select id="queryPersonById" parameterType="int" resultType="org.ltx.entity.Person">
		select * from person where id=#{id}
	</select>
	
	<select id="queryAllPerson" resultType="org.ltx.entity.Person">
		select * from person
	</select>

</mapper>

PersonMapper.java

package org.ltx.mapper;

import java.util.List;
import org.ltx.entity.Person;

/* 全类名:org.ltx.mapper.PersonMapper
 * 该全类名 即为 .xml文件中 namespace 的值
 * */
public interface PersonMapper {

	/*
	 * 方法名 = sql标签的id值
	 * 参数类型 = parameterType的类型
	 * 返回值 = resultType的类型(查询多个返回值时接口方法可以用list来处理)
	 * 
	 * */
	Person queryPersonById(int id);
	
	List<Person> queryAllPerson();
}

Test.java

package org.ltx.entity;


import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.ltx.mapper.PersonMapper;

public class Test {
	
	
	public static void main(String[] args) throws IOException {
		
		String resource = "config.xml";
		InputStream inputStream =	Resources.getResourceAsStream(resource);
		SqlSessionFactory factory =  new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession session = factory.openSession();
		
		
		/*基础方式调用*/
		String statement1 = "org.ltx.mapper.PersonMapper"+".queryPersonById";
		Person person1 = session.selectOne(statement1, 1001);
		System.out.println(person1);
		
		String statement2 = "org.ltx.mapper.PersonMapper"+".queryAllPerson";
		List<Person> persons1 = session.selectList(statement2);
		System.out.println(persons1);
		
		
		System.out.println("#########################");
		//动态代理,消除上述多次的statement
		
		/*动态代理方式调用接口*/
		PersonMapper personMapper = session.getMapper(PersonMapper.class);
		
		Person person2 = personMapper.queryPersonById(1001);
		System.out.println(person2);
		
		List<Person> persons2 = personMapper.queryAllPerson();
		System.out.println(persons2);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值