医院信息化与智能化系统(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版本,解决方法为换源

该解决方法来自此处

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 信息
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

@Repository
public interface UserMapper extends BaseMapper <User> {
}

有两点要注意:

  1. 类上要添加@Repository注解,通过该注解,Spring 可以在自动扫描过程中识别并注册该 Mapper,使其作为 Bean 被管理。
  2. 接口继承BaseMapper时,要指定类型Userl类,这样从 BaseMapper<User> 继承的方法(例如增、删、改、查)都将以 User 类型作为参数或返回值,明确了数据操作的对象。(BaseMapper接口提供的关于泛型的方法,都将默认泛型为User类

查看sql输出日志

application.properties内容后面添加一句

#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

 // 主键ID,使用 ASSIGN_ID 策略生成全局唯一ID
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

AUTO 自增策略是 MyBatis-Plus 提供的主键生成策略之一,表示使用数据库的自动递增功能生成主键。它依赖于数据库本身的主键自增机制,通常用于 MySQL 等支持 AUTO_INCREMENT 特性的数据库。

在 User 类中配置主键策略:通过 @TableId 注解来指定主键字段,并将生成策略设为 IdType.AUTO

    // 主键ID,使用数据库自增策略
    @TableId(type = IdType.AUTO)
    private Long id;

如果要想影响所有实体的配置,可以application.properties设置全局主键配置
注意:如果你设计的数据表的id不是自增的,那么你设置以下操作就会报错!

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

5、自动填充和乐观锁

修改操作

updateById() 通过主键 ID 来更新数据库中该记录的其他字段值

//修改
@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字段,注解分别表示,添加操作和添加+更新操作后进行对应值的添加
@TableField(fill = FieldFill.INSERT)
private Date createTime;  //create_time

@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time
  1. 创建类实现接口,一个方法:添加执行,一个方法:修改执行
    其中metaObject允许你通过反射访问和操作目标对象的字段
@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);
@TableField(fill = FieldFill.INSERT)
@Version
private Integer version;

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

/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
  1. 测试
 @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. 结果
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.计算机网络_抓包工具wireshark

安装 Linux中安装wireshark&#xff1a; sudo apt-get install wireshark Linux中执行wireshark&#xff1a; sudo wireshark 使用 注意&#xff1a;只有与外网交互的数据才可以被wireshark抓到&#xff0c;本机回环的数据不会被抓到 实验内容&#xff1a; 使用nc命令…

爬虫(反调试)

其实就是一种给页面反爬机制&#xff0c;一般页面用不到。 万能解决反调试方法&#xff1a;

数据结构 -- 排序算法

一 排序 1.1 排序的概念 所谓排序&#xff0c;就是一种使一串数据记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减地组织起来的操作。 从排序方式上&#xff0c;排序算法一般被分为比较排序和非比较排序。从比较排序的内容上&#xff0c;它一般被分为…

页面局部使用vue等框架其它部分用JQuery进行交互

这个需求是原有django在网页需要定制一个人员签到信息。状态有三种&#xff0c;在岗&#xff0c;下班。好吧两种。但是你想 1&#xff0c;1.这是两次、共四个可能&#xff0c;00&#xff0c; 10&#xff0c;01&#xff0c;11.其中00是在家。10是在岗。01是。不签到只签退&#…

程序员转行方向推荐

对于程序员转行方向的推荐&#xff0c;可以基于当前的技术趋势、市场需求以及程序员的个人技能和兴趣来综合考虑。以下是一些推荐的转行方向&#xff1a; 伴随着社会的发展&#xff0c;网络安全被列为国家安全战略的一部分&#xff0c;因此越来越多的行业开始迫切需要网安人员…

Web Storage:数据储存机制

前言 在HTML5之前&#xff0c;开发人员一般是通过使用Cookie在客户端保存一些简单的信息的。在HTML5发布后&#xff0c;提供了一种新的客户端本地保存数据的方法&#xff0c;那就是Web Storage&#xff0c;它也被分为&#xff1a;LocalStorage和SessionStorage&#xff0c;它允…

配合工具,快速学习与体验electron增量更新

有任何问题&#xff0c;都可以私信博主&#xff0c;共同探讨学习。 正文开始 前言一、如何使用源码1.1 下载代码1.2 下载资源1.3 运行项目 二、如何使用工具2.1 打包新版本更新包2.2 创建nginx文件服务器2.3 在文件服务器保存软件更新包 三、如何测试更新3.1本地运行低版本3.2 …

centos 8.4学习小结

1.权限委派 2.vim快捷方式 2.1非正常关闭文本处理方式 2.2快捷方式 2.3TAB键补齐安装包 [ rootcloud Packages]# rpm -ivh bash-completion-2.7-5.el8.noarch.rpm 2.4#history 查询历史记录 [rootcloud ~]# vim /etc/profile HISTSIZE1000&#xff08;默认保存1000条历史记…

C++求日期差值题目

C日期差值题目&#xff08;牛客网&#xff09;题目超链接 仅个人思路不是最优解 仔细阅读地题目&#xff0c;要求输入连续的两串数字表示两个日期 所以我感觉日期类不太方便&#xff08;也许是我实力不允许&#xff09; cin使用起来就不太方便&#xff0c;我这里选择使用sca…

Spark的安装配置及集群搭建

Spark的本地安装配置&#xff1a; 我们用scala语言编写和操作spark&#xff0c;所以先要完成scala的环境配置 1、先完成Scala的环境搭建 下载Scala插件&#xff0c;创建一个Maven项目&#xff0c;导入Scala依赖和插件 scala依赖 <dependency><groupId>org.scal…

【途牛旅游网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Java多线程--实现跑马小游戏

线程的实现方式 继承Thread类&#xff1a;void run()方法没有返回值&#xff0c;无法抛异常实现Runnable接口&#xff1a;void run()方法没有返回值&#xff0c;无法抛异常实现Callable接口&#xff1a;V call() throws Exception 返回结果&#xff0c;能够抛异常 实现Callab…

《Windows PE》6.4.2 远程注入DLL

实验四十七&#xff1a;远程注入DLL 写一个窗口程序&#xff0c;将一个dll通过远程注入的方法&#xff0c;注入到第三章的示例程序PEHeader.exe中&#xff0c;支持32位和64位PE。 ●dll.c /*------------------------------------------------------------------------FileNam…

【实战案例】JSR303统一校验与SpringBoot项目的整合

前后端分离项目中&#xff0c;当前前端请求后端接口的时候通常需要传输参数&#xff0c;对于参数的校验应该在哪一步进行校验&#xff1f;Controller中还是Service中&#xff1f;答案是都需要校验&#xff0c;只不过负责的板块不一样&#xff0c;Controller中通常校验请求参数的…

OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口中图像的矩形区域。 该函数 getWindowImageRect 返回图像渲染区域的客户端屏幕坐标、宽度和高度。 函数原型 Rect cv::getWindowImage…

上海亚商投顾:沪指失守3200点 房地产板块集体下挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天冲高回落&#xff0c;沪指尾盘跌超1%&#xff0c;失守3200点关口。网络安全概念开盘大涨&#xff0c;…

Kaggle竞赛的流程 —— 手把手讲述如何完成一次kaggle比赛

Kaggle竞赛的工作流程&#xff1a; 1、加入竞赛&#xff1a; 看一下竞赛的描述&#xff0c;了解具体任务和数据集的情况之后&#xff0c;如果比较感兴趣这个比赛。点击Join Competition按钮&#xff0c;接受竞赛规则后&#xff0c;就可以访问比赛数据集啦。如下图所示&#xf…

08_实现 reactive

目录 编写 reactive 的函数签名处理对象的其他行为拦截 in 操作符拦截 for...in 循环delete 操作符 处理边界新旧值发生变化时才触发依赖的情况处理从原型上继承属性的情况处理一个对象已经是代理对象的情况处理一个原始对象已经被代理过一次之后的情况 浅响应与深响应代理数组…

Leetcode 跳跃游戏 二

核心任务是找出从数组的起点跳到终点所需的最小跳跃次数。 这段代码解决的是“跳跃游戏 II”&#xff08;Leetcode第45题&#xff09;&#xff0c;其核心任务是找出从数组的起点跳到终点所需的最小跳跃次数。 class Solution {public int jump(int[] nums) {//首先处理特殊情…

LabVIEW提高开发效率技巧----时序分析

一、什么是时序分析&#xff1f; 时序分析是优化LabVIEW程序性能的重要步骤。它通过分析程序各个部分的执行时间&#xff0c;帮助开发者找到程序运行中的瓶颈&#xff0c;并进行有针对性的优化。在LabVIEW中&#xff0c;Profile Performance and Memory工具是进行时序分析的关…