SpringBoot常用数据库开发技术汇总介绍
作者:_BugMan 发布时间:2023-11-11 09:39:22
1.概述
数据库开发一直是JAVA开发的核心之一,作为现在JAVA EE的基石框架,Spring Boot自身携带了一个JDBCTemplate框架,其对JDBC进行了基础的封装,使得Spring Boot原生就支持据库开发。同时Spring Boot也不排斥其它优秀的持久层框架,允许他们以极低的代价平滑的接入。
本文主要介绍最常用到的三个持久层框架,JdbcTemplate、JPA、mybatis如何接入Spring Boot并在其上进行开发。
2.环境
spring boot 2.6.3
MySQL
基础依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
表:
CREATE TABLE `user` (
id int NOT NULL AUTO_INCREMENT,
username varchar(50) NOT NULL,
password varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据库配置:
# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.JdbcTemplate
JdbcTemplate是spring框架里面提供的一个JDBC的抽象层,封装了对创建的SQL操作,如SQL语句执行、结果处理等功能,使得我们能更方便地使用JDBC。
依赖:
JdbcTemplate是spring框架里的东西,在Spring Boot体系里其被包含在jdbc的starter中。
<!--jdbc依赖,包含jdbcTemplate-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
使用:
@Service
public class UserService {
@Autowired
JdbcTemplate jdbcTemplate;
RowMapper<User> userMapper=new RowMapper<User>() {
public User mapRow(ResultSet resultSet, int rowNum) throws SQLException {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
return user;
}
};
// 插入一条用户数据
public void addUser(User user) {
String sql = "INSERT INTO user (username, password) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getUsername(), user.getPassword());
}
// 删除一条用户数据
public void deleteUser(int id) {
String sql = "DELETE FROM user WHERE id = ?";
jdbcTemplate.update(sql, id);
}
// 更新一条用户数据
public void updateUser(User user) {
String sql = "UPDATE user SET username = ?, password = ? WHERE id = ?";
jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getId());
}
// 查询所有用户数据
public List<User> findAllUsers() {
String sql = "SELECT id, username, password FROM user";
return jdbcTemplate.query(sql, userMapper);
}
// 根据 ID 查询一条用户数据
public User findUserById(int id) {
String sql = "SELECT id, username, password FROM user WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, userMapper);
}
}
4.JPA
4.1.概述
JPA(Java persistence api,JAVA持久化API),是一种JSR规范,其定义了Java对象和关系型数据库之间该如何映射,总结起来是:
对象关系映射,需要描述好对象中的每个属性和关系型数据中每个字段之间的映射关系。
操作API,需要提供一套基础CRUD的API。
查询语言,需要支持自定义SQL进行比较灵活的查询。
spring boot中对jpa的实现是基于hibernate的,其通过注解来实现对象关系映射、提供了一套基础CRUD的API,然后依托于HQL支持了自定义SQL进行灵活的查询。
4.2.基本使用
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
对象关系映射:
@Entity(name="user")
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "username")
private String username;
@Column(name="password")
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
接口:
这是spring boot jpa的关键,接口继承JpaRepository,定义好实体关系映射和id类型。
import com.eryi.bean.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
@Service
public interface UserService extends JpaRepository<User,Integer> {
}
使用:
JpaRepository自带了一套基础CRUD的API,直接调用即可。
@RequestMapping("getUser")
public User addUser(User user){
return userService.findById(user.getId()).get();
}
4.3.转换器
有时候数据库里存的字段值不是我们直接想要的,而是需要做一些转换,比如user如果有个性别字段,数据库里可能是用1表示男性,用2表示女性,而我们想要的是男女,Spring Boot Jpa提供了转换器来进行转换。
定义转换器:
public class SexConverter implements AttributeConverter<SexEnum,Integer>{
//将枚举转换为数据库列
@Override
public Integer convertToDatabaseColumn (SexEnum sex) { return sex.getId () ;
//将数据库列转换为枚
@Override
publ ic SexEnum convertToEntityAttrbute (Integer id) { return SexEnum.getEnumByid (id);
}
在想要进行转换的字段上使用转换器:
public class User{
@Convert(converter=SexConverter.class)
private SexEnum sex;
}
5.mybatis
mybatis就不赘述了,现在大家最常用的,直接开整!
依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
配置:
# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis 配置
# 说明mapper的xml文件在哪里
mybatis.mapper-locations=classpath:mapper/*.xml
实体类:
public class User {
private Long id;
private String username;
private String password;
// getter 和 setter 方法省略
}
接口:
@Mapper
public interface UserDao {
User getUserById(Long id);
List<User> getAllUsers();
void addUser(User user);
void updateUser(User user);
void deleteUser(Long id);
}
mapper.xml:
在 src/main/resources/mapper`目录下创建 UserDao.xml 文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserDao">
<select id="getUserById" parameterType="long" resultType="com.example.demo.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="getAllUsers" resultType="com.example.demo.entity.User">
SELECT * FROM user
</select>
<insert id="addUser" parameterType="com.example.demo.entity.User">
INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>
<update id="updateUser" parameterType="com.example.demo.entity.User">
UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="long">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
来源:https://blog.csdn.net/Joker_ZJN/article/details/129978837
猜你喜欢
- 抽象方法与虚方法的区别先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽
- feign传输List的坑无法直接传输List错误方法1@RequestMapping(value = "/stat/mercha
- Spring 配置文件报错:元素 "context:component-scan" 的前缀 "context&
- 前言Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲
- 自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以
- AnDroidDraw 是一个与 DroidDraw 集成的 Android 应用程序,它允许你从 DroidDraw 应用 程序下载你的
- 所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。下面看
- 程序如下:View Code /* * Hanoi塔游戏 问题描述: * 汉诺塔:汉诺塔(又称河内塔)问
- 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。分别存储位置: &n
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()
- @ApiImplicitParam作用在方法上,表示单独的请求参数参数name:参数名。value:参数的具体意义,作用。required:
- 如下所示://view重绘时回调view.getViewTreeObserver().addOnDrawListener(new OnDra
- 1、普通用户与系统管理员用户的权限要有严格的区分。如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许
- 1.准备工作第一步就是先要注册一个支付宝的账号(注册这里不说,不是重点),然后登入官方首页,去到应用列表里面找到沙箱应用。基本信息的APPI
- JDK 1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承
- 要实现摇一摇的功能,类似于微信的摇一摇方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂)方法2:iOS自带的Shake监控AP
- 背景:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了
- 线程状态NEW:刚创建未启动的线程RUNNABLE:正在执行状态BLOCKED:处于阻塞状态的线程WAITING:正在等待另一个线程执行特定
- 前提说明之前公司有一个项目是由androidstudio接入高德地图实现导航,定位等功能,然后还有一部分登陆页面和其他逻辑都放在Unity方
- 简单的实现了一个树的结构,很不完善!后续参考一些其他代码的实现。试图实现叶子存在可变的节点,能够用来解析xml文件。叶子的代码:packag