mysql map 结果集封装_MyBatis结果集映射

本文详细介绍了MyBatis配置文件中的主要元素,包括typeAliases标签的别名配置,environments标签和environment标签的事务及数据库连接池设置,transactionManager和dataSource标签的事务管理与数据源配置,以及mappers标签的映射文件路径配置。同时,文章还深入讲解了结果集映射,包括一对一、一对多的关联查询映射,并通过实例展示了如何解决字段名称与对象属性不一致的问题,以及如何进行延迟加载的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis配置文件常用配置

1.typeAliases标签,该标签用于配置全局的别名,配置别名后则不再需要写全名,在映射文件中只需要写配置的别名即可,例如:                        

除了可以配置别名之外,还可以直接配置包扫描,这样映射文件中只需要写相应的类名即可:                        

2.environments标签,该标签用于配置环境,在该标签内可以对事务的管理以及数据库连接池进行配置,例如:                                    

3.environment标签,该标签用于配置具体的环境,可以写多个,例如:                                                                            

4.transactionManager标签,该标签用于配置事务管理类型,其中的type属性的值为JDBC时代表开启事务,为MANAGED时代表关闭事务,例如:                                                                                        or                        

5.dataSource标签,该标签用于配置数据源,以及指定是否使用数据库连接池,例如                                                                                                                                                                                        

6.mappers标签,在该标签内可配置映射文件路径或者映射接口类以及映射文件的url路径,例如:                                                                                                                                                                                                                                                    

mappers标签内也可以配置包扫描,与typeAliases标签内的配置方式是一样的:    

注:当接口与XML配置文件混合使用的时候,要注意避免命名空间发生冲突。

MyBatis结果集映射配置

当我们表格的字段名称与字段封装类里的属性名称对应不上的时候,我们就得在配置文件中手动配置结果集对对象属性的映射,不然MyBatis是不会自动映射的,得出来的就会是一个空对象。

例如,我现在有一张student表,表格结构如下:

然后编写了一个表格的字段封装类,代码如下:package org.zero01.dao.pojo;public class Student {    private int id;    private String name;    private int stuAge;    private String stuSex;    private String stuAddress;    ... getter setter 略 ...}

接口类代码如下:package org.zero01.dao.mapperif;import org.zero01.dao.pojo.Student;public interface StudentMapper {    public Student selectById(int id);}

可以看到对象属性名称与表格字段名称不一致,这时候就需要配置结果集的映射器,在XML配置文件里进行配置,如下:<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">                                                            select * from student where sid=#{0}    

编写一个简单的测试用例进行测试,测试代码如下:package org.zero01.test;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 org.json.JSONObject;import org.junit.After;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.zero01.dao.mapperif.StudentMapper;import org.zero01.dao.pojo.Student;import java.io.IOException;import java.io.InputStream;public class TestMybatis {    private SqlSession sqlSession;    private StudentMapper studentMapper;    @Before    public void startTest() throws IOException {        String confPath = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(confPath);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        sqlSession = sqlSessionFactory.openSession();        studentMapper = sqlSession.getMapper(StudentMapper.class);    }    @Test    public void testSelectById() {        Student student = studentMapper.selectById(24);        Assert.assertNotNull(student);        System.out.println(new JSONObject(student));    }    @After    public void endTest() {        if (sqlSession != null) {            sqlSession.close();        }    }}

控制台打印结果如下,没有问题:{"stuSex":"女","name":"Milen","stuAddress":"深圳","id":24,"stuAge":20}

如果我们需要进行连接查询的时候,也需要用到结果集映射,例如我现在要查询student表与studentlog中sid一致的记录。studentlog表格结构如下:

同样的,需要先创建一个表格字段封装类:package org.zero01.dao.pojo;import java.util.Date;public class StudentLog {    private int log_id;    private int id;    private String name;    private int stuAge;    private String stuSex;    private String stuAddress;    private String operation_type;    private Date log_time;    ... getter setter 略 ...}

然后在Student类中,增加StudentLog属性:package org.zero01.dao.pojo;public class Student {    private int id;    private String name;    private int stuAge;    private String stuSex;    private String stuAddress;    private StudentLog studentLog;    ... getter setter 略 ...}

然后需要在XML文件中使用association标签来配置连接查询的结果集映射,如下示例:<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">                                                                                                                                                                            select * from student stu inner join studentlog stulog on  stu.`sid`=stulog.`sid`    

其中javaType属性用于指定将结果集数据封装成哪种Java类型,在这里为自定义类型,而fetchType属性指定是否开启延迟加载,lazy为开启,eager为禁止。也可以在mybatis配置文件中通过settings标签来配置开启或关闭延迟加载,这种配置方式是全局生效的,如下示例:    ...                    ...

association标签中有一个select属性,通过该属性我们可以执行指定的查询语句。例如我现在需要查询一个学生的记录,我希望查询的时候能统计出表格中与该学生同名的学生数量。在Studnet中加多一个count属性:package org.zero01.dao.pojo;public class Student {    private int id;    private String name;    private int stuAge;    private String stuSex;    private String stuAddress;    private StudentLog studentLog;    private int count;    ... getter setter 略 ...}

然后编辑XML文件内容如下:<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">                                                                    select * from student where sid=#{0}                select count(*) as total from student where sname=#{0}    

注:查询语句不能是无参数值的,因为使用select属性时必须要有column属性,这时候的column属性是用来传递参数的。例如:select count(*) as total from student这类语句是无效的。而如果要传递多个参数时,需要使用大括号括起来,例如:column="{prop1=sid,prop2=sname,prop3=age,}"。

从以上简单的示例中,可以看到association标签完成的是一对一的级联操作的结果集映射,如果是一对多的操作时就需要使用collection标签进行结果集的映射。例如,我在Student里增加一个studentLogs属性,要求把查询出来的StudentLog对象都放在这个集合里,这种操作就是一对多:package org.zero01.dao.pojo;public class Student {    private int id;    private String name;    private int stuAge;    private String stuSex;    private String stuAddress;    private StudentLog studentLog;    private int count;    private List studentLogs;    ... getter setter 略 ...}

编辑XML文件内容如下:<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">                                                                                                                                                                                    SELECT * FROM student stu INNER JOIN studentlog stulog ON stu.`sid`=stulog.`sid`    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值