mybatis进阶(1)--高级映射之数据模型分析

本文介绍了MyBatis中输入输出映射的概念及应用,包括简单类型、POJO和HashMap等,并深入探讨了高级映射技巧,如1对1和1对多的关联映射。此外,还通过具体案例——订单系统,分析了数据库表间的关系,帮助读者更好地理解如何在实际项目中运用这些映射技巧。

1.先回顾下我们之前的输入输出映射
parameterType和resultType是对sql执行进行入出映射,可以是一些简单类型,pojo,hashmap等
2.高级映射
将关联映射的列查询映射到一个pojo属性中。(1对1)
将关联映射的列查询映射到List<pojo>属性中。(1对多)
3.订单中的映射需求
数据模型分析思路:
(1)每张表记录的数据内容
分模块对每张表记录的内容进行熟悉,了解系统需求,需求也就对应功能
(2)每张表的重要字段的设置
非空字段,外键字段
(3)数据库级别表与表之间的关系
晚间关系
(4)表与表之间的业务关系
在分析表与表的业务关系时一定要建立在某个业务意义基础上去分析

  1. 数据模型分析:
    (1)每张表记录的数据内容
    user:用户表
    记录了购买商品的用户信息
    这里写图片描述
    items:商品表
    记录了商品信息
    这里写图片描述
    orders:订单表
    记录了用户所创建的订单(购买商品的订单)
    这里写图片描述
    orderdetail:订单明细表
    记录了订单的详细信息即购买商品的信息
    这里写图片描述

(2)每张表的重要字段的设置
user:username
items:name,price
orders:number订单号,user_id外键
orderdetail:orders_id外键,items_id外键
(3)数据库级别表与表之间的关系
orders:number订单号,user_id外键
orderdetail:orders_id外键,items_id外键
(4)表与表之间的业务关系
user —> orders: 一个用户可以创建多个订单,一对多
orders —>user: 一个订单只由一个用户创建,一对一
orders —>orderdetail: 一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的信息在orderdetail中记录,一对多
orderdetail —>orders:一个明细只能在一个订单中,一对一
orderdetail —>items:一个订单明细只对应一个商品信息,一对一
items —>orderdetail:一个商品可以包括在多个明细中
orders和items之间间接通过orderdetail有关系:多对多
user和items之间间接通过orders有关系:多对多

### MyBatis高级用法与技巧 #### 1. 动态 SQL 动态 SQL 是 MyBatis 中非常强大的功能之一,允许开发者根据条件构建灵活的 SQL 查询语句。通过 `<if>`、`<choose>`、`<when>` 和 `<otherwise>` 等标签可以实现复杂的查询逻辑。 ```xml <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 1 <if test="title != null"> AND title like #{title} </if> </select> ``` 此方法能够显著减少硬编码 SQL 并提高代码可维护性[^3]。 #### 2. 缓存机制 MyBatis 提供了一级缓存(Session 级别)和二级缓存(Mapper 级别)。合理利用缓存可以有效降低数据库访问频率并提升性能。 - **一级缓存**: 默认开启,在同一个 SqlSession 范围内生效。 - **二级缓存**: 需要手动启用,并在 Mapper 文件中声明 `cache` 或者引入第三方缓存框架如 EhCache。 ```xml <mapper namespace="com.example.mapper.BlogMapper"> <!-- 启用二级缓存 --> <cache/> <select id="getBlogById" parameterType="int" resultType="Blog"> SELECT * FROM Blog WHERE id = #{id} </select> </mapper> ``` 注意:当启用了二级缓存时,应确保数据一致性问题得到妥善处理[^3]。 #### 3. 插件开发 MyBatis 支持自定义插件来拦截执行链中的某些操作,比如日志记录、性能监控或者分页支持。官方推荐使用的 PageHelper 就是一个典型的例子。 配置方式如下: ```xml <!--mybatis-config.xml 中添加插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> </plugin> </plugins> ``` 此外还可以编写自己的插件类继承 `org.apache.ibatis.plugin.Interceptor` 接口完成特定需求[^3]。 #### 4. 结果映射复杂关系 对于存在关联表的情况,可以通过嵌套结果集的方式简化对象之间的映射过程。 假设有一个博客及其作者的关系模型,则可以在 XML 映射文件里这样写: ```xml <resultMap id="blogResultMap" type="Blog"> <association property="author" javaType="Author"> <id column="author_id" property="id"/> <result column="username" property="name"/> </association> </resultMap> <select id="selectBlogWithAuthor" resultMap="blogResultMap"> SELECT b.*, a.id AS author_id, a.username FROM blog b LEFT JOIN author a ON b.author_id = a.id </select> ``` 这种方法使得即使面对多层嵌套的数据结构也变得清晰易懂。 #### 5. 使用注解替代XML 如果不喜欢基于 XML 的配置风格,也可以采用纯 Java 注解的方式来定义SQL语句。这种方式更加紧凑直观但可能牺牲部分灵活性。 例如下面这段代码实现了同样的效果: ```java @Select("SELECT * FROM users WHERE username=#{username}") User findUserByUsername(@Param("username") String userName); ``` 不过需要注意的是并非所有的特性都能完全由注解决定,因此实际项目中通常会混合使用两者。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值