Mybatis的resultMap工具和动态SQL

目录

前言

一、Mybatis的resultMap工具

1.在导入相关包后配置文件

2.在Java中

3.测试

1.通过for循环输出嵌套列表

​编辑2.通过修改xml文件直接输出嵌套列表

也可以实现相同的效果

二、动态SQL

1.配置文件

2.测试

三、导入的部分包

总结


前言

浏览网页时我们经常发现一块区域无法将某一内容完全展示出来,但当我们点击这部分内容时,他会自动弹出该内容剩余部分,那我们该如何将这部分数据传输给前端同学呢。这是我们就需要用到resultMap工具,输出嵌套的列表,外层列表是一直要显示的数据,当用户想要了解详情,就可以看到内层列表的数据了。

这里我们用两张表来描述它

塔吊信息表

塔吊进出场时间表

在用户登录我们的网站时,可以看到两个塔吊的tcid,生产日期redate和承重weight

如果用户想要了解某个塔吊使用记录时,点击数据就可以根据tcid显示相应内容


 

 

一、Mybatis的resultMap工具

1.在导入相关包后配置文件

 

//mybatis.cfg.xml中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    <settings>-->
<!--        &lt;!&ndash; 打印查询语句 可加可不加,动态sql中可以看到语句&ndash;&gt;-->
<!--        <setting name="logImpl" value="STDOUT_LOGGING" />-->
<!--    </settings>-->

    <!--    给实体类起别名 方便引用-->
    <typeAliases>
        <typeAlias type="com.ybg.doublekill.entity.Towercares" alias="tower"></typeAlias>
        <typeAlias type="com.ybg.doublekill.entity.InOuttime" alias="iotime"></typeAlias>
    </typeAliases>
    <environments default="gz">
        <environment id="gz">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://自己虚拟机ip:3306/想要连接的数据库名字?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;allowMultiQueries=true&amp;allowPublicKeyRetrieval=true"/>
                <property name="username" value="虚拟机账户"/>
                <property name="password" value="密码"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/Towercares.xml"></mapper>
        <mapper resource="mapper/InOutTime.xml"></mapper>
    </mappers>
</configuration>

//Towercares.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.ybg.doublekill.mapper.TowercaresMapper">
    <select id="findAll" resultType="tower">
        select * from towercares
    </select>
</mapper>
//InOutTime.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.ybg.doublekill.mapper.InOutTimeMapper">
    <select id="findInOutTimeByTcid" parameterType="int" resultType="iotime">
        select * from inouttime where tcid=#{tcid}
    </select>
</mapper>
2.在Java中

//TowercaresMapper中
package com.ybg.doublekill.mapper;

import com.ybg.doublekill.entity.Towercares;

import java.util.List;

public interface TowercaresMapper {
    public List<Towercares> findAll();
}

 

//InOutTimeMapper中
package com.ybg.doublekill.mapper;

import com.ybg.doublekill.entity.InOuttime;

import java.util.List;

public interface InOutTimeMapper {
    public List<InOuttime> findInOutTimeByTcid(int cid);
    public List<InOuttime> findInoutTime(InOuttime iot);
}
//Towercares中
package com.ybg.doublekill.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Towercares {
    private int tcid;
    private Date redate;
    private int weight;
    private List<InOuttime> iots;
}
//列表iots用于存放通过tcid在第二个表中查询的数据
//InOuttime中
package com.ybg.doublekill.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class InOuttime {
    private int ioid;
    private String project;
    private int tcid;
    private Date intime;
    private Date outtime;
}
3.测试
1.通过for循环输出嵌套列表
package com.ybg.doublekill.demo;

import com.fasterxml.jackson.databind.json.JsonMapper;
import com.ybg.doublekill.entity.InOuttime;
import com.ybg.doublekill.entity.Towercares;
import com.ybg.doublekill.mapper.InOutTimeMapper;
import com.ybg.doublekill.mapper.TowercaresMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;
import java.util.List;

public class Demo {
    public static void main(String[] args) throws Exception{
        Reader read = Resources.getResourceAsReader("mybatis.cfg.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(read);
        SqlSession session = factory.openSession();
        TowercaresMapper tm = session.getMapper(TowercaresMapper.class);
        InOutTimeMapper iom = session.getMapper(InOutTimeMapper.class);
        List<Towercares> towers=tm.findAll();
        System.out.println(towers);//输出在第一个表中的查询结果
        for (Towercares tc:towers){
            List<InOuttime> iot = iom.findInOutTimeByTcid(tc.getTcid());
            tc.setIots(iot);
        }
        JsonMapper jm = new JsonMapper();
        System.out.println(jm.writeValueAsString(towers));
        //通过for循环将在第二个表的查询结果放入iot列表中,然后输出towers列表
    }
}

如图,首先看外层,有tcid=1和tcid=2两个塔吊信息的生产日期redate和承重weight

而在每个weight后又有对应进出场表中的数据。

2.通过修改xml文件直接输出嵌套列表
//修改后的Towercares.xml
//注意resultType要改为resultMap
<?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.ybg.doublekill.mapper.TowercaresMapper">
    <resultMap id="tower-iotime" type="tower">
        <collection property="iots"//理解为根据column的值在iotime中查询,并将结果放入iots列表中
                    column="tcid"
                    select="com.ybg.doublekill.mapper.InOutTimeMapper.findInOutTimeByTcid"></collection>
    </resultMap>
    <select id="findAll" resultMap="tower-iotime">
        select * from towercares
    </select>
</mapper>
//修改过后Demo中
List<Towercares> towers=tm.findAll();
JsonMapper jm = new JsonMapper();
System.out.println(jm.writeValueAsString(towers));
也可以实现相同的效果

 

二、动态SQL

MyBatis提供了一种名为动态SQL的功能,它允许在SQL语句中根据不同的条件动态地生成不同的SQL片段。

动态SQL可以帮助您根据不同的情况构建灵活的查询语句,而无需编写多个静态的SQL语句。

1.配置文件
//在InOutTime.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.ybg.doublekill.mapper.InOutTimeMapper">
    <select id="findInOutTimeByTcid" parameterType="int" resultType="iotime">
        select * from inouttime where tcid=#{tcid}
    </select>
    <select id="findInoutTime" parameterType="iotime" resultType="iotime">
        select * from inouttime
        <where>
            <if test="ioid!=0">
                ioid=#{ioid}
            </if>
            <if test="project!=null">
                and project=#{project}
            </if>
            <if test="tcid!=0">
                and tcid=#{tcid}
            </if>
            <if test="intime!=null">
                and intime=#{intime}
            </if>
            <if test="outtime!=null">
                and outtime=#{outtime}
            </if>
        </where>
    </select>
</mapper>
2.测试
package com.ybg.doublekill.demo;

import com.fasterxml.jackson.databind.json.JsonMapper;
import com.ybg.doublekill.entity.InOuttime;
import com.ybg.doublekill.entity.Towercares;
import com.ybg.doublekill.mapper.InOutTimeMapper;
import com.ybg.doublekill.mapper.TowercaresMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;
import java.util.List;

public class Demo {
    public static void main(String[] args) throws Exception{
        Reader read = Resources.getResourceAsReader("mybatis.cfg.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(read);
        SqlSession session = factory.openSession();
        InOutTimeMapper iom = session.getMapper(InOutTimeMapper.class);
        InOuttime io=InOuttime.builder().build();//可以在builder()后加多个参数查询
        System.out.println(iom.findInoutTime(io));
    }
}

三、导入的部分包

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.12.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.12.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>

总结

MyBatis 的 resultMap 和动态 SQL 是两个核心功能,用于在 MyBatis 中处理数据库结果映射和动态 SQL 查询。

可以参考 MyBatis 官方文档和示例代码,结合实际项目需求进行练习和深入学习。理解和熟练掌握 resultMap 和动态 SQL 的使用,可以更好地利用 MyBatis 进行数据库操作,并提高开发效率和代码质量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一. 生成器模板路径可以引用相关变量 如 ${basepackage}/${className}.java,根据该变量生成输出文件 二. 自动搜索某个目录所有模板文件,无需配置 三.代码生成器模板可以引用的相关变量 1. g.generateByTable("table_name") 方法可以引用的变量 table : cn.org.rapid_framework.generator.provider.db.table.model.Table 2. g.generateByClass(UserInfo.class) 方法可以引用的变量 clazz : cn.org.rapid_framework.generator.provider.java.model.JavaClass 3. g.generateBySql("select * from user_info where pwd=:pwd") 方法可以引用的变量 sql : cn.org.rapid_framework.generator.provider.db.sql.model.Sql 4.公共变量 env : 系统环境变量 System.getProperties() : 直接引用,没有前缀 generator.properties 文件中的所有属性,直接引用,没有前缀 gg : 模板控制变量, cn.org.rapid_framework.generator.GeneratorControl 四.每个模板有gg变量可以控制自身的自定义配置 (每一个模板都会创建新的gg实例) 如是否生成,是否覆盖目标文件,甚至是生成其它文件 ${gg.setIgnoreOutput(true)}: 如果为true则不生成输出文件 ${gg.generateFile(outputFile,content)} 在模板中生成其它文件 ${gg.getProperty(key,defaultValue)}: 得到proproty,如果没有找到,则返回默认值 ${gg.getInputProperty(key)}: 会弹出一个输入框,提示用户输入值 具体参考: http://code.google.com/p/rapid-framework/wiki/rapid_generator_gg 五.支持生成(gen)及删除操作(del),即生成的代码也可以很方便的删除 六. 自动删除模板扩展名: .ftl,.vm 举例: 如你有一个模板 SqlMap.xml.ftl 将变为 SqlMap.xml 所以你要生成ftl扩展名的文件,应该将文件名从 list.ftl => list.ftl.ftl 七. 模板自动include所有父目录的:macro.include文件,可以存放公共的macro 示例: 如你的模板为 com/project/UserDao.java, 将自动include: com/project/macro.include, com/macro.include, macro.include 八. generator.xml (或者generator.properties)配置文件 1.类似ant可以变量引用,引用环境变量使用${env.JAVA_HOME}, 引用System.getProperties()直接引用 2.自动替换generator.properties中的句号(.)为反斜杠,设置key为key+"_dir"后缀 示例: pkg=com.company => pkg_dir=com/company 九.自动拷贝二进制文件至输出目录 如模板目录下的 zip,rar,doc文件将会自动拷贝至输出目录,不会破坏文件格式 (通过扩展名自动识别) 十. 数据库表配置,用于自定义生成器模板引用的table变量,配置文件必须存放在classpath: generator_config/table/table_name.xml (该文件生成器可以生成,自己再自定义修改)
MyBatis 中,ResultMap 是用于将查询结果映射到 Java 对象模型的配置。它定义了数据库查询结果与 Java 对象之间的映射关系。 在 MyBatis 中,通常会使用实体类(Model)来表示数据库表的结构。ResultMap 就是用来告诉 MyBatis 如何将查询结果映射到实体类中的属性。 下面是一个示例来说明 ResultMap 和 Model 的关系: 首先,假设有一个数据库表 `user`,包含字段 `id`、`name` 和 `age`。我们创建一个 User 实体类来表示这个表: ```java public class User { private Long id; private String name; private Integer age; // 省略构造方法、getter 和 setter } ``` 接下来,在 MyBatis 的映射文件中,需要定义 ResultMap 来指定查询结果与 User 类的映射关系。示例如下: ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> </resultMap> ``` 在上述代码中,`userResultMap` 是 ResultMap 的唯一标识符,`type` 指定了映射到的实体类类型。接下来,`<id>` 标签指定了主键字段的映射关系,而 `<result>` 标签指定了非主键字段的映射关系。 最后,我们可以在 SQL 查询中使用该 ResultMap 来进行结果映射: ```xml <select id="getUserList" resultMap="userResultMap"> SELECT id, name, age FROM user </select> ``` 在上述代码中,`resultMap` 属性引用了之前定义的 `userResultMap`,表示使用该 ResultMap 进行结果映射。 总结来说,ResultMap 是用于定义数据库查询结果与 Java 对象模型之间的映射关系。Model(实体类)是用于表示数据库表结构的 Java 类。通过配置 ResultMapMyBatis 可以将查询结果映射到相应的 Model 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值