Mapper代理开发
- 一. Mapper代理开发概述
- 二. 使用Mapper代理要求(重点中的重点)
- 三. 实操的代码
- main目录下的java目录中
- 1. UserMapper接口
- 2. User类
- 3. MybatisDemo类
- main目录下的resources目录中
- 1. UserMapper.xml
- 2. logback.xml
- 3. mybatis.xml
一. Mapper代理开发概述
之前我们写的代码是基本使用方式,它也存在硬编码的问题,如下
这里调用 selectList() 方法传递的参数是映射配置文件中的 namespace.id值。这样写也不便于后期的维护。
如果使用Mapper 代理方式(如下图)则
不存在硬编码问题
- 通过上面的描述可以看出 Mapper 代理方式的目的:
- 解决原生方式中的硬编码
- 简化后期执行SQL
- Mybatis 官网也是推荐使用Mapper代理的方式下图是截止官网的图片:
二. 使用Mapper代理要求(重点中的重点)
使用Mapper代理方式,必须满足以下要求:
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
。如下图:
设置SQL映射文件的namespace属性为Mapper接口全限定名
在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致(查询语句多个则是List集合查询,单个那么就是user对象咯)
-
注意注意!!!
mybatis配置文件下的映射器路径需要改
- 注意:
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
。也就是将核心配置文件的加载映射配置文件的配置修改为
- 最终获取代理"Mapper"
执行结果:
代码:
package com.sgs;import com.sgs.mapper.UserMapper;
import com.sgs.pojo.User;
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.IOException;
import java.io.InputStream;
import java.util.List;public class MybatisDemo {public static void main(String[] args) throws IOException {
// 1. 加载mybatis的核心配置文件,获取SqlSessionFactoryString resource = "mybatis.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取SqlSession对象,用它来执行sqlSqlSession sqlSession = sqlSessionFactory.openSession();// 3. 执行sql,查询所有是"selectList()方法" 一个是...one//List<User> users = sqlSession.selectList("test.selectAll");//3.1 获取UserMapper接口的代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectAll();System.out.println(users);// 4. 释放资源sqlSession.close();}
}
三. 实操的代码
main目录下的java目录中
1. UserMapper接口
路径:com\sgs\mapper\UserMapper.java
package com.sgs.mapper;import com.sgs.pojo.User;import java.util.List;public interface UserMapper {List<User> selectAll();
}
2. User类
路径:com\sgs\pojo\User.java
package com.sgs.pojo;// alt + 鼠标左键 整列编辑
public class User {private Integer id;private String username;private String password;private String gender;private String addr;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", gender='" + gender + '\'' +", addr='" + addr + '\'' +'}';}
}
3. MybatisDemo类
路径:com\sgs\MybatisDemo.java
package com.sgs;import com.sgs.mapper.UserMapper;
import com.sgs.pojo.User;
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.IOException;
import java.io.InputStream;
import java.util.List;public class MybatisDemo {public static void main(String[] args) throws IOException {
// 1. 加载mybatis的核心配置文件,获取SqlSessionFactoryString resource = "mybatis.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 获取SqlSession对象,用它来执行sqlSqlSession sqlSession = sqlSessionFactory.openSession();// 3. 执行sql,查询所有是"selectList()方法" 一个是...one//List<User> users = sqlSession.selectList("test.selectAll");//3.1 获取UserMapper接口的代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectAll();System.out.println(users);// 4. 释放资源sqlSession.close();}
}
main目录下的resources目录中
1. UserMapper.xml
路径:com\sgs\mapper\UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--名称空间-->
<mapper namespace="com.sgs.mapper.UserMapper"><select id="selectAll" resultType="com.sgs.pojo.User">select * from tb_user;</select>
</mapper>
2. logback.xml
路径:logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--名称空间-->
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--CONSOLE :表示当前的日志信息是可以输出到控制台的。--><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern></encoder></appender><logger name="com.sgs" 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>
3. mybatis.xml
路径:mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://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.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="o676448"/></dataSource></environment></environments><mappers>
<!-- 映射器 -->
<!-- <mapper resource="com/sgs/mapper/UserMapper.xml"/>--><!-- 包扫描的方式简化SQL映射文件的加载 此时是属于接口的包路径,并且注意分隔符的写法--><package name="com.sgs.mapper"/></mappers></configuration>