MyBatis关于Mapper代理开发


Mapper代理开发

  • 目的:

  • 解决原生方式中的硬编码

  • 简化后期执行SQL

Mapper代理开发的步骤

  1. 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

  2. 设置SQL映射文件的namespace属性为Mapper接口全限定名

  3. 在Mapper接口中定义方法,方法名就是SQL映射文件sql语句的id,并保持参数类型和返回值类型一致

  4. 编码

    1. 通过 SqlSession的getMapper方法获取 Mapper接口的代理对象

    2. 调用对应方法完成sql的执行

细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。

获取SqlSession,获取mapper接口,接口下面有个同名映射文件,通过.selectAll()方法调用,找到文件对应的id获取对应的sql语句。返回值是list。

Mapper代理开发(出现问题请看MyBatis第一个项目)

  1. 在src中com.uestc.mapper下面创建一个UserMapper接口

package com.uestc.mapper;
?
import com.uestc.pojo.User;
?
import java.util.List;
?
public interface UserMapper {
?
    List selectAll();
}
  1. 在src的resources下面创建一个UserMapper.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="com.uestc.mapper.UserMapper">
    <select id="selectAll" resultType="com.uestc.pojo.User">
        select *
        from tb_user;
    select>
?
mapper>
  1. 在com.ustc.pojo下面创建一个User类

//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;
    }
?
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}
  1. 在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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            dataSource>
        environment>
    environments>
    <mappers>
        

?
        
        <package name="com.uestc.mapper"/>
?
    mappers>
configuration>
  1. 在com.uestc下面创建一个测试类MyBatisDemo2

/**
 * MyBatis 代理开发
 */
public class MyBatisDemo2 {
?
    public static void main(String[] args) throws IOException {
        //1. 加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
?
?
        //2. 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
?
        //3. 执行sql
        //List users = sqlSession.selectList("test.selectAll");
        //3.1 获取UserMapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List users = userMapper.selectAll();
?
        System.out.println(users);
?
        //4. 释放资源
        sqlSession.close();
?
?
    }
}