Mapper代理开发
- 目的
- 解决原生方式中的硬编码问题
- 简化后期执行SQL
使用Mapper代理开发完成快速入门案例
-
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
-
设置SQL映射文件的namespace属性为Mapper接口全限定名
-
在Mapper接口中定义方法,方法名就是SQL映射文件中SQL语句的id,并保持参数类型和返回值类型一致
-
编码
- 通过SqlSession的getMapper方法获取Mapper接口的代理对象
- 调用对应方法完成sql的执行
如果Mapper接口名称和SQL映射文件名相同,并在同一目录下,,则可以使用包扫描的方式简化SQL映射文件的加载
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
此时在resources文件目录下新建包时没有包结构,只能新建目录,因此,在目录命名中,无法使用“.”符号来进行文件层次结构划分。创建结果所见即所得。
即:
- 包结构(package):使用点号来进行层次划分 com.javaweb.mapper
- 目录结构(directory):使用反斜杠进行层次划分 com/javaweb/mapper
<img src="JavaWeb.assets/image-20211212232555954.png" alt="image-20211212232555954" style="zoom:50%;" />
此时src文件结构如图所示
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
更改xxxMapper.xml文件下的<mapper>标签中的namespace属性为java文件目录下的Mapper接口全限定名
<mapper namespace="test">
更改为
<mapper namespace="com.javaweb.mapper.t_studentMapper">
3.在Mapper接口中定义方法,方法名就是SQL映射文件中SQL语句的id,并保持参数类型和返回值类型一致
当我们知道映射文件中有id时,我们就应该意识到有同名的方法在接口中
对于SQL语句,我们应该意识到接口中的方法返回的是结果集而不是对象
package com.javaweb.mapper;
import com.javaweb.pojo.t_student;
import java.util.List;
public interface t_studentMapper {
List<t_student> selectAll();
}
注意:此时的xxxMapper.xml文件的位置发生了变化,被移入了包中,因此需要修改mybatis-config.xml文件中的mapper resources路径
在IDEA中对目标文件右键点击复制路径/引用,点击来自源根的路径,即可复制目标文件的路径并将其修改到mapper resources后
<mapper resource="com/javaweb/mapper/t_studentMapper.xml"/>
4.编码
此时的项目结构为:
<img src="JavaWeb.assets/image-20211213004615823.png" alt="image-20211213004615823" style="zoom:50%;" />
根据项目结构代码依次如下:
studentMapper.java
package com.javaweb.mapper;
import com.javaweb.pojo.student;
import java.util.List;
public interface studentMapper {
List<student> selectAll();
}
student.java
package com.javaweb.pojo;
public class student {
private String stuno;
private String stuname;
private String stusex;
public String getStuno() {
return stuno;
}
public void setStuno(String stuno) {
this.stuno = stuno;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public String getStusex() {
return stusex;
}
public void setStusex(String stusex) {
this.stusex = stusex;
}
@Override
public String toString() {
return "t_student{" +
"stuno='" + stuno + '\'' +
", stuname='" + stuname + '\'' +
", stusex='" + stusex + '\'' +
'}';
}
}
MapperTestDemo
package com.javaweb;
import com.javaweb.mapper.studentMapper;
import com.javaweb.pojo.student;
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 java.io.InputStream;
import java.util.List;
public class MapperTestDemo {
public static void main(String[] args) throws Exception{
//1.加载核心配置文件,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用它来执行sql(Ctrl+Alt+V快速生成返回对象)
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql,参数填写:名称空间.语句唯一标识
//3.1获取对应接口student.java的代理对象
studentMapper StuMapper = sqlSession.getMapper(studentMapper.class);
List<student> stu = StuMapper.selectAll();
System.out.println(stu);
//4.释放资源
sqlSession.close();
}
}
studentMapper.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">
<!--
namespace 名称空间
id SQL语句的唯一标识,不可重复
resultType 对应返回结果的数据类型
-->
<mapper namespace="com.javaweb.mapper.studentMapper">
<select id="selectAll" resultType="com.javaweb.pojo.student">
select * from student;
</select>
</mapper>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.javaweb" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="ZZXQJL@0916.com"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件-->
<mapper resource="com/javaweb/mapper/studentMapper.xml"/>
<!--等价于<package name="com.javaweb.mapper"/>-->
</mappers>
</configuration>
如果Mapper接口名称和SQL映射文件名相同,并在同一目录下,,则可以使用包扫描的方式简化SQL映射文件的加载
<mapper resource="com/javaweb/mapper/studentMapper.xml"/>
等价于
<package name = "com.javaweb.mapper"/>
包扫描的方式是将目标包下的所有映射文件加载进来
网友评论