从单体架构到分布式架构之四:数据持久化,ORM 框架之 Mybatis

从单体架构到分布式数据持久化:探索 MyBatis ORM 框架 在本文中,我们将探讨一种流行的 ORM 框架 MyBatis,它在从单体架构到分布式环境中实现数据持久化方面具有显著的优势。相比于其他 ORM 框架,MyBatis 更加注重 SQL 的灵活性和可读性,使开发人员能够更好地控制 SQL 查询和数据映射的细节。MyBatis 是一个强大而灵活的 ORM 框架,适用于从单体架构到分布式环境的数据持久化。MyBatis 提供了丰富的功能和灵活的配置选项,使得在分布式环境下进行数据持久化变得更加简单和可靠。然后,我们创建一个接口,用于定义数据库操作的方法。 阅读详情

关注 ▲会点代码的大叔▲,我们一起成长

bb85cb441a844ecb5df5f43b758cf0b6.jpeg

这是会点代码的大叔的第 56 期分享

作者 l 会点代码的大叔

分类 l 从单独服务到分布式架构

你好,我是会点代码的大叔,这是我的系列文章【从单独服务到分布式架构】的第四篇:

《数据持久化,ORM 框架之 MyBatis》

01. 万丈高楼平地起:环境准备

02. 请求增多,单点变集群(1):负载均衡

03. 请求增多,单点变集群(2):Nginx

04. 数据持久化(1):ORM 框架之 Mybatis

05. 数据持久化(2):ORM 更高级的封装之 Spring Data JPA

06. 当数据量涨到上百万:数据库优化

07. 尽可能减少数据库压力(1):实现本地缓存

08. 尽可能减少数据库压力(2):本地缓存框架

09. 尽可能减少数据库压力(3):Redis

10. 缓存不是万能的:使用缓存时要注意的问题

11. 当数据量涨到上亿:基于 Sharding-Sphere 的分库分表

12. 领导想看汇总数据:数据的分分合合

13. 请求太多压垮应用?那就排队处理:消息队列

14. 接口可不能随便被调用:Token 认证

15. 如何让批处理任务跑的更快:分布式批处理任务

16. 分布式系统如何寻找服务地址:注册中心

17. 分布式系统如何横向扩展:客户端负载均衡

18. 一次请求跨多个请求如何监控:链路追踪

19. 分布式系统抗压三板斧:限流、降级、熔断

20. 内部服务千万,对外保持统一:API 网关

01

前置概念

 01   持久化 

持久化就是把数据保存到可以永久保存的存储设备中,比如磁盘。

 02   JDBC 

大多数程序员在学习 Java 的过程中,当学习到 Java 访问数据库的时候,一定会先学习 JDBC,它是一种用于执行 SQL 语句的 Java API,为数据库提供统一访问,并把数据“持久化”到数据库中。

我再通俗地解释一下(对 JDBC 有一定了解的同学可以直接跳过):

Sun 公司在 97 年发布 JDK1.1 ,JDBC 就是这个版本中一个重要的技术点,要用 Java 语言连接数据库,正常的思维都是 Sun 公司自己来实现如何连接数据库、如果执行 SQL 语句,但是市场上的数据库太多了,数据库之间的差异也很大,而且 Sun 公司也不可能了解每个数据库的内部细节呐...

于是为了让 Java 代码能更好地与数据库连接,Sun 公司于是制定了一系列的接口,说是接口,其实也就是一套【标准】、一套【规范】,具体代码如何实现由各个数据库厂商来敲代码;所以我们常说的“驱动类”,就是各个厂商的实现类。

所以我们在用 JDBC 连接数据库的时候,第一步需要注册驱动,就是要告诉 JVM 使用的是操作哪个数据库的实现类。

6e173f61492c23c103f11f249368f177.jpeg

 03   ORM  

在没有 ORM 框架之前,我们操作数据库需要这样:

df76dabbff5b19d199d672c511062e8f.jpeg

我们可以看到使用 JDBC 操作数据库,代码比较繁琐,参数拼写在 SQL 中容易出错,而且可读性比较差,增加了代码维护的难度。

有了 ORM 框架之后,我们操作数据库是这样的:

d2b2531bd04f8bb62f60e1b5bc0b8fe8.jpeg

ORM 框架在 Java 对象和数据库表之间做了一个映射,封装了数据库的访问细节,我们再需要操作数据库语句的时候,直接操作 Java 对象就可以了。


02

Spring Boot 集成 MyBatis

Java 常用的 ORM 框架有 Hibernate、MyBatis、JPA 等等,我在后文中在比较这集中框架的优缺点,本章节主要介绍 Spring Boot 项目集成 MyBatis 访问数据库。

Step 1. 添加依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>


<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>


Step 2. 配置数据库链接

在 application.yml 文件中配置数据库相关信息。

#数据源配置
spring:
  datasource:
    #数据库驱动
    driver-class-name: com.mysql.cj.jdbc.Driver
    #数据库 url
    url: jdbc:mysql://127.0.0.1:3306/arch?characterEncoding=UTF-8&serverTimezone=UTC
    #用户名
    username: root
    #密码
    password: root

Step 3. 配置数据库链接

在我们本机的数据库上,创建一个用户表,并插入一条数据:

CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,    
   `userid` VARCHAR(100) NOT NULL,
   `username` VARCHAR(100) NOT NULL,
   `gender` CHAR(1) NOT NULL,
   `age` INT NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


insert into user(userid ,username, gender, age) values('dashu','大叔','M',18);

Step 4. 创建 Model 层

通常用于接收数据库中数据的对象,我会单独创建一个 model package,类中的属性我习惯和字段保持相同。

package com.archevolution.chapter4.model;


public class User {
  private int id;//主键ID,自增长
  private String userId;//用户ID,或看做登录名
  private String userName;//用户姓名
  private String gender;//性别
  private int age;//年龄
  //省略 get、set、toString 方法
}

Step 5. 创建 Dao 层

通常直接和数据库打交道的代码,我们把它们放在 DAO 层(Data Access Object),数据访问逻辑全都在这里;

我们新建一个 dao package,并在下面新建一个**接口**,注意是接口:

@Mapper
public interface UserDao {
  @Select("SELECT id, userId, userName, gender, age FROM USER WHERE id = #{id}")
  public User queryUserById(@Param("id") int id);
}

这里我多说几句!

从技术角度来说,model 中的属性可以和表中的字段不一样,比如我们在数据库中增加一个手机号的字段叫做 [mobilephone] :

--增加手机号字段
ALTER TABLE user ADD mobilephone varchar(15) ;


--更新 userid = 1 数据的手机号
update user set mobilephone = '13800000000' where userid = '1';

我们在 User.java 中添加一个字段,叫做 [telephone]:

我们自己知道 [telephone] 是和数据库中的 [mobilephone] 对应,但是如何让 Mybatis 知道这两个字段要对应上呢?有几个办法:

01. 在 SQL 语句中控制,对名字不相同的字段起别名:

@Select("SELECT id, userId, userName, gender, age, mobilephone as telephone FROM USER WHERE id = #{id}")
public User queryUserTelById(@Param("id") int id);

02. 使用 @Results 标签,将属性和字段不相同的设置映射(名称相同的可以不写):

@Select("SELECT id, userId, userName, gender, age, mobilephone FROM USER WHERE id = #{id}")
@Results({
  @Result(property = "telephone" , column = "mobilephone")  
})
public User queryUserTelById2(@Param("id") int id);

不过我还是建议大家在写 model 类的时候,属性和表中的字段保持一模一样,这样不仅可以减少代码的复杂程度,还能很大程度地增加代码的可读性,减少出错的可能;

有些同学可能会有疑问,很多项目的数据结构设计的不是那么规范,比如字段名称可能是一个很奇怪的名字,比如 flag01、flag02,如果这样的字段从数据库中查询出来,通过接口返回,那么会不会造成接口的可读性太差?

通常我们不会把 model 中的内容直接包装返回,model 很多的是数据库和 Java 对象的映射,而传输数据的话,通常需要 DTO;我们从数据库中查询出来数据放到 model 中,在接口中返回数据之前,把 model 转换成 DTO,而 DTO 中的属性需要保证其规范性和见名知意。

453109ccef799b217321c34b5026b31e.jpeg

Step 6. 创建 Service 层

我们的项目现在已经有了 Dao 层,用于访问数据,有 Controller 层,用户提供接口访问,那么 Controller 是否能直接调用 Dao 中的方法呢?最好不要直接调用!


通常我们会创建一个 Service 层,用于存放业务逻辑,这时候完整的调用流程是:

Controller - Service - Dao

创建 Service package 之后,在里面创建一个 UserService :

@Service
public class UserService {
  @Autowired
  UserDao userDao;


  public User queryUserById(int id) {
    return userDao.queryUserById(id);
  }
}

Step 7. 在 Controller 层增加接口

增加一个接口,通过 userId 查询客户信息,并返回客户信息:

@RequestMapping(value = "/queryUser/{id}")
@ResponseBody
public String queryUserById(@PathVariable("id") int id){
    User user = userService.queryUserById(id);
    return user == null ? "User is not find" : user.toString() ;
}

Step 8. 测试验证

在浏览器或客户端中访问接口进行调试测试,可以查询到客户信息:

http://127.0.0.1:8088/queryUser/1


User [id=1, userId=dashu, userName=大叔, gender=M, age=18, telephone=null]


03

MyBatis 的其他操作

只给出关键代码,完整代码请参考本章节的项目代码。

01. 新增

@Insert("INSERT INTO USER(userId, userName, gender, age) values"
        + " (#{userId}, #{userName}, #{gender}, #{age})")
public void insertUser(User user);

02. 修改

@Update("UPDATE USER SET mobilephone = #{telephone} WHERE id = #{id}")
public void updateUserTel(User user);

03. 删除

@Delete("DELETE FROM USER WHERE id = #{id}")
public void deleteUserById(@Param("id") int id);


04

代码完善

上面我们就完成了 Spring Boot 和 MyBatis 最简单的集成,可以正常地读取数据库做 CRUD 了,但是因为是最简单的集成,所以有一些细节需要完善一下,比如:

参数都在显示在了 url 中;

直接返回 Object.toString(), 不是很友好;

查询不到数据或发生异常,没有做特殊处理;

下面让我们逐步完善

01. 使用 Json 作为参数发送 Post 请求

如果严格地遵守 Restful 风格,那么需要遵守:

查询:GET /url/xxx

新增:POST /url

修改:PUT /url/xxx

删除:DELETE /url/xxx

在这里我们就单纯地认为把参数写在 url 中,容易一眼就看到我们的参数内容,并且如果参数比较多的时候会造成 url 过长,所以通常我们比较习惯使用 Json 作为参数发送 Post 请求。比如新增 User 的接口可以写成这样:

新增 DTO package 并新建 UserDTO:

//使用了 Josn 作为参数,需要设置 headers = {"content-type=application/json"}
//@RequestBody UserDto userDto 可以让 JSON 串自动和 UserDto 绑定和转换
@RequestMapping(value = "/insertUser2",headers = {"content-type=application/json"})
@ResponseBody
public String insertUser2(@RequestBody UserDto userDto){
    //DTO 转成  Model
    User user = new User();
    user.setUserId(userDto.getUserId());
    user.setUserName(userDto.getUserName());
    user.setGender(userDto.getGender());
    user.setAge(userDto.getAge());


    userService.insertUser(user);


    return "Success" ;
}

新增 User 的接口:

//使用了 Josn 作为参数,需要设置 headers = {"content-type=application/json"}
//@RequestBody UserDto userDto 可以让 JSON 串自动和 UserDto 绑定和转换
@RequestMapping(value = "/insertUser2",headers = {"content-type=application/json"})
@ResponseBody
public String insertUser2(@RequestBody UserDto userDto){
    //DTO 转成  Model
    User user = new User();
    user.setUserId(userDto.getUserId());
    user.setUserName(userDto.getUserName());
    user.setGender(userDto.getGender());
    user.setAge(userDto.getAge());


    userService.insertUser(user);


    return "Success" ;
}

让我们调用接口测试一下:

{ 
  "userId": "lisi", 
   "userName": "李四", 
   "gender": "F", 
   "age": "40", 
   "telephone": "18600000000"
}

02. 规范回参

直接返回 Object.toString(), 不是很友好;

让我们设计一个简单的回参对象,包括 code-状态码,message-异常信息描述,data-数据:

public class JsonResponse {
  private String code;
  private String message;
  private Object data;
  //省略 set、get 方法
}

其中 code 我们就参考 Http 状态码,使用常用的几个:

public class ResponseCode {
  public static final String SUCCESS = "200";//查询成功
  public static final String SUCCESS_NULL = "204";//查询成功,但是没有数据
  public static final String PARAMETERERROR = "400";//参数错误
  public static final String FAIL = "500";//服务器异常
}

这时我们再来重写一下查询接口:

@RequestMapping(value = "/queryUser2")
@ResponseBody
  public JsonResponse queryUser2ById(@RequestBody UserDto userDto){
  JsonResponse res = new JsonResponse();


  //省略参数校验


  User user = userService.queryUserById(userDto.getUserId());


  if(user != null){
    //能查询到结果,封装到回参中
    res.setCode(ResponseCode.SUCCESS);
    res.setData(user);;
  }else{
    //如果查询不到结果,则返回 '204'
    res.setCode(ResponseCode.SUCCESS_NULL);
    res.setMessage("查询不到数据");
  }


  return res;
}

调用结果可以看到封装后的回参,看起来是不是规范了很多:

{
   "code": "200",
   "message": null,
   "data": {
      "id": 3,
      "userId": "lisi",
      "userName": "李四",
      "gender": "F",
      "age": 40,
      "telephone": null
   }
}

03. 异常处理

如果代码在运行过程中发生异常,那么改如何处理呢?直接把异常信息返回给前端么?这样做对调用方不是很友好,通常我们把错误日志打印到本地,给调用方返回一个异常状态码即可。

Service、Dao 层的集成都往上抛:

public User queryUserById(int userId) throws Exception{
  return userDao.queryUserById(userId);
}

在 Controller 层抓住异常,并封装回参:

User user = new User();
try {
  user = userService.queryUserById(userDto.getId());
} catch (Exception e) {
  res.setCode(ResponseCode.FAIL);
  res.setMessage("服务异常");
}


04

MyBatis 常见问题

01. 为什么 MyBatis 被称为半自动 ORM 框架?

有半自动就会有全自动;

Hibernate 就属于全自动 ORM 框架,使用 Hibernate 可以完全根据对象关系模型进行操作,也就是指操作 Java 对象不需要写 SQL,因此是全自动的;而 MyBatis 在关联对象的时候,需要手动编写 SQL 语句,因此被称作“半自动”。

02. 使用注解还是 XML?

相信大部分项目使用 MyBatis 的时候,都是使用 XML 配置 SQL 语句,而我们课程中的例子,都是使用注解的方式,那么这两者有什么区别呢?我们在实际开发中,要如何选择呢?

首先官方是比较推荐使用 XML 的,因为使用注解的方式,拼接动态 SQL 比较费劲儿,如果你们的 SQL 比较复杂,需要多表关联,还是使用 XML 比较好;而且现在也有很多插件,可以自动生成 MyBatis XML。

但是事物总是有两方面的,复杂的 SQL 并不是值得骄傲的事情,如果你们的项目能做到没有复杂 SQL 的话,使用注解会是更好的选择(我们现在的项目 95% 以上的 SQL 都是单表查询)。

03. #{} 和 ${} 的区别是什么?

${} 是字符串替换,#{} 是预编译处理;使用 #{} 可以防止 SQL 注入,提高系统安全性。

04. 如何做批量插入?

注解的方式同样可以使用动态 SQL :

@Insert({
    "<script>"
        + "INSERT INTO USER(userId, userName, gender, age) values"
        + "<foreach collection='userList' item='item' index='index' separator=','>"
        + " (#{item.userId}, #{item.userName}, #{item.gender}, #{item.age})"
        + "</foreach>"
        + "</script>"
})
public void insertUserList(@Param(value="userList") List<User> userList);

Spring Boot 集成 MyBatis 做数据库增删查改的操作,是比较基础的知识,希望对初学 Java 的人有所帮助。

802e44112664d1fb06426e530f2ed485.jpeg

从单独服务到分布式架构,希望您能和我一起,坚持到最后。

END

[ 用大白话讲解复杂的技术 ]

ba742317e54ded934f8a404a035b6e84.jpeg

【系统架构设计】架构核心知识: 3.5 Redis和ORM 阅读详情

相关推荐

芒果:Java的分布式ORM框架

芒果:Java的分布式ORM框架 快速,简单,可靠。 Mango是一个高性能的分布式ORM框架。 Mango使关系数据库与面向对象的应用程序一起使用变得更加容易。 性能和简单性是Mango数据映射器相对于对象关系映射工具的最大优势。 在我们的支付系统中,我们使用芒果构建了一个分布式支付订单系统,该系统每秒可以处理120000多个支付订单。 文档位于 需要JDK 1.8或更高版本。 最新发布的 最新版本是2020年7月14日发布的Mango 2.0.1。 要使用Maven添加对Mango的依赖关系,请使用以下命令: < dependency> < groupId>org.j

大数据量快速处理的架构设计

       在业务数据的处理过程中,经常会遇到夜间批次处理大量的数据,而且会有时效的要求,这就对程序执行的性能有了较高要求。特别是当应用系统跑了2年以上时,就会有大表或者特大表的操作了,数据量达到百万甚至上亿。 这时回顾前期的设计,就可能会发现好多问题。 可能是由于数据模型设计的时候没有考虑表的分区和及时归档,造成大表处理慢; 也可能是涉及到的sql的设计没有考虑走索引,或有隐式转换、全表扫描、...

Coder Ben 2727

AI+Xmind自动生成测试用例(思维导图格式)

最后:我是Walker,一个热爱分享编程知识的程序员,希望能够帮助到你!

Think_and_work的博客 2333

微服务架构设计模式——单体架构

首先,要明确单体架构的定义是什么,才好与其他架构作区别于讨论。以下是我觉得对单体架构总结的比较好的定义 Monolithic application has single code base with multiple modules. Modules are divided as either for business features or technical features. It ha...

Guilai1990的博客 1662

PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理

在“PDF Document”栏中,依次选中除REF-TOP和REF-BOT之外的文件,单击图标,将其余PDF Document文件进行删除,如图所示。然后单击【生成PDF】按钮,即可创建一份PDF格式的位号图。

tianpu2320959696的博客 1025

PC微信逆向:破解聊天记录文件!_读取别人pc微信msg文件

本文详细介绍了PC版微信数据库的解密方法,总结了前人经验并补充了关键细节。通过OllyDbg调试工具从微信内存中获取32字节加密密钥,使用C++结合OpenSSL库实现解密程序。重点解决了开发环境配置问题,包括Visual Studio项目设置和OpenSSL库的版本适配,将原本固定的数据库路径改为参数化输入,提高了工具的通用性。该方案为电子取证中的微信数据提取提供了完整的技术路径,避免了研究者重复探索已解决的问题。

zz96405784848的博客 9754

Django框架学习--4--分布式路由&ORM基础

django应用及分布式路由 模型层及ORM介绍 ORM-基础字段及选项1 应用在django项目中是一个独立的业务模块,可以包含自己的路由、视图、模版和模型。 创建应用 1.创建应用文件夹:python3 manage.py startapp 应用名 2.注册:settings.py中INSTALLED_APPS配置项添加应用名 migration同步迁移文件,__init__.py初始化文件,admin管理后台,models模型层入口,tests测试模块,views视图模块 分布式路.

稍微进来看看不... 1487

lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件

机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。

2403_83796253的博客 5151

Java必知必会系列:持久化与ORM框架

作者:禅与计算机程序设计艺术 1.背景介绍 在软件开发过程中,无论对于应用层还是开发层来说,数据持久化都是一个绕不开的话题,数据库、缓存、文件系统等存储技术作为技术基础设施的构建,对数据的存储、检索、管理和更新都有着重要作用。而关系型数据库(RDBMS)和非关系型数据库(NoSQL)也成为当今非常热

AI架构师小马 1332

论文必备 - YOLOv12热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv12热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 1706

SAP S/4HANA 中 RAP 业务对象接口的消费模式

本文探讨了SAP S/4HANA中RAP业务对象接口的消费模式,重点介绍了通过EML直接调用和CDS投影两种Clean Core开发路径。文章分析了BO Interface作为稳定契约的价值,并提供了BAdI集成、OData服务发布等实际场景案例,同时对比了OData V2/V4的技术选型考量,最后强调了ADT向导使用中的DCL权限注意事项。全文旨在帮助开发者构建升级友好的业务对象消费方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 757

半自动ORM与全自动ORM框架有什么区别?

什么是 ORM? ORM 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 ORM是面向对象程序设计语言和关系型数据库发展不同步时的解决方案,采用 ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层的

m0_58554082的博客 2827

YOLO26改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLO26 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 221

ORM 框架介绍

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

webwow的博客 1841

YOLOv8/v9实战:从零搭建智慧零售货架管理系统(附完整可运行代码)

摘要:本文基于YOLOv8/v9目标检测算法,详细讲解智慧零售货架管理系统的开发流程,解决传统人工巡检效率低、漏检率高的问题。内容涵盖环境配置、商品检测、陈列分析、价格标签验证等核心功能实现,提供可运行代码及零售专用数据集训练方法。系统支持实时货架状态监控、缺货预警与数据分析,帮助零售企业降低运营成本30%以上。 关键词:YOLOv8、YOLOv9、智慧零售、货架管理、商品检测 标签:YOLOv8、YOLOv9、目标检测、零售AI、Python

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1309

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

三大框架:springMVC、spring、myBatis

在指定的时间间隔内,执行指定次数的写操作,会将内存中的数据写入到磁盘中。AOF(追加) 在Redis中默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。在SQL和传入的参数完全一样的情况下,多次调用mapper方法,只会执行一次sql,第一次执行sql查询到的结果集会被保存在缓存中,后面重复调用mapper方法返回的是缓存中的结果集;通过定义切面类,用来封装多个类的公共行为,将那些与业务无关,可以复用的代码封装起来,形成一个切面类的方法。

qq_58738794的博客 2424

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ORM的个人简单理解以及持久化和持久层的简单理解、Hibernate的简单理解,mybatis 的好处通俗易懂

ORM,Object-Relationl Mapping,对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,只要像平时操作对象一样操作它就可以了,ORM框架会根据映射完成对数据库的操作,就不需要再去和复杂的SQL语句打交道了。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。就比如说,我们之前想要操作数据中的数据进行更删改查,那么我们还需要手动把数据库的字段与实体类中对象进行一一匹配。

Y1567409的博客 579

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【前端必备技能java之若依框架缓存(redis)模块封装梳理与MyBatis最佳实践】

这里用了很长的篇幅进行了说明redis的封装以及MyBatis的最佳实践

leleshuo 3264

mybatis框架学习总结

MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,是一个基于Java的持久层框架。

程序员夏小哥的博客 482

Java EE数据持久化框架 • 【第1章 MyBatis入门】

1.1 初识MyBatis 1.1.1 持久化技术介绍 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。 狭义的讲就是将内存中的数据存储到数据库或其他介质的过程。 Dao层将数据存储到数据库中 Java如何实现数据持久化? JDBC编程操作: 代码重复繁琐、开发效率低 Mybatis、Hibernate等框架技术 企业级应用开发 支持多种数据库切换 封装了传统JDBC提高开发效率 插件丰富、安全性高、支持缓存等 1.1.2 ...

杨明金的博客 1万+

Java面试:HRM系统下的日志与ORM框架深度剖析(SLF4J, Logback, MyBatis, JPA, HikariCP)

本文以互联网大厂Java开发工程师面试为背景,通过面试官与程序员“小润龙”的对话形式,深入探讨HRM系统中的日志框架(SLF4J, Logback, Log4j2)与数据库ORM(MyBatis, JPA/Hibernate, HikariCP)技术栈。文章包含三轮面试实录、详细的技术知识点解析及代码示例,旨在帮助开发者巩固基础,提升实战能力。

2303_76177839的博客 1002

什么是ORM?Hibernate和MyBatis有什么区别?

ORM(Object-Relational Mapping,对象关系映射)是一种通过建立对象模型与关系型数据库表之间的映射,实现面向对象编程与数据库交互的技术。其核心目标是解决面向对象开发与关系型数据库之间的“阻抗不匹配”问题,使开发者能以操作对象的方式操作数据库,减少直接编写SQL的复杂度。开发效率 vs 控制力选择Hibernate若需快速实现业务逻辑,减少SQL编写。选择MyBatis若需直接优化SQL或处理复杂查询。项目规模与复杂度。

破损的天堂鸟博客 1129

mysql的api框架_MYSQL——ORM框架

1、ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单理解为一种框架的格式只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,Eclip...

weixin_29145623的博客 294

持久化框架之Mybatis与MybatisPlus对比

MyBatis MyBatis前身是iBatis,是Clinton Begin在2001年发起的一个开源项目。最初侧重于码软件开发,后续发展成为一款基于java的持久层框架。Mybatis是一款优秀的持久层框架支持自定义SQL查询、存储过程和高级映射,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或者注解进行映射和配置,通过将参数映射到配置的SQL...

craftsmanity的博客 3154

Mybatis框架(一)初识Mybatis框架

一、 什么是框架框架(Framework)就是一个提供了可重用的公共结构的半成品,是应用程序的骨架。它就好比建筑物的骨架,结构统一固定,不需要考虑建筑物结构怎么设计,只需要考虑在这样的结构基础上,使用什么内容(建筑材料)来填充这个建筑物。对应到程序上也是一样的道理,程序结构固定,只需填充满足功能的相关代码即可。那么使用框架有什么优势呢?1、 保证了程序结构风格统一,便于学习和维护。2、 省去...

blo1724的博客 313
上一篇: 五分钟搞懂布隆过滤器,亿级数据过滤算法值得拥有
会点代码的大叔
博客等级 码龄11年 9粉丝 15原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值