医院信息化与智能化系统(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. 结果

相关推荐
Ling_suu24 分钟前
SpringBoot3——Web开发
java·服务器·前端
天使day40 分钟前
SpringMVC
java·spring·java-ee
CodeClimb1 小时前
【华为OD-E卷-简单的自动曝光 100分(python、java、c++、js、c)】
java·python·华为od
风清云淡_A1 小时前
【java基础系列】实现数字的首位交换算法
java·算法
Gao_xu_sheng1 小时前
Java程序打包成exe,无Java环境也能运行
java·开发语言
大卫小东(Sheldon)1 小时前
Java的HTTP接口测试框架Gatling
java
谢家小布柔1 小时前
java中的继承
java·开发语言
l138494274511 小时前
Java每日一题(2)
java·开发语言·游戏
苹果醋31 小时前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
WANGWUSAN662 小时前
Python高频写法总结!
java·linux·开发语言·数据库·经验分享·python·编程