Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

目前已经更新到了:

  • MyBatis(正在更新)

一对一

数据库中的 1对1 模型

在数据库设计中,1对1模型(One-to-One Relationship)是一种实体关系,用于表示两张表之间一条记录只能关联另一张表中的一条记录的关系。

1对1关系的特点

  • 唯一性:表A中的每一行记录只能与表B中的一行记录关联,反之亦然。
  • 严格的映射:两张表的数据关系是一一对应的。
  • 逻辑层面:通常用于将一个实体的不同属性分离存储。

常见的应用场景

  • 数据拆分:用于将经常访问的字段和不经常访问的字段分离,以优化性能。例如,用户的基本信息和敏感信息可以分表存储。表1:用户信息(如用户名、邮箱)、表2:用户敏感信息(如身份证号、密码)
  • 权限控制:例如,存储一个用户及其角色权限配置,用户和权限之间通常是一对一关系。
  • 扩展功能:将一个主表的扩展数据存储到另一张表,以便灵活扩展数据结构。

优点分析

  • 模块化设计:将数据分成不同表,便于维护和管理。
  • 安全性提升:敏感信息可以单独存储并设置更高的权限控制。
  • 性能优化:分表存储减少单表的数据量,提升查询效率。

缺点分析

  • 查询复杂性增加:需要进行表的连接查询(JOIN),可能增加性能开销。
  • 维护难度加大:需要严格设计和维护表之间的关系,避免数据不一致。
  • 事务管理成本:跨表操作需要在事务中处理,以确保数据一致性。

查询模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户,此时查询一个订单,与此同时查询出改订单的所属用户。

创建表

sql 复制代码
CREATE TABLE `wzk_orders` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ordertime` varchar(255) DEFAULT NULL,
  `total` double DEFAULT NULL,
  `uid` int(11) DEFAULT NULL,![请添加图片描述](https://i-blog.csdnimg.cn/direct/2ca17a1cb011482d922a9c970d8dff81.png)

  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

CREATE TABLE `wzk_user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `birthday` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

插入数据

wzk_user 表数据如下:

wzk_orders 表数据如下:

查询语句

对应的 SQL 语句如下:

sql 复制代码
select * from wzk_orders o, wzk_user u where o.uid=u.id

查询结果如下所示:

创建类

WzkOrder

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkOrder {
    private int id;
    private Date ordertime;
    private double total;
    private WzkUser user;
}

WzkUser

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WzkUser {
    private int id;
    private String username;
    private String password;
    private Date birthday;
}

OrderMapper

java 复制代码
public interface OrderMapper {

    List<WzkOrder> findAll();

}

OrderMapper.xml

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="icu.wzk.mapper.OrderMapper">
    <!-- 写法一 -->
    <resultMap id="orderMap" type="icu.wzk.model.WzkOrder">
        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>
        <result column="birthday" property="user.birthday"></result>
    </resultMap>

    <!-- 写法二 -->
<!--    <resultMap id="orderMap" type="icu.wzk.model.WzkOrder">-->
<!--        <result property="id" column="id"></result>-->
<!--        <result property="ordertime" column="ordertime"></result>-->
<!--        <result property="total" column="total"></result>-->
<!--        <association property="user" javaType="icu.wzk.model.WzkUser">-->
<!--            <result column="uid" property="id"></result>-->
<!--            <result column="username" property="username"></result>-->
<!--            <result column="password" property="password"></result>-->
<!--            <result column="birthday" property="birthday"></result>-->
<!--        </association>-->
<!--    </resultMap>-->

    <select id="findAll" resultMap="orderMap">
        select * from wzk_orders o, wzk_user u where o.uid=u.id
    </select>
</mapper>

sqlMapConfig.xml

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>
    <properties>
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://172.16.1.130:3306/wzk-mybatis?characterEncoding=utf-8"/>
        <property name="user" value="hive"/>
        <property name="password" value="hive@wzk.icu"/>
    </properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driverClass}"/>
                <property name="url" value="${jdbcUrl}"/>
                <property name="username" value="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper.xml"/>
        <!-- 新增的 OrderMapper -->
        <mapper resource="OrderMapper.xml"/>
    </mappers>
</configuration>

编写代码

java 复制代码
public class WzkIcu08 {
    public static void main(String[] args) throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        List<WzkOrder> dataList = orderMapper.findAll();
        dataList.forEach(System.out::println);
        sqlSession.close();
    }
}

编写的代码如下图所示:

运行结果

运行之后,对应的控制台输出结果如下:

shell 复制代码
24/11/12 16:51:34 DEBUG OrderMapper.findAll: <==      Total: 3
WzkOrder(id=1, ordertime=Mon Nov 11 00:00:00 CST 2024, total=100.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024))
WzkOrder(id=2, ordertime=Mon Nov 11 00:00:00 CST 2024, total=200.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024))
WzkOrder(id=3, ordertime=Sun Nov 10 00:00:00 CST 2024, total=150.0, user=WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024))

对应的截图如下所示:

注意事项

  • 数据一致性:必须确保表A和表B之间的引用完整性,避免孤立记录(Orphan Records)。
  • 索引设计:为外键列创建索引,以提升连接查询性能。
  • 场景适配:如果没有明显的1对1关系需求,建议尽量避免使用,以简化设计。
相关推荐
我叫啥都行几秒前
计算机基础复习12.22
java·jvm·redis·后端·mysql
寻找沙漠的人7 分钟前
JavaEE 导读与环境配置
java·spring boot·java-ee
Code out the future14 分钟前
【C++——临时对象,const T&】
开发语言·c++
taoyong00117 分钟前
Java线程核心01-中断线程的理论原理
java·开发语言
一雨方知深秋18 分钟前
智慧商城:封装getters实现动态统计 + 全选反选功能
开发语言·javascript·vue2·foreach·find·every
海威的技术博客20 分钟前
关于JS中的this指向问题
开发语言·javascript·ecmascript
Yhame.43 分钟前
Java 集合框架中的 List、ArrayList 和 泛型 实例
java
coding侠客44 分钟前
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘
java·spring boot·后端
froginwe111 小时前
PostgreSQL表达式的类型
开发语言
明矾java1 小时前
Mysql-SQL执行流程解析
数据库·sql·mysql