UserMapper.xml文件
- 注意:相关注意事项在原始dao开发中已经提及,此篇主要为对mapper代理开发的知识点
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址
-->
<mapper namespace="com.shagou.mybaits.mapper.UserMapper">
<!-- 在映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过select执行数据库查询
id:标识映射文件中的sql
将sql语句封装到mappedStatement对象中,所以将id称为Statement的id
parameterType:指定输入参数的类型,这里指定int型
#{}表示一个占位符号
#{id}:其中的id表示接收输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意
可以value或其他名称
resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成java对象
-->
<select id="findUserById" parameterType ="int" resultType="user"><!-- 引用别名 -->
SELECT * FROM USER WHERE id=#{id}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定的就是单条记录所映射的Java对象类型
${}:拼接字符串,但是会造成sql注入风险
-->
<select id = "findUserByName" parameterType = "String" resultType = "user">
SELECT * FROM USER WHERE name LIKE #{name}
</select>
<!-- 添加用户信息
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}中指定pojo的属性名,接收到pojo对象的属性值,mybaits通过OGNL获取对象的属性值
-->
<insert id="insertUser" parameterType = "user" >
<!-- 将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID():得到insert进去记录的主键值,只适用于自增主键
KeyProperty:将查询到主键值设置到parameterType指定的对象的那个属性
order:LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定LAST_INSERT_ID()结果类型
-->
<selectKey keyProperty = "id" order="AFTER" resultType = "Integer">
SELECT LAST_INSERT_ID()
</selectKey>
<!-- 非主键的id获取方式
使用mysql的uuid()生成主键
执行过程:
首先通过uuid()得到主键,将主键设置到user对象的id属性中
其次在insert执行时,从user对象中取出id属性值
<selectKey keyProperty = "id" order = "BEFORE" resultType = "String">
SELECT uuid()
</selectKey>
insert into user(id,name,birthday,sex,address) value(#{id},#{name},#{birthday},#{sex},#{address})
-->
insert into user(name,birthday,sex,address) value(#{name},#{birthday},#{sex},#{address})
</insert>
<!-- 删除用户
根据id删除用户,需要输入id值
-->
<delete id = "deleteUser" parameterType = "Integer">
delete from user where id = #{id}
</delete>
<!-- 更新用户
分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意:id必须存在
#{id}:从输入的user对象中获取id属性值
-->
<update id = "updateUser" parameterType ="user">
update user set name=#{name},birthday=#{birthday},sex=#{sex},address=#{address}
where id = #{id}
</update>
<!-- 用户信息的综合查询
{userCustom.sex}:取出pojo包装对象的性别
-->
<select id = "findUserList" parameterType = "UserQueryVo" resultType = "UserCustom">
select * from user where user.sex = #{userCustom.sex} and user.name like '%${userCustom.name}%'
</select>
</mapper>
加载xml文件
<!-- 通过resource方法加载单个映射文件 -->
<!-- 通过mapper接口加载
规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中(一个包中且同名)
上边规范的前提是:使用的是mapper代理方法
-->
<mapper class = "com.shagou.mybaits.mapper.UserMapper"/>
<!-- 批量加载
指定mapper接口的包名,mybaits自动扫描
规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中(一个包中且同名)
上边规范的前提是:使用的是mapper代理方法
-->
<!-- <package name = "com.shagou.mybaits.mapper"/> -->
UserMapper抽象接口类
注意:使用mapper代理需满足以下要求
- 1、UserMapper.java接口中的方法名和mapper.xml中statement的id一致
- 2、UserMapper.java接口中的输入参数类型和mapper.xml中Statement的parameterType指定的类型一致
- 3、UserMapper.java接口中的方法返回值类型和mapper.xml中Statement的resultType指定的类型一致
public interface UserMapper {
/* //根据id查询用户信息
public User findUserById(int id) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;*/
//根据id查询用户信息
//1、UserMapper.java接口中的方法名和mapper.xml中statement的id一致
//2、UserMapper.java接口中的输入参数类型和mapper.xml中Statement的parameterType指定的类型一致
//3、UserMapper.java接口中的方法返回值类型和mapper.xml中Statement的resultType指定的类型一致
public User findUserById(int id) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;
//用户信息的综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
}
直接进行测试
private SqlSessionFactory SqlSessionFactory;
@Before
public void setUp() throws Exception{
//mybaits配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybaits的配置文件信息
SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = SqlSessionFactory.openSession();
//创建UserMapper对象,mybaits自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//SqlMapConfig加载映射文件
//调用userMapper方法
User user = userMapper.findUserById(2);
sqlSession.close();
System.out.println(user);
}
//用户信息的综合查询
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = SqlSessionFactory.openSession();
//创建UserMapper对象,mybaits自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//SqlMapConfig加载映射文件
//创建包装对象,设置查询条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("男");
userCustom.setName("小");
userQueryVo.setUserCustom(userCustom);
//调用userMapper方法
List<UserCustom> list = userMapper.findUserList(userQueryVo);
sqlSession.close();
System.out.println(list);
}