4 changed files with 379 additions and 0 deletions
-
BIN尹顺宇学习笔记/尹顺宇11.08作业/尹顺宇11.08学习总结.docx
-
379尹顺宇学习笔记/尹顺宇11.08作业/尹顺宇11.08学习笔记.md
-
BIN尹顺宇学习笔记/尹顺宇11.08作业/尹顺宇11.08学习笔记.pdf
-
BIN尹顺宇学习笔记/尹顺宇11.08作业/尹顺宇11.08股票知识学习.docx
@ -0,0 +1,379 @@ |
|||||
|
# Mybatis初步复习 |
||||
|
|
||||
|
## 1.SpringBoot整合Mybatis |
||||
|
|
||||
|
## 1.1第一步添加依赖 |
||||
|
|
||||
|
``` |
||||
|
<!-- mybatis启动器--> |
||||
|
|
||||
|
<dependency> |
||||
|
<groupId>org.mybatis.spring.boot</groupId> |
||||
|
<artifactId>mybatis-spring-boot-starter</artifactId> |
||||
|
<version>3.0.5</version> |
||||
|
</dependency> |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
|
||||
|
|
||||
|
### 1.2进行配置 |
||||
|
|
||||
|
``` |
||||
|
#配置Mybatis |
||||
|
mybatis: |
||||
|
configuration: |
||||
|
#在映射为java对象,将表中的下划线命名自动转换成驼峰式命名 |
||||
|
map-underscore-to-camel-case: true |
||||
|
#日志前缀 可选 |
||||
|
log-prefix: mybatis. |
||||
|
#日志实现类 可选 |
||||
|
log-impl: org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl |
||||
|
#动态sql文件存储位置 |
||||
|
mapper-locations: classpath:/mapper/**/*.xml |
||||
|
|
||||
|
#配置日志显示sql |
||||
|
logging: |
||||
|
level: |
||||
|
#指定日志前缀 |
||||
|
mybatis: debug |
||||
|
|
||||
|
|
||||
|
``` |
||||
|
|
||||
|
### 1.3 在Dao层编写的mapper接口,添加@Mapper注解 |
||||
|
|
||||
|
 |
||||
|
|
||||
|
### 1.4 编写动态sql文件(xx.xml文件) |
||||
|
|
||||
|
 |
||||
|
|
||||
|
### 1.5 安装mybatisx插件 |
||||
|
|
||||
|
 |
||||
|
|
||||
|
安装之后在mapper和动态SQL文件对应代码左边有一个小鸟图标,方便直接跳转 |
||||
|
|
||||
|
 |
||||
|
|
||||
|
## 2.自动映射 |
||||
|
|
||||
|
当开启驼峰命名自动映射 |
||||
|
|
||||
|
```yaml |
||||
|
mybatis: |
||||
|
configuration: |
||||
|
map-underscore-to-camel-case: true |
||||
|
``` |
||||
|
|
||||
|
## 3.手动映射 |
||||
|
|
||||
|
当自动映射无法满足需求时,可以使用 `<resultMap>` 进行精确的手动映射。 |
||||
|
|
||||
|
```xml |
||||
|
<resultMap id="唯一标识" type="要映射的Java类型"> |
||||
|
<!-- 主键映射 --> |
||||
|
<id property="Java属性名" column="数据库列名"/> |
||||
|
|
||||
|
<!-- 普通字段映射 --> |
||||
|
<result property="Java属性名" column="数据库列名"/> |
||||
|
|
||||
|
<!-- 关联关系映射 --> |
||||
|
<association property="关联对象属性" javaType="关联对象类型"/> |
||||
|
<collection property="集合属性" ofType="集合元素类型"/> |
||||
|
</resultMap> |
||||
|
``` |
||||
|
|
||||
|
举例: |
||||
|
|
||||
|
### 3.1基础字段映射 |
||||
|
|
||||
|
```java |
||||
|
实体类 |
||||
|
public class User { |
||||
|
private Long userId; // 与数据库字段名不同 |
||||
|
private String userName; // 需要手动映射 |
||||
|
private String email; |
||||
|
private Integer status; |
||||
|
private LocalDateTime createTime; |
||||
|
private LocalDateTime updateTime; |
||||
|
|
||||
|
// 构造函数、getter、setter... |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
```sql |
||||
|
数据库表结构: |
||||
|
CREATE TABLE t_user ( |
||||
|
id BIGINT PRIMARY KEY, |
||||
|
name VARCHAR(50), |
||||
|
email VARCHAR(100), |
||||
|
status TINYINT, |
||||
|
created_at DATETIME, |
||||
|
updated_at DATETIME |
||||
|
); |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
```xml |
||||
|
<!-- 基础手动映射示例 --> |
||||
|
<resultMap id="BaseUserMap" type="User"> |
||||
|
<!-- 主键字段,使用 id 标签 --> |
||||
|
<id property="userId" column="id"/> |
||||
|
|
||||
|
<!-- 普通字段,使用 result 标签 --> |
||||
|
<result property="userName" column="name"/> |
||||
|
<result property="email" column="email"/> |
||||
|
<result property="status" column="status"/> |
||||
|
<result property="createTime" column="created_at"/> |
||||
|
<result property="updateTime" column="updated_at"/> |
||||
|
</resultMap> |
||||
|
|
||||
|
<!-- 使用 resultMap --> |
||||
|
<select id="selectUserById" resultMap="BaseUserMap"> |
||||
|
SELECT id, name, email, status, created_at, updated_at |
||||
|
FROM t_user |
||||
|
WHERE id = #{id} |
||||
|
</select> |
||||
|
``` |
||||
|
|
||||
|
说明: |
||||
|
|
||||
|
 |
||||
|
|
||||
|
### 3.2一对一关联映射 |
||||
|
|
||||
|
#### 3.2.1单次查询嵌套结果映射 |
||||
|
|
||||
|
举例: |
||||
|
|
||||
|
```java |
||||
|
实体类 |
||||
|
public class User { |
||||
|
private Long userId; |
||||
|
private String userName; |
||||
|
private UserProfile userProfile; // 一对一关联 |
||||
|
// getter/setter... |
||||
|
} |
||||
|
|
||||
|
public class UserProfile { |
||||
|
private Long profileId; |
||||
|
private Long userId; |
||||
|
private String realName; |
||||
|
private Integer age; |
||||
|
private String address; |
||||
|
private String phone; |
||||
|
// getter/setter... |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
```xml |
||||
|
手动映射配置: |
||||
|
<!-- 用户和用户详情的一对一映射 --> |
||||
|
<resultMap id="UserWithProfileMap" type="User"> |
||||
|
<id property="userId" column="id"/> |
||||
|
<result property="userName" column="name"/> |
||||
|
|
||||
|
<!-- association: 一对一关联映射 --> |
||||
|
<association property="userProfile" javaType="UserProfile"> |
||||
|
<id property="profileId" column="profile_id"/> |
||||
|
<result property="userId" column="id"/> <!-- 注意:这里复用外层查询的id --> |
||||
|
<result property="realName" column="real_name"/> |
||||
|
<result property="age" column="age"/> |
||||
|
<result property="address" column="address"/> |
||||
|
<result property="phone" column="phone"/> |
||||
|
</association> |
||||
|
</resultMap> |
||||
|
|
||||
|
<!-- 关联查询SQL --> |
||||
|
<select id="selectUserWithProfile" resultMap="UserWithProfileMap"> |
||||
|
SELECT |
||||
|
u.id, u.name, |
||||
|
up.id as profile_id, up.real_name, up.age, up.address, up.phone |
||||
|
FROM t_user u |
||||
|
LEFT JOIN t_user_profile up ON u.id = up.user_id |
||||
|
WHERE u.id = #{userId} |
||||
|
</select> |
||||
|
``` |
||||
|
|
||||
|
#### 3.2.2 多次查询嵌套查询映射 |
||||
|
|
||||
|
```xml |
||||
|
<!-- 主结果映射 --> |
||||
|
<resultMap id="UserWithProfileNestedMap" type="User"> |
||||
|
<id property="userId" column="id"/> |
||||
|
<result property="userName" column="name"/> |
||||
|
|
||||
|
<!-- 嵌套查询:通过 select 属性引用另一个查询 --> |
||||
|
<association property="userProfile" column="id" |
||||
|
select="selectUserProfileByUserId"/> |
||||
|
</resultMap> |
||||
|
|
||||
|
<!-- 主查询 --> |
||||
|
<select id="selectUserWithProfileNested" resultMap="UserWithProfileNestedMap"> |
||||
|
SELECT id, name |
||||
|
FROM t_user |
||||
|
WHERE id = #{userId} |
||||
|
</select> |
||||
|
|
||||
|
<!-- 嵌套查询 --> |
||||
|
<select id="selectUserProfileByUserId" resultType="UserProfile"> |
||||
|
SELECT |
||||
|
id as profileId, |
||||
|
user_id as userId, |
||||
|
real_name as realName, |
||||
|
age, address, phone |
||||
|
FROM t_user_profile` |
||||
|
WHERE user_id = #{userId} |
||||
|
</select> |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
|
||||
|
### 3.3一对多集合映射 |
||||
|
|
||||
|
```java |
||||
|
实体类: |
||||
|
public class User { |
||||
|
private Long userId; |
||||
|
private String userName; |
||||
|
private List<Order> orders; // 一对多关联 |
||||
|
// getter/setter... |
||||
|
} |
||||
|
|
||||
|
public class Order { |
||||
|
private Long orderId; |
||||
|
private Long userId; |
||||
|
private String orderNumber; |
||||
|
private BigDecimal amount; |
||||
|
private LocalDateTime orderTime; |
||||
|
// getter/setter... |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
```xml |
||||
|
<!-- 用户和订单的一对多映射 --> |
||||
|
<resultMap id="UserWithOrdersMap" type="User"> |
||||
|
<id property="userId" column="id"/> |
||||
|
<result property="userName" column="name"/> |
||||
|
|
||||
|
<!-- collection: 一对多关联映射 --> |
||||
|
<collection property="orders" ofType="Order"> |
||||
|
<id property="orderId" column="order_id"/> |
||||
|
<result property="userId" column="id"/> <!-- 注意:这里复用外层查询的id --> |
||||
|
<result property="orderNumber" column="order_number"/> |
||||
|
<result property="amount" column="amount"/> |
||||
|
<result property="orderTime" column="order_time"/> |
||||
|
</collection> |
||||
|
</resultMap> |
||||
|
|
||||
|
<!-- 关联查询SQL --> |
||||
|
<select id="selectUserWithOrders" resultMap="UserWithOrdersMap"> |
||||
|
SELECT |
||||
|
u.id, u.name, |
||||
|
o.id as order_id, o.order_number, o.amount, o.order_time |
||||
|
FROM t_user u |
||||
|
LEFT JOIN t_order o ON u.id = o.user_id |
||||
|
WHERE u.id = #{userId} |
||||
|
</select> |
||||
|
``` |
||||
|
|
||||
|
### 3.4复杂的多层嵌套 |
||||
|
|
||||
|
```java |
||||
|
public class User { |
||||
|
private Long userId; |
||||
|
private String userName; |
||||
|
private List<Order> orders; |
||||
|
} |
||||
|
|
||||
|
public class Order { |
||||
|
private Long orderId; |
||||
|
private String orderNumber; |
||||
|
private List<OrderItem> orderItems; |
||||
|
} |
||||
|
|
||||
|
public class OrderItem { |
||||
|
private Long itemId; |
||||
|
private Long productId; |
||||
|
private Integer quantity; |
||||
|
private Product product; // 关联商品 |
||||
|
} |
||||
|
|
||||
|
public class Product { |
||||
|
private Long productId; |
||||
|
private String productName; |
||||
|
private BigDecimal price; |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
```xml |
||||
|
<!-- 完整的多层嵌套映射 --> |
||||
|
<resultMap id="CompleteUserMap" type="User"> |
||||
|
<id property="userId" column="user_id"/> |
||||
|
<result property="userName" column="user_name"/> |
||||
|
|
||||
|
<!-- 第一层嵌套:订单集合 --> |
||||
|
<collection property="orders" ofType="Order" resultMap="OrderWithItemsMap"/> |
||||
|
</resultMap> |
||||
|
|
||||
|
<resultMap id="OrderWithItemsMap" type="Order"> |
||||
|
<id property="orderId" column="order_id"/> |
||||
|
<result property="orderNumber" column="order_number"/> |
||||
|
|
||||
|
<!-- 第二层嵌套:订单项集合 --> |
||||
|
<collection property="orderItems" ofType="OrderItem" resultMap="OrderItemMap"/> |
||||
|
</resultMap> |
||||
|
|
||||
|
<resultMap id="OrderItemMap" type="OrderItem"> |
||||
|
<id property="itemId" column="item_id"/> |
||||
|
<result property="quantity" column="quantity"/> |
||||
|
|
||||
|
<!-- 第三层嵌套:商品信息 --> |
||||
|
<association property="product" javaType="Product"> |
||||
|
<id property="productId" column="product_id"/> |
||||
|
<result property="productName" column="product_name"/> |
||||
|
<result property="price" column="price"/> |
||||
|
</association> |
||||
|
</resultMap> |
||||
|
|
||||
|
<!-- 复杂查询SQL --> |
||||
|
<select id="selectUserWithOrderDetails" resultMap="CompleteUserMap"> |
||||
|
SELECT |
||||
|
u.id as user_id, u.name as user_name, |
||||
|
o.id as order_id, o.order_number, |
||||
|
oi.id as item_id, oi.quantity, |
||||
|
p.id as product_id, p.name as product_name, p.price |
||||
|
FROM t_user u |
||||
|
LEFT JOIN t_order o ON u.id = o.user_id |
||||
|
LEFT JOIN t_order_item oi ON o.id = oi.order_id |
||||
|
LEFT JOIN t_product p ON oi.product_id = p.id |
||||
|
WHERE u.id = #{userId} |
||||
|
ORDER BY o.order_time DESC, oi.id |
||||
|
</select> |
||||
|
``` |
||||
|
|
||||
|
### 3.5.注意 |
||||
|
|
||||
|
1.可以 自动映射与手动映射结合 |
||||
|
|
||||
|
```xml |
||||
|
<!-- 混合映射:autoMapping="true" 开启自动映射 --> |
||||
|
<resultMap id="HybridUserMap" type="User" autoMapping="true"> |
||||
|
<!-- 只手动映射名称不匹配的字段 --> |
||||
|
<id property="userId" column="id"/> |
||||
|
<result property="userName" column="name"/> |
||||
|
<result property="createTime" column="created_at"/> |
||||
|
|
||||
|
<!-- 关联对象也可以使用自动映射 --> |
||||
|
<association property="userProfile" javaType="UserProfile" autoMapping="true"> |
||||
|
<id property="profileId" column="profile_id"/> |
||||
|
<!-- 只覆盖需要特殊处理的字段 --> |
||||
|
<result property="realName" column="real_name"/> |
||||
|
</association> |
||||
|
</resultMap> |
||||
|
``` |
||||
|
|
||||
|
## |
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue