Mybatis(Mapper映射开发)

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值