此案例沿用mybatis开发原始dao的结果
分析
mapper代理方法要生成一个代理对象,代理对象内部执行的方法内容类似原始dao开发的dao实现类。
mapper代理类方法主要是对调用sqlsession的方法进行封装,如下:
sqlSession.selectOne("test.findUserById", id)
sqlSession.selectList("test.findUserByName", "张")
sqlSession.insert("test.insertUser", user);
对以上代码进行哪些封装?
什么时候调用sqlSession 的selectOne方法、什么时候调用sqlSession 的selecList方法,什么时候 调用insert……
解决方法:可以根据映射文件中标签类型一决定是执行select方法还是执行insert方法等。
硬编码的statement的id如何封装?
解决方法:要解决映射文件中statement和mapper接口的方法的对应关系,在生成的代理对象方法中就知道该 代理对象的方法对应去调用哪个映射文件中statement。
开发规范(四个)
mybatis要解决映射文件中statement和mapper接口的方法对应起来。
可以遵循一个开发规范让statement和mapper接口的方法对应起来:
1、映射文件和mapper接口类的对应
映射文件中namespace等于mapper接口类路径
第一步:在src下创建一个mapper包并创建接口类
第二步:在config下创建一个mapper文件夹,并创建与接口类同名的映射文件
2、statement和mapper接口的方法对应
将映射文件中statement的id和mapper中方法名一致
3、让mapper的接口方法的输入参数类型和statement的parameterType指定的参数类型保持一致
4、让mapper的接口方法返回值类型和statement的resultType指定的类型保持一致
代码实现
- 映射文件
<?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映射文件,里面是以sql语句为单位进行配置,最终将sql语句封装到MappedStatement对象中
namespace:命名空间的作用是更好的对sql语句进行隔离,方便管理sql
注意:mybatis的mapper代理开发方式时namespace的特殊作用如下:
namespace等于mapper接口类路径,这样通过映射文件找到对应的mapper接口类
-->
<mapper namespace = "com.bsw.mybatis.mapper.UserMapper">
<!--
根据用户id查询用户信息
select:主要用于查询,配置sql语句、输入参数的类型,输出结果的类型
最终该select标签中所配置的内容会封装到MapperedStatement对象中,可以讲该select称之为statement
id:是唯一标识namespace下的sql语句,也是statement的id
parameterType:指定输入参数的类型(简单类型\POJO类型)
#{}:表示一个占位符
#{value}:value表示接收一个输入参数的值,如果要接收的输入参数是简单类型,#{}里面可以写value或其他名称
resultType:将sql查询的结果集映射成java对象
*号会查询回很多个列的信息,所以需要将结果集封装到一个POJO类中,这个POJO中的属性名称必须与数据表的列名相等
指定单条记录所映射的java对象
-->
<select id="findUserById" parameterType="int" resultType="com.bsw.domain.User">
SELECT * FROM USER WHERE id = #{id}
</select>
</mapper>
- 接口类
public interface UserMapper {
// 根据用户id查询用户信息
public User findUserById(int id);
}
- 将映射文件添加到SqlMapConfig.xml中,由SqlMapConfig.xml全局配置文件加载Mapper.xml文件
测试
package com.bsw.daoTest;
import static org.junit.Assert.*;
import java.io.InputStream;
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 org.junit.Before;
import org.junit.Test;
import com.bsw.domain.User;
import com.bsw.mybatis.mapper.UserMapper;
public class UserMapperTest {
// 创建成员变量会话工厂
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
// 配置全局配置文件
String resource = "SqlMapConfig.xml";
// 创建mybatis的全局配置文件的流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() {
// 创建会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 生成代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper
User user = mapper.findUserById(1);
System.out.println(user);
}
}