Mybatis复杂映射&&映射文件

Mybatis_resultType&&resultMap属性

  1. resultType属性:如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中

  2. resultMap属性:如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中

  3. 编写UserMapper接口

    /**
     * 查询User表中所有用户的方法
     * */
    public List<User> findAllResultMap();
    
  4. 编写UserMapper.xml

    
    <!--id : 标签的唯一标识-->
    <!--type: 封装后实体类型-->
    <resultMap id="userResultMap" type="com.code.entity.User">
        <!--手动配置映射关系-->
        <!--id: 用来配置主键-->
        <id property="id" column="id"></id>
        <!-- result: 表中普通字段的封装-->
        <result property="username" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
    </resultMap>
    
    
    <!--查询所有用户-->
    <!--resultMap:手动配置实体属性与表中字段的映射关系,完成手动封装-->
    <select id="findAllResultMap" resultMap="userResultMap">
        select * from user
    </select>
    
  5. 编写测试代码

    /**
     * ResutlMap 手动封装属性测试方法
     * @throws IOException
     */
    @Test
    public void findAllResultMap() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> allResultMap = mapper.findAllResultMap();
        for (User user : allResultMap) {
            System.out.println(user);
        }
        sqlSession.close();
    
    }
    

Mybatis多条件查询方式一

根据id和username查询user表

方式一:使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数

  1. 编写 userMapper接口

    /**
     * 多条件连接查询方式一
     * */
    public List<User> findByIdAndUsername1(int id, String username);
    
  2. 编写 UserMapper.xml

    <!--多条件查询:方式一-->
    <select id="findByIdAndUsername1" resultMap="userResultMap" >
        <!-- select * from user where id = #{arg0} and username = #{arg1}-->
        select * from user where id = #{param1} and username = #{param2}
    </select>
    
  3. 编写测试代码

    /**
     * 多条件查询方式一
     */
    @Test
    public void findByIdAndUsername1() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.findByIdAndUsername1(1, "子慕");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    

Mybatis多条件查询方式二

根据id和username查询user表
方式二:使用注解,引入 @Param() 注解获取参数

  1. 编写UserMapper接口

    /**
     * 多条件查询方式二
     * @param id
     * @param username
     * @return
     */
    public List<User> findByIdAndUsername2(@Param("id") int id, @Param("username") String username);
    
  2. 编写UserMapper.xml

    <!--多条件查询:方式二-->
    <select id="findByIdAndUsername2" resultMap="userResultMap" >
        select * from user where id = #{id} and username = #{username}
    </select>
    
  3. 编写测试代码

    /**
     * 多条件查询:方式二
     * @throws IOException
     */
    @Test
    public void findByIdAndUsername2() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.findByIdAndUsername2(1, "子慕");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    

Mybatis多条件查询方式三

根据id和username查询user表
方式三:使用JavaBean对象传递参数

  1. 编写 UserMapper接口

    /**
     * 条件查询方式三
     * @param user
     * @return
     */
    public List<User> findByIdAndUsername3(User user);
    
  2. 编写 UserMapper.xml

    <!--多条件查询:方式三-->
    <select id="findByIdAndUsername3" resultMap="userResultMap" parameterType="com.code.entity.User">
        select * from user where id = #{id} and username = #{username}
    </select>
    
  3. 编写测试代码

    /**
     * 多条件查询:方式三
     * @throws IOException
     */
    @Test
    public void test5() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        User user1 = new User();
        user1.setId(1);
        user1.setUsername("子慕");
    
        List<User> users = mapper.findByIdAndUsername3(user1);
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    

Mybatis模糊查询方式一

根据username模糊查询user表

  1. 编写UserMapper接口

    /**
     * 模糊查询方式一
     * @param username
     * @return
     */
    public List<User> findByUsername(String username);
    
  2. 编写UserMapper.xml映射

    <!--模糊查询:方式一-->
    <select id="findByUsername" resultMap="userResultMap" parameterType="string">
        <!-- #{}在mybatis中是占位符,引用参数值的时候会自动添加单引号 -->
        select * from user where username like #{username}
    </select>
    
  3. 测试代码

    /**
     * 模糊查询方式一
     * @throws IOException
     */
    @Test
    public void test6() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        List<User> users = mapper.findByUsername("%子%");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.commit();
        sqlSession.close();
    }
    

Mybatis模糊查询方式二

根据username模糊查询user表

  1. 编写UserMapper接口

    /**
     * 模糊查询方式二
     * @param username
     * @return
     */
    public List<User> findByUsername2(String username);
    
  2. 编写 UserMapper.xml 映射

    <!--模糊查询:方式二-->
    <select id="findByUsername2" resultMap="userResultMap" parameterType="string">
        <!--parameterType是基本数据类型或者String的时候,${}里面的值只能写value
            ${}: sql原样拼接
        -->
        select * from user where username like '${value}'
    </select>
    
  3. 编写测试代码

    /**
     * 模糊查询 方式二
     * @throws IOException
     */
    @Test
    public void test7() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        List<User> users = mapper.findByUsername2("%子慕%");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    

${} 与 #{}区别

  1. #{} :表示一个占位符号:
    1. 通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
    2. #{} 可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值, #{} 括号中名称随便写。
  2. ${} :表示拼接sql串:
    1. 通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。
    2. ${} 可以接收简单类型值或pojo属性值
    3. 如果parameterType传输单个简单类型值, ${} 括号中只能是value。

Mybatis映射文件_添加用户:获取返回主键:方式一

返回主键:向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的主键值。

  1. 编写userMapper.

    /**
     * 添加用户:获取返回主键:方式一
     * @param user
     */
    public void saveUser(User user);
    
  2. 编写userMapper.xml配置文件

    <!--添加用户:获取返回主键:方式一-->
    <!--
        useGeneratedKeys: 声明返回主键
        keyProperty:把返回主键的值,封装到实体中的那个属性上
    -->
    <insert id="saveUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
    
  3. useGeneratedKeys=“true” 声明返回主键,只适用于主键自增的数据库,mysql和sqlserver支持,oracle不行。

  4. 编写测试代码

    /**
     * 添加用户返回主键:方式一
     * @throws IOException
     */
    @Test
    public void test8() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        User user = new User();
        user.setUsername("某冰冰");
        user.setBirthday(new Date());
        user.setAddress("北京昌平");
        user.setSex("女");
    
        System.out.println(user);
        mapper.saveUser(user);
        System.out.println(user);
    
        sqlSession.commit();
        sqlSession.close();
    
    }
    

Mybatis映射文件_添加用户:获取返回主键:方式二

  1. 编写 userMapper

    /**
     * 添加用户:获取返回主键:方式二
     * @param user
     */
    public void saveUser2(User user);
    
  2. 编写 userMapper.xml

    <!--添加用户:获取返回主键:方式二-->
    <insert id="saveUser2" parameterType="user" >
    
        <!--
            selectKey : 适用范围更广,支持所有类型的数据库
                order="AFTER"  : 设置在sql语句执行前(后),执行此语句
                keyColumn="id" : 指定主键对应列名
                keyProperty="id":把返回主键的值,封装到实体中的那个属性上
                 resultType="int":指定主键类型
        -->
        <selectKey order="AFTER" keyColumn="id" keyProperty="id" resultType="int">
            SELECT LAST_INSERT_ID();
        </selectKey>
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>
    
  3. 编写测试代码

    /**
     * 添加用户:返回主键方式二
     */
    @Test
    public void test9() throws IOException {
    
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
    
        // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        User user = new User();
        user.setUsername("汤唯");
        user.setBirthday(new Date());
        user.setAddress("北京昌平");
        user.setSex("女");
    
        System.out.println(user);
        mapper.saveUser2(user);
        System.out.println(user);
    
        sqlSession.commit();
        sqlSession.close();
    
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值