Mybatis系列(二)Mapper动态代理开发

一.Mapper动态代理开发概述

采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
1、Mapper.xml文件中的namespace与mapper接口的全类名相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。

二.Mapper动态代理开发测试代码

Mapper动态代理开发需要Mapper接口,XML配置。

Mapper接口UserMapper.java

public interface UserMapper {
    /*Mapper动态代理开发需要接口遵循四个原则
     * 1.方法名==User.xml中的id名
     * 2.返回值类型==User.xml中的返回值类型(如果是List集合,则调用selectList方法)
     * 3.参数类型==User.xml中的入参类型
     * 4.User.xml中的namespace==接口完整名称
     */

    public User findUserById(Integer id);
    public List<User> findUserByUsername(String username);
    public Integer insertUser(User user);
    public Integer updateUserById(User user);
    public Integer deleteUserById(Integer id);
}

XML配置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="cjx.mapper.UserMapper">
<!-- 通过ID查询一个用户 -->
<select id="findUserById" parameterType="Integer" resultType="cjx.pojo.User">
select * from user where id = ${value}
</select>
<!-- 根据用户名称模糊查询用户列表 -->
<select id="findUserByUsername" parameterType="String"  resultType="cjx.pojo.User">
select * from user where username like "%"#{v}"%"
</select>
<!-- 添加用户,并返回id -->
<insert id="insertUser" parameterType="cjx.pojo.User">
<selectKey  keyProperty="id" resultType="Integer" order="AFTER">
select last_insert_id()
</selectKey>
insert into user (username,password)  values(#{username},#{password})
</insert>
<!-- 修改用户 -->
<update id="updateUserById"  parameterType="cjx.pojo.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="Integer">
delete from user where id=#{ok}
</delete>


<!-- 以下注释为拓展内容 -->
<!-- 
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,
resultMap实质上与resultType相同需要将查询结果映射到pojo对象中。
<resultMap type="pojo的类型" id="id值,用于标识,在标签中引用id">
<id column="sql查询字段名" property="pojo的属性名"/>主键属性用id
<result column="sql查询字段名" property="pojo的属性名"/>基本类型属性用result
<association column="sql查询字段名" property="pojo的pojo属性"></association>对象引用类型用association
</resultMap>
注意:只需要将名称不同的字段配置即可
 -->

<!-- 
动态SQL:使用标签动态生成SQL语句
1.SQL片段:
增删改查标签外部定义SQL语句片段
<sql id="selectuser">
select * from user
</sql>
增删改查标签中引用SQL语句片段
<include refid="selectuser"/>
2.增删改查标签中的<where></where>标签
可以去掉第一个前and.(防止where后直接跟and)
3.增删改查标签中的<if test=""></if>标签
<if test="条件">语句</if>
4.增删改查标签中的<foreach collection=""></foreach>标签
<foreach collection="需要遍历的集合" item="循环变量" 
open="前置字符串(循环开始前加入前置字符串)" close="后置字符串(循环结束后加入后置字符串)" 
separator="隔点字符串(每次循环完成后加入隔点字符串,最后一次不加)">
需要循环的SQL语句
</foreach>
注意:collection中传入的参数应当可以表示参数类型
例如,pojo直接传入pojo类型的变量名;如果是数组,传入array;
如果是List集合,传入list。
Mybatis底层使用Map集合储存传入参数,并不调用传入参数,需要获取参数类型。
pojo直接传入pojo类型的变量名时,Mybatis可以通过变量名找到pojo
如果是数组或List集合,Mybatis不能通过变量名判断类型
 -->

<!-- 
关于多表操作查询:一对一关联,一对多关联
使用resultMap为SQL语句增加查询参数条件
然后使用<select id=""></select>标签执行SQL语句即可
关键是SQL语句,此处不演示
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据
 -->
</mapper>

测试代码MapperDemo.java

public class MapperDemo {
    @Test
    //Mapper动态代理开发演示
    public void fun() throws IOException {
        String resource = "mybatis.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获得Mapper,sqlSession自动生成实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //使用Mapper动态代理开发,我们可以直接调用接口定义的方法进行操作
        // 通过id查询
        System.out.println(mapper.findUserById(1));
        // 通过username模糊查询
//      System.out.println(mapper.findUserByUsername("啊"));
        // 添加用户
//      User user=new User();
//      user.setUsername("啊啊撒旦是");
//      user.setPassword("565498498");
//      mapper.insertUser(user);
//      System.out.println(user.getId());
//      sqlSession.commit();
        // 修改用户
//      User user=new User();
//      user.setId(10);
//      user.setUsername("sdfsdfs4444");
//      user.setPassword("66666666");
//      mapper.updateUserById(user);
//      sqlSession.commit();
        // 删除用户
//      System.out.println(mapper.deleteUserById(15));
//      sqlSession.commit();
    }
}

mybatis.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>
<properties resource="db.properties"/>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.Password}"/>
</dataSource>
</environment>
</environments>
<!-- Mapper的位置 只有配置了Mapper.xml,才能成功使用Mapper动态代理开发-->
<mappers>
<mapper resource="cjx/mapper/UserMapper.xml" />
</mappers>
</configuration >

POJO类

package cjx.pojo;

public class User {
    private Integer id;
    private String username;
    private String password;    
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
    }
    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;
    }
}

猜你喜欢

转载自blog.csdn.net/bestmy/article/details/81055851