五、Mybatis高级查询

目录

一、ResultMap属性

1.1 resultType 与 ResultMap

1.2 编写UserMapper接口

1.3 编写UserMapper.xml

二、多条件查询

2.1 法一:使用 #{arg0}、#{argn} 或者 #{param1}、#{paramn} 获取参数

2.2 法二:使用注解,引入 @Param() 注解获取参数

2.3 法三:使用POJO(推荐)

三、模糊查询

方式一:

方式二:不推荐,可能会出现sql注入


一、ResultMap属性

1.1 resultType 与 ResultMap

  • resultType :实体的属性名与表中字段名一致,将查询结果自动封装到实体类中;
  • ResultMap:实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中;

1.2 编写UserMapper接口

ublic interface UserMapper {

    /*
        查询所有用户
     */
    public List<User> findAllResultMap();

}

1.3 编写UserMapper.xml

<?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 namespace="com.lagou.mapper.UserMapper">

    <!--id : 标签的唯一标识
        type: 封装后实体类型-->
    <resultMap id="userResultMap" type="com.lagou.domain.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>
</mapper>

二、多条件查询

根据用户id和用户名查询

2.1 法一:使用 #{arg0}、#{argn} 或者 #{param1}、#{paramn} 获取参数

public interface UserMapper { 
    public List<User> findByIdAndUsername1(Integer id, String username); 
}
<?xml version="1.0" encoding="utf-8"?>

<mapper namespace="com.lagou.mapper.UserMapper"> 
  <select id="findByIdAndUsername1" resultType="user"> 
    <!-- select * from user where id = #{arg0} and username = #{arg1} --> 
    select * from user where id = #{param1} and username = #{param2}
  </select> 
</mapper>

2.2 法二:使用注解,引入 @Param() 注解获取参数

public interface UserMapper { 
    public List<User> findByIdAndUsername2(
              @Param("id") Integer id,
              @Param("username") String username
        ); 
}
<?xml version="1.0" encoding="utf-8"?>

<mapper namespace="com.lagou.mapper.UserMapper"> 
    <select id="findByIdAndUsername2" resultType="user">
        select * from user where id = #{id} and username = #{username}
    </select> 
</mapper>

2.3 法三:使用POJO(推荐)

public interface UserMapper { 
    public List<User> findByIdAndUsername3(User user);
}
<?xml version="1.0" encoding="utf-8"?>

<mapper namespace="com.lagou.mapper.UserMapper"> 
  <select id="findByIdAndUsername3" 
          parameterType="com.lagou.domain.User" 
          resultType="com.lagou.domain.User">
    select * from user where id = #{id} and username = #{username}
  </select> 
</mapper>

三、模糊查询

方式一:

public interface UserMapper { 
    public List<User> findByUsername1(String username); 
}
<?xml version="1.0" encoding="utf-8"?>

<mapper namespace="com.lagou.mapper.UserMapper"> 
    <select id="findByUsername1" parameterType="string" resultType="user">
        select * from user where username like #{username}
    </select> 
</mapper>

<!-- ---------------------- -->
<mapper namespace="com.lagou.mapper.UserMapper"> 
    <select id="findByUsername1" parameterType="string" resultType="user">
        select * from user
        <where>
            <if test="username != null and username != ''">
                and username like concat ('%', #{username}, '%')
            </if>
        </where>
    </select> 
</mapper>
@Test 
public void testFindByUsername() throws Exception { 
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
    List<User> list = userMapper.findByUsername1("%王%"); 
    for (User user : list) { 
        System.out.println(user); 
    } 
}

方式二:不推荐,可能会出现sql注入

<?xml version="1.0" encoding="utf-8"?>

<mapper namespace="com.lagou.mapper.UserMapper"> 
    <!--不推荐使用,因为会出现sql注入问题--> 
    <select id="findByUsername2" parameterType="string" resultType="user"> 
        select * from user where username like '${value}' 
    </select> 
</mapper>
@Test 
public void testFindByUsername() throws Exception { 
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
    List<User> list = userMapper.findByUsername2("%王%"); 
    for (User user : list) { 
        System.out.println(user); 
    } 
}

PS :#{} 与 ${} 的区别!

#{} 表示的是个占位符

  • 通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换, # {}可以有效防止 sql 注入。
  • #{} 可以接收简单类型值或 pojo 属性值。
  • 如果parameterType 传输单个简单类型值, #{} 括号中名称随便写。
${} 表示的是拼接字符串
  • 通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,会出现 sql 注入问题。
  • ${} 可以接收简单类型值或 pojo 属性值。
  • 如果 parameterType 传输单个简单类型值, ${} 括号中只能是 value。( TextSqlNode.java 源码可以证明
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,高级查询可以使用延迟加载机制来实现。延迟加载是将数据加载时机推迟,例如推迟嵌套查询的执行时机。通过延迟加载,可以先查询主表,按需实时做关联查询,返回关联表结果集,提高效率。 在MyBatis中,实现关联查询有两种不同的方式:嵌套Select查询和嵌套结果映射。嵌套Select查询是通过执行另外一个SQL映射语句来加载期望的复杂类型,而嵌套结果映射则使用嵌套的结果映射来处理连接结果的重复子集。 对于关联结果映射和其他类型的映射,工作方式类似。需要指定目标属性名以及属性的javaType,大多数情况下MyBatis可以推断出来,如果需要的话,还可以设置JDBC类型。如果想要覆盖获取结果值的过程,可以设置类型处理器。 综上所述,通过延迟加载机制和适当的关联查询方式,MyBatis可以实现高级查询功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mybatis高级查询](https://blog.csdn.net/weixin_37650458/article/details/96587906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MyBatis高级查询](https://blog.csdn.net/qq_66991094/article/details/127147576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值