医院信息化与智能化系统(1)
这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置
1、 MySQL准备
创建并初始化user数据库,后续为验证mybatis-plus(后续简称mp
)
2、确认idea配置
在新版IDEA中需要找到自定义->所有设置
(老版本可能还是Configure ->Setting
)
当然,如果你们找不到这个界面,一点开IDEA就跳转到项目中
,可以直接左上角关闭项目
就能回到下图界面了。
接着需要设置Java编译器中字节码版本为18
:目的是确保编译后的Java代码能够使用Java SE 18的特性和API。
使用UTF-8作为
默认编码,减少不同模块、文件和系统之间的编码冲突,提升代码的可维护性 和可移植性 。
此后别忘记把Maven的settings.xml
内部配置JDK版本为18、包括本地仓库地址设置、国内镜像配置,配置完成后再重写用户设置文件
和本地仓库
3、创建项目
初始化工程
使用 Spring Initializr 快速初始化一个 Spring Boot 工程
GAVP
,剩余的V
表示项目的版本号,P
表示项目的打包类型
Group(通常表示项目的组织或公司名):
com.study
Artifact(项目的名称):
mybatis_plus
spring-boot版本:
2.2.1.RELEASE (RELEASE表示这是一个稳定的、正式发布的版本。)
Spring Initializr
是一个在线工具,用于快速生成Spring Boot项目的骨架。它提供了一个用户友好的界面,允许你选择项目的依赖、构建工具、版本等。
可能遇到的问题:Java选不了8,不支持Java8版本,解决方法为换源
该解决方法来自此处
bash
https://start.aliyun.com/
引入相关依赖
mybatis-plus、mysql依赖、lombok依赖
其中lombok用来简化实体类,需要在插件中下载lombok
Mysql配置
- 这里的 url 使用了
?serverTimezone=GMT%2B8 后缀
,因为8.0版本的jdbc驱动需要添加这个后缀,否则运行测试报错 - 这里的
driver-class-name
使用了com.mysql.cj.jdbc.Driver
,在 jdbc 8 中 建议使用这个驱动,否则运行测试用例的时候会有 WARN 信息
bash
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
启动类
在配置好项目时,会自主创建一个配置类MybatisPlusApplication
(项目名称(驼峰命名法
)+Application )
驼峰命名法: 每个单词的首字母大写,且不使用下划线,例如 UserProfile。
在 Spring Boot 启动类中添加 @MapperScan 注解
,扫描 Mapper 文件夹
@MapperScan
是 MyBatis 提供的注解,用于自动扫描指定包中的 Mapper 接口,并将其注册为 MyBatis 的 Mapper。
Mapper
是用于定义 SQL 语句与 Java 方法映射的接口。每个 Mapper 接口通常对应一个 XML 文件,其中包含具体的 SQL 语句。
添加实体
创建entity文件夹并创建User类
创建时可以在类上方使用注解Data
,会自动生成 User 类的常用方法,如 getter、setter、toString、equals 和 hashCode 方法。
添加mapper
创建包 mapper 编写Mapper 接口: UserMapper.java
java
@Repository
public interface UserMapper extends BaseMapper <User> {
}
有两点要注意:
- 类上要添加
@Repository
注解,通过该注解,Spring 可以在自动扫描过程中识别并注册该 Mapper,使其作为Bean
被管理。 - 接口继承BaseMapper时,要指定类型
Userl类
,这样从 BaseMapper<User> 继承的方法(例如增、删、改、查)都将以 User 类型作为参数或返回值,明确了数据操作的对象。(BaseMapper接口提供的关于泛型的方法,都将默认泛型为User类
)
查看sql输出日志
在application.properties
内容后面添加一句
java
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
会在控制台输出
4、主键策略
MyBatis-Plus默认的主键策略是:ASSIGN_ID
通常用于分布式系统中生成全局唯一的主键。ASSIGN_ID 通常基于雪花算法(Snowflake Algorithm),可以生成 64 位的长整型 ID,保证了在高并发环境下生成的 ID 唯一性。
在 User 类中配置主键策略:通过 @TableId 注解
来指定主键字段,并将生成策略设为 IdType.ASSIGN_ID
。
java
// 主键ID,使用 ASSIGN_ID 策略生成全局唯一ID
@TableId(type = IdType.ASSIGN_ID)
private Long id;
AUTO 自增策略
是 MyBatis-Plus 提供的主键生成策略之一,表示使用数据库的自动递增功能生成主键。它依赖于数据库本身的主键自增机制,通常用于 MySQL 等支持 AUTO_INCREMENT 特性的数据库。
在 User 类中配置主键策略:通过 @TableId 注解
来指定主键字段,并将生成策略设为 IdType.AUTO
。
java
// 主键ID,使用数据库自增策略
@TableId(type = IdType.AUTO)
private Long id;
如果要想影响所有实体的配置,可以application.properties
设置全局主键配置
注意:
如果你设计的数据表的id不是自增的
,那么你设置以下操作就会报错!
bash
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
5、自动填充和乐观锁
修改操作
updateById()
通过主键 ID 来更新数据库中该记录的其他字段值
java
//修改
@Test
public void testUpdate() {
User user = new User();
user.setId(1340868235401764865L);
user.setName("lucymary");
int count = userMapper.updateById(user);
System.out.println(count);
}
自动填充
自动填充(Auto Fill)
是 MyBatis-Plus 提供的一种机制,用于在插入或更新数据时,自动
为某些字段填充特定的值。它可以帮助开发者减少手动赋值的工作,尤其是在处理诸如创建时间、更新时间、操作人等字段时。
- 在数据库中添加对应字段
- 实体类添加
create_time
、update_time
字段,注解分别表示,添加
操作和添加+更新
操作后进行对应值的添加
java
@TableField(fill = FieldFill.INSERT)
private Date createTime; //create_time
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time
- 创建类实现接口,一个方法:
添加执行
,一个方法:修改执行
其中metaObject
允许你通过反射访问和操作目标对象的字段
java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁
乐观锁
是一种用于并发控制的机制,常用于处理多线程环境下的数据一致性问题。当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新。
版本控制:
乐观锁通常通过维护一个版本号 (或时间戳)来实现。当数据被修改
时,版本号会增加
。在提交更新时,系统会检查当前版本号
是否与读取时的版本号
相同。如果相同,则可以更新;如果不同,说明有其他线程已经修改了数据,当前操作将失败。
- 数据库添加
version
字段 - 实体类添加字段,并在对应INSERT方法添加
对 version的默认值设置
this.setFieldValByName("version",1,metaObject);
java
@TableField(fill = FieldFill.INSERT)
@Version
private Integer version;
3.创建新的配置类MybatisPlusConfig
(原来创建的配置类不删除,只是把@MapperScan 扫描注解
移入该新创建的配置类中)
- 注册乐观锁插件
java
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
- 测试
java
@Test
public void testOptimisticLocker() throws InterruptedException {
// 模拟线程 A
Thread threadA = new Thread(() -> {
User userA = userMapper.selectById(6);
userA.setName("A Thread");
int resultA = userMapper.updateById(userA);
System.out.println("线程A更新结果:" + resultA);
});
// 模拟线程 B
Thread threadB = new Thread(() -> {
User userB = userMapper.selectById(6);
userB.setName("B Thread");
int resultB = userMapper.updateById(userB);
System.out.println("线程B更新结果:" + resultB);
});
// 启动线程
threadA.start();
threadB.start();
try {
// 等待线程A和线程B执行完毕
threadA.join();
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- 结果