一.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;
}
}