MyBatis 单表查询


MyBatis 单表查询

1. resultMap 标签

  • 如果数据库返回结果的列名和要封装的实体的属性名完全一致的话用 resultType 属性
  • 如果数据库返回结果的列名和要封装的实体的属性名有不一致的情况用 resultMap 属性
    • 使用 resultMap 可以 手动建立对象关系映射
      在这里插入图片描述

a. UserMapper 接口

    // ResultMap标签
    public List<User> findAllResultMap();

b. UserMapper.xml

    <!--
    resultMap 手动建立映射
        id="userResultMap"
        type="User" 建立映射的Java类型
    id 标签 主键
        column="uid" 列名
        property="id" 实体属性名
   result 标签 普通字段
        column="name" 列名
        property="username" 实体属性名
-->
    <resultMap id="userResultMap" type="User">
        <id column="uid" property="id"></id>
        <result column="name" property="username"></result>
        <result column="bir" property="birthday"></result>
        <result column="gender" property="sex"></result>
        <result column="address" property="address"></result>
    </resultMap>

    <!--
        模拟表与实体的属性名不一致情况
    -->
    <select id="findAllResultMap" resultMap="userResultMap">
        SELECT id AS uid, username AS `name`,birthday AS bir ,sex AS gender ,address FROM `user`
    </select>

c. 测试

    // resultMap标签
    @Test
    public void testFindAllResultMap() throws Exception {
        // 获取代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 执行sql
        List<User> list = userMapper.findAllResultMap();
        for (User user : list) {
            System.out.println(user);
        }
    }

2. 多条件查询(二种方式)

  • 根据 id 和 username 查询 user 表:

a. UserMapper 接口

    // 多条件查询,方式一(参数≤2时推荐使用)
    public List<User> findByIdAndUsername1(@Param("id") Integer id, @Param("username") String username);

    // 多条件查询,方式二(参数较多时使用)
    public List<User> findByIdAndUsername2(User user);

b. UserMapper.xml

    <!--
        多条件查询方式一
            如果传递多个参数,parameterType属性可以省略不写
    -->
    <select id="findByIdAndUsername1"  resultType="User">
    select * from user where id = #{id} and username = #{username}
    </select>

    <!--
            多条件查询方式二
                传递一个参数,parameterType也可以省略,但为了格式,不建议省略
        -->
    <select id="findByIdAndUsername2" parameterType="User"  resultType="User">
    select * from user where id = #{id} and username = #{username}
    </select>

c. 测试

    // 多条件查询
    @Test
    public void test01()throws Exception{
        // 获取代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 方式一
    /*List<User> list = userMapper.findByIdAndUsername1(41, "老王");
        System.out.println(list);*/

        // 方式二
        User user = new User();
        user.setId(41);
        user.setUsername("老王");
        List<User> list = userMapper.findByIdAndUsername2(user);
        System.out.println(list);
    }

3. 模糊查询(四种方式)

  • 根据 username 模糊查询 user 表:

a. UserMapper 接口

    // 模糊查询,方式一
    public List<User> findByUsername1(String username);

    // 模糊查询,方式二
    public List<User> findByUsername2(String username);

    // 模糊查询,方式三
    public List<User> findByUsername3(String username);

    // 模糊查询,方式四
    public List<User> findByUsername4(String username);

b. UserMapper.xml

    <!--
    模糊查询,方式一(不推荐)
        Java代码与sql语句有耦合
    -->
    <select id="findByUsername1" parameterType="string" resultType="User">
        select * from user where username like #{username}
    </select>

    <!--
        模糊查询,方式二(不推荐)
            mysql5.5版本之前,此拼接不支持多个单引号
            oracle数据库,除了别名的位置,其余位置都不能使用双引号
    -->
    <select id="findByUsername2" parameterType="string" resultType="User">
        select * from user where username like "%" #{username} "%"
    </select>

    <!--
        模糊查询,方式三(不推荐)
            此方式,会出现sql注入
            ${} 字符串拼接,如果接收的简单数据类型,表达式名称必须是value
    -->
    <select id="findByUsername3" parameterType="string" resultType="User">
        select * from user where username like '%${value}%'
    </select>

    <!--
        模糊查询,方式四(推荐)
            使用concat()函数拼接
                select * from user where username like concat('%',#{username},'%')
            注意:oracle数据库 concat()函数只能传递二个参数,但是可以使用函数嵌套来解决
                select * from user where username like concat(concat('%',#{username}),'%')
    -->
    <select id="findByUsername4" parameterType="string" resultType="User">
        select * from user where username like concat(concat('%',#{username}),'%')
    </select>

c. 测试

    // 模糊查询
    @Test
    public void test02()throws Exception{
        // 获取代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 方式一
        // List<User> list = userMapper.findByUsername1("%王%");
        // 方式二
        // List<User> list = userMapper.findByUsername2("王");
        // 方式三
        // List<User> list = userMapper.findByUsername3("王");
        // 方式四
        List<User> list = userMapper.findByUsername4("王");
        System.out.println(list);
    }

4. ${} 与 #{} 区别(面试题)

  • ${}:底层 Statement
    1. SQL 与参数拼接在一起,会出现 SQL 注入问题
    2. 每次执行 sql 语句都会编译一次
    3. 接收简单数据类型,命名:${value}
    4. 接收引用数据类型,命名: ${属性名}
    5. 字符串类型需要加 '${value}'
  • #{}:底层 PreparedStatement
    1. SQL 与参数分离,不会出现 SQL 注入问题
    2. SQL 只需要编译一次
    3. 接收简单数据类型,命名:#{随便写}
    4. 接收引用数据类型,命名:#{属性名}

> ${} 接收简单数据类型时只能传 ${value}

  • 查看源码 org.apache.ibatis.scripting.xmltags.TextSqlNode 可知 value 值已被写死:
            if (parameter == null) {
                this.context.getBindings().put("value", (Object)null);
            } else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
                this.context.getBindings().put("value", parameter);
            }

原文链接:https://qwert.blog.csdn.net/article/details/106059623

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值