MyBatis学习笔记】10:#和$,sql元素,resultMap的结构/构造器,存储结果集

简介: MyBatis学习笔记】10:#和$,sql元素,resultMap的结构/构造器,存储结果集 在MyBatis的SQL中使用#{}和${}都会被视为特殊字符串来处理。前者是设置了参数,MyBatis会将参数设置到语句中(默认是PreparedStatement)。

MyBatis学习笔记】10:#和$,sql元素,resultMap的结构/构造器,存储结果集

在MyBatis的SQL中使用#{}${}都会被视为特殊字符串来处理。前者是设置了参数,MyBatis会将参数设置到语句中(默认是PreparedStatement)。后者是传递特殊字符串所对应的变量值,而不是传递参数。


修改上篇中@Param传递多参数的例子。

为映射器接口中的方法添加一个参数:

List<Person> findPersonByAnnotation(@Param("columns") String columns,@Param("surname") String surname, @Param("sexType") SexType sexType);

     
     
  • 1

修改相应的映射配置,将使用${}将这个参数变成直出的变量:

    <!--使用注解传递参数,这时是不涉及单独一个类型的,所以去掉parameterType属性-->
    <!--必备的属性解析(如sex_type需要解析成整数下标)需要指明,因为参数不再全是String-->
    <select id="findPersonByAnnotation" resultMap="personMap">
        SELECT ${columns}
        FROM person
        WHERE name LIKE CONCAT(#{surname}, '%')
              AND sex_type = #{sexType,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
    </select>

     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在主类中使用查询:

List<Person> personList = personMapper.findPersonByAnnotation("id,name","刘",SexType.MALE);

     
     
  • 1

查询结果: 
这里写图片描述 
只查询了这两列,所以其它属性是空。

映射配置中的sql元素

基本使用

映射配置中的sql元素用于定义一串SQL语句的组成部分,其它的语句可以通过引用来使用它。


如要实现和前面一样的功能,可以不从参数传入${},而是配置到sql元素中解耦:

    <sql id="columns">
        id,name
    </sql>
    <select id="findPersonByAnnotation" resultMap="personMap">
        SELECT <include refid="columns"/>
        FROM person
        WHERE name LIKE CONCAT(#{surname}, '%')
              AND sex_type = #{sexType,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
    </select>

     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里<include refid="sql元素的id"/>即是将这部分SQL代码原封不动的引用到了相应位置上。

向sql元素中传参

可以在include元素内配置property子元素,向sql元素中传递参数,再将转化${参数名}为相应参数值后的SQL引入该位置。


还是相同的功能,若将表名作为参数传入:

    <sql id="columns">
        ${prefix}.id, ${prefix}.name
    </sql>
    <select id="findPersonByAnnotation" resultMap="personMap">
        SELECT
        <include refid="columns">
            <!--设置sql元素中的${prefix}的参数值为person(表名)-->
            <property name="prefix" value="person"/>
        </include>
        FROM person
        WHERE name LIKE CONCAT(#{surname}, '%')
        AND sex_type = #{sexType,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
    </select>

     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

resultMap元素结构

<!--结果集映射-->
<resultMap id="" type="">
    <!--配置构造方法-->
    <constructor>
        <idArg column="" javaType=""/>
        <arg column="" javaType=""/>
    </constructor>
    <!--主属性-->
    <id property="" column=""/>
    <!--非主属性-->
    <result property="" column=""/>
    <!--一对一关系-->
    <association property="" column="" select=""/>
    <!--一对多关系-->
    <collection property="" column="" select=""/>
    <!--鉴别器-->
    <discriminator javaType="" column="">
        <case value="" resultMap=""/>
    </discriminator>
</resultMap>

     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

constructor子元素

使用resultMapconstructor子元素来配置一个POJO的构造器,因为POJO类不见得会有无参构造方法。可以认为后面的idresult子元素对应的是setter方法传参,而这个子元素则是用构造方法来传参构造POJO对象的。

使用constructor元素时,里面的idArg子元素表示主属性,arg子元素则是非主属性,使用方法和idresult元素类似。

存储结果集

使用POJO存储结果集

前面学习的一直是这种方式,只要select元素配置了resultMap属性指向一个结果映射,或者使用resultType属性指向一个POJO类或其别名,那么Mapper接口的相应方法就应当设计成返回一个POJO对象的形式。

使用Map存储结果集

就像使用Map可以做多参数传递一样,结果集也是多个参数的集合,可以全部存在Map里面。使用resultType="map",那么Mapper接口的相应方法就应当设计成返回一个Map接口的实现类对象的形式。


映射文件中添加:

    <!--使用Map存储结果集,所以resultType="map"-->
    <select id="findToMap" resultType="map">
        SELECT *
        FROM person
        WHERE name LIKE CONCAT(#{surname}, '%')
              AND sex_type = #{sexType,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
    </select>

     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

映射器接口中添加相应的方法:

List<HashMap<String,String>> findToMap(@Param("surname") String surname, @Param("sexType") SexType sexType);

     
     
  • 1

主类中使用,获取到一个存Map实现类的List,然后遍历,以数据库中的列名(而不是POJO属性名)为key获取结果集各个列的值:

//调用工具类的静态方法开启并获取一个SqlSession实例
sqlSession = SqlSessionFactoryUtil.openSqlSession();
//获取映射器代理类对象
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

//传给这个查询方法,用于查询
List<HashMap<String,String>> mapList = personMapper.findToMap("刘",SexType.MALE);
//输出,注意以数据库中的列名(而不是POJO属性名)为key
for (HashMap p:mapList) {
    System.out.println(p.get("id")+","+p.get("name")+","+p.get("sex_type")+","+p.get("id_card"));
}

//善后处理...

     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果: 
这里写图片描述 
从第三列是1可以看出,这种方式的一大特点即在于,数据库中存的是什么,查出来的就是什么样的字符串。在多数时候,这样可能会失去语义(如1本来应代表枚举MALE),而且使用这种方式会让可读性下降。

原文地址 https://blog.csdn.net/SHU15121856/article/details/81113394
相关文章
|
3月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
3月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
3月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
67 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
3月前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
4月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
91 10
|
5月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
5月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
5月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
98 1
|
5月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
7月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
189 13