医院信息化与智能化系统(1)

医院信息化与智能化系统(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配置

  1. 这里的 url 使用了 ?serverTimezone=GMT%2B8 后缀,因为8.0版本的jdbc驱动需要添加这个后缀,否则运行测试报错
  2. 这里的 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> {
}

有两点要注意:

  1. 类上要添加@Repository注解,通过该注解,Spring 可以在自动扫描过程中识别并注册该 Mapper,使其作为 Bean 被管理。
  2. 接口继承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 提供的一种机制,用于在插入或更新数据时,自动为某些字段填充特定的值。它可以帮助开发者减少手动赋值的工作,尤其是在处理诸如创建时间、更新时间、操作人等字段时。

  1. 在数据库中添加对应字段
  2. 实体类添加create_timeupdate_time字段,注解分别表示,添加操作和添加+更新操作后进行对应值的添加
java 复制代码
@TableField(fill = FieldFill.INSERT)
private Date createTime;  //create_time

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time
  1. 创建类实现接口,一个方法:添加执行,一个方法:修改执行
    其中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);
    }
}

乐观锁

乐观锁是一种用于并发控制的机制,常用于处理多线程环境下的数据一致性问题。当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新。

版本控制:乐观锁通常通过维护一个版本号 (或时间戳)来实现。当数据被修改时,版本号会增加。在提交更新时,系统会检查当前版本号是否与读取时的版本号相同。如果相同,则可以更新;如果不同,说明有其他线程已经修改了数据,当前操作将失败。

  1. 数据库添加version字段
  2. 实体类添加字段,并在对应INSERT方法添加对 version的默认值设置
    this.setFieldValByName("version",1,metaObject);
java 复制代码
@TableField(fill = FieldFill.INSERT)
@Version
private Integer version;

3.创建新的配置类MybatisPlusConfig(原来创建的配置类不删除,只是把@MapperScan 扫描注解移入该新创建的配置类中)

  1. 注册乐观锁插件
java 复制代码
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
  1. 测试
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();
        }

    }
  1. 结果

相关推荐
xyliiiiiL3 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing4 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息2 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
程序猿chen2 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算