Mybatis进阶教程(二)

简介: 接着上一篇的进阶教程,继续学习Mybatis的一些常用用法。以便我们更好使用Mybatis。知识点汇总数据表一对一association现实中,有时候我们的模型数据,需要结合其它模型,也就是数据库表与表之间的关联。

接着上一篇的进阶教程,继续学习Mybatis的一些常用用法。以便我们更好使用Mybatis。

知识点汇总

数据表一对一association

现实中,有时候我们的模型数据,需要结合其它模型,也就是数据库表与表之间的关联。比如说商品表,与优惠券表,假如一个商品对应一个优惠券。
1、数据表


img_e84e85d901b9a420695b3120bb8cbc66.png
商品表信息
img_bb728b0b25adbd24d28fe917f4de4ae8.png
优惠券表信息
img_5d6d6282c7aa2289017bee3bf5b7200a.png
商品表与优惠券表内容

2、Mybatis程序
2.1 新建Good.java模型,Coupon.java模型,GoodMapper接口,CouponMapper接口,再新建GoodMapper与CouponMapper的xml文件,最终目录结构接着上次如下。

img_b967a603e4b1c595fb732de86eaee0f7.png
项目目录结构

部分文件内容:

public class Good {
    int id;
    String good_name;
    String coupon_id;
    Coupon mCoupon;
    List<Coupon> mCouponList;
    public Good() {    //构造器
    }

public class Coupon {
    int id;
    String coupon_url;

    public Coupon() {
    }

注意,我们在Resource目录下新建的是me\aihe\dao目录

mkdir -pv src\main\resources\ me\aihe\dao
两种方法
方法一

3.1 使用分步查询

 // GoodMapper接口文件新建方法
    Good selectGood(@Param("id") Integer id);

// GoodMapper.xml文件
    <resultMap id="goodMap" type="Good">
        <id column="id" property="id" />
        <result property="good_name" column="good_name" />
        <result property="coupon_id" column="coupon_id" />
        <association property="mCoupon" column="coupon_id" select="me.aihe.dao.CouponMapper.selectCoupon" />
    </resultMap>
    
    <select id="selectGood" resultMap="goodMap">
        SELECT * FROM Good WHERE id = #{id}
    </select>
    
// CouponMapper接口文件新建方法
    Coupon selectCoupon(@Param("id") Integer id);

// CouponMapper.xml文件配置
    <resultMap id="couponMap" type="Coupon">
        <id property="id" column="id" />
        <result column="coupon_url" property="coupon_url" />
    </resultMap>

    <select id="selectCoupon" resultMap="couponMap" >
        SELECT * FROM Coupon WHERE id = #{id}
    </select>

// 测试程序
  public void test7(){
        InputStream inputStream = null;
        SqlSession sqlSession = null;
        try {
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory mSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = mSqlSessionFactory.openSession();

            GoodMapper goodMapper = sqlSession.getMapper(GoodMapper.class);
            Good good = goodMapper.selectGood(1);
            System.out.println(good);

            sqlSession.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

3.2 、最后的运行结果:

img_5b579631d65b5aaa2456eecebd6e8b6a.png
测试结果
方法二

4.1 使用嵌套结果集的方式处理。配置如下

//GoodMapper的接口方法
    Good selectGood2(@Param("id") Integer id);

// GoodMapper.xml
 <resultMap id="goodMap2" type="Good">
        <id column="id" property="id" />
        <result column="good_name" property="good_name" />
        <result property="coupon_id" column="coupon_id" />
        <association property="mCoupon" javaType="Coupon">
            <id property="id" column="id" />
            <result property="coupon_url" column="coupon_url" />
        </association>
    </resultMap>

    <select id="selectGood2" resultMap="goodMap2">
        SELECT * from Good g, Coupon c where g.coupon_id=c.id and g.id=#{id}
    </select>

//测试程序
@Test
    public void test8(){
        InputStream inputStream = null;
        SqlSession sqlSession = null;
        try {
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory mSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = mSqlSessionFactory.openSession();

            GoodMapper goodMapper = sqlSession.getMapper(GoodMapper.class);
            Good good = goodMapper.selectGood2(1);
            System.out.println(good);

            sqlSession.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

4.2 运行结果

img_f127373ffa94258324ce5206cb159aff.png
测试结果

5、小结,我们也可以设置懒加载的方式,在真正用到模型的时候才去数据库查询数据,这样可以更加节省数据库的性能。
在mybatis-config的xml

img_5a0fb003bda076fe13200d52667a04e1.png
lazyLoading配置属性
        <setting name="lazyLoadingEnabled" value="true" />
        <setting name="aggressiveLazyLoading" value="true" />

一对多查询

修改Coupon表为如下,多个 优惠券可能对应一个商品

img_a9284f1d0b210ff842c238777c07edb0.png
优惠券表结构与内容
//GoodMapper接口方法
Good getGoodAndCouponMap(@Param("id") Integer id);

//GoodMapper.xml文件
    <resultMap id="GoodCouponMap" type="Good">
        <id property="id" column="id" />
        <collection property="mCouponList" column="id" ofType="Coupon" select="me.aihe.dao.CouponMapper.getCouponFromGood"/>
    </resultMap>

    <select id="getGoodAndCouponMap" resultMap="GoodCouponMap">
        SELECT * FROM Good WHERE id = #{id}
    </select>

//CouponMapper.xml文件
    <select id="getCouponFromGood" resultType="me.aihe.dao.Coupon">
        SELECT * FROM Coupon WHERE g_id = #{gid}
    </select>

//测试程序
  @Test
    public void test9(){
        InputStream inputStream = null;
        SqlSession sqlSession = null;
        try {
            inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory mSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = mSqlSessionFactory.openSession();

            GoodMapper goodMapper = sqlSession.getMapper(GoodMapper.class);
            Good good = goodMapper.getGoodAndCouponMap(1);
            System.out.println(good);

            sqlSession.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

运行结果

img_0cb0d8c08931a2d0df0807467a376a1e.png
测试结果

这里使用分布查询较为方便,嵌套结果集查询,可自行测试

总结

本文主要演示了Mybatis对数据库表与表之间有关联的时候的操作。

相关文章
|
11月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
1741 5
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
11月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
2710 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
11月前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
845 3
|
XML 缓存 Java
一文讲明Mybatis 的使用 超详细 【爆肝两万字教程】
文章提供了一份详尽的Mybatis使用教程,涵盖了Mybatis的简介、环境搭建、基本操作、配置解析、日志使用、分页、注解开发、多对一和一对多关系处理、动态SQL以及缓存机制等方面的内容,并提供了相应的代码示例和测试用例。
一文讲明Mybatis 的使用 超详细 【爆肝两万字教程】
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
1125 0
|
SQL XML Java
Mybatis进阶——动态SQL(1)
Mybatis进阶——动态SQL(1)
120 3
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
|
XML Java 数据库连接
Mybatis-Plus学习小项目及详细教程
Mybatis-Plus学习小项目及详细教程