Mapper代理开发概述 之前我们写的代码是基本使用方式,它也存在硬编码的问题,如下:
List<Student> students =sqlSession.selectList("test.selectAll");//这里的参数为sql映射文件中namespace的值和id的值
System.out.println(students);
通过上面的描述可以看出 Mapper 代理方式的目的: 解决原生方式中的硬编码 简化后期执行SQL Mybatis 官网也是推荐使用 Mapper 代理的方式。
学习使用代理开发解决硬编码问题
使用Mapper代理方式,必须满足以下要求:
1:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。
使用Maven,的compile。一编译就可以看到是不是在一个文件路径下
注意在 resources 下创建 com/itheima/mapper 目录 要用斜杆,虽然会显示的是小点,但是编译后就会有层级。
2:设置SQL映射文件的namespace属性为Mapper接口全限定名
<?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">
<!--
namespace:名称空间,必须是对应接口的全限定名
resultType 是你创建的实体类名称
select id :是唯一标识,一会在执行sql的时候会用到
-->
<mapper namespace="com.chen.mapper.stuMapper">
<select id="selectAll" resultType="com.chen.pojo.Student">
select * from stu;
</select>
</mapper>
3 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
package com.chen.mapper;
import com.chen.pojo.Student;
import java.util.List;
public interface stuMapper {
List<Student> selectAll(); //根据你的sql语句判断,如果返回多个就要用集合装
//Student selectAll(); 如果是返回单个对象直接这样写就完事
}
测试一下
//mybatis的代理开发
public class D2Test {
public static void main(String[] args) throws Exception {
//加载mybatis核心配置文件,获取sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlSession对象,用他执行sql
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行sql 获取stuMapper接口的代理对象
stuMapper stuMapper= sqlSession.getMapper(stuMapper.class);
List<Student> studentList=stuMapper.selectAll();
System.out.println(studentList);
sqlSession.close();//释放资源
}
}
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就 是将核心配置文件的加载映射配置文件的配置修改为
<mappers>
<!-- 加载sql映射文件-->
<!-- <mapper resource="com/chen/mapper/stuMapper.xml"/> -->
<!-- Mapper 代理方式 用包扫描的方式加载映射文件-->
<package name="com.chen.mapper"/>
</mappers>
学生实体类
package com.chen.pojo;
public class Student {
private int id;
private String name;
private String className;
public Student(int id, String name, String className) {
this.id = id;
this.name = name;
this.className = className;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", className='" + className + '\'' +
'}';
}
}