案例源码见此处
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的类型相同
1、Mapper.xml文件定义
定义mapper映射文件UserMapper.xml(内容同Users.xml),需要修改namespace的值为 UserMapper接口路径。如下:
<?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="edu.zju.cst.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int"
resultType="edu.zju.cst.pojo.User">
select * from user where id = #{id}
</select>
<!-- 自定义条件查询用户列表 -->
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="edu.zju.cst.pojo.User">
select * from user where username like '%${value}%'
</select>
<!-- 添加用户 -->
<insert id="insertUser"
parameterType="edu.zju.cst.pojo.User">
<selectKey keyProperty="id" order="AFTER"
resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
说明:
占位符KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}不同,通过{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值, 可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是value。
2、定义mapper接口
接口定义有如下特点:
1、Mapper接口方法名和Mapper.xml中定义的statement的id相同
2、Mapper接口方法的输入参数类型和Mapper.xml中定义的statement的parameterType的类型相同
3、Mapper接口方法的输出参数类型和Mapper.xml中定义的statement的resultType的类型相同
/**
* @Title: UserMapper.java
* @Package edu.zju.cst.mapper
* @author Zhao Qian
*/
package edu.zju.cst.mapper;
import java.util.List;
import edu.zju.cst.pojo.User;
/**
* @author Zhao Qian
* @date 2018年12月22日
* @version 1.0
*/
public interface UserMapper {
/**
* 根据用户id查询用户信息
* @param id
* @return
* @throws Exception
* @throws
* @author Zhao Qian
* @date 2018年12月22日
*/
User findUserById(int id) throws Exception;
/**
* 查询用户列表
* @param username
* @return
* @throws Exception
* @throws
* @author Zhao Qian
* @date 2018年12月22日
*/
List<User> findUserByUsername(String username) throws Exception;
/**
* 添加用户信息
* @param user
* @throws Exception
* @throws
* @author Zhao Qian
* @date 2018年12月22日
*/
void insertUser(User user)throws Exception;
}
3、加载mapper接口配置文件
在核心配置文件SqlMapConfig.xml文件中导入代理配置文件
<mappers>
<mapper resource="sqlmap/UserMapper.xml" />
</mappers>
4、测试
步骤:
1、获取session
2、获取接口代理对象
3、调用接口方法
@Test
public void testInsertUser() {
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获取mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//要添加的数据
User user = new User();
user.setUsername("张小明");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("杭州市");
//通过mapper接口添加用户
try {
userMapper.insertUser(user);
} catch (Exception e) {
e.printStackTrace();
}
//提交
session.commit();
//关闭session
session.close();
}
5、总结
- selectOne和selectList
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。
- namespace
mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。
上述几篇主要提供一个案例demo。
下一篇将具体总结整理关于配置文件的一些细节问题。