SpringBoot整合JDBCMybatisSpringData JPA
Posted 小艾路西里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合JDBCMybatisSpringData JPA相关的知识,希望对你有一定的参考价值。
1. SpringBoot整合JDBC
(1) 在pom.xml中导入相关依赖
<!--继承父包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
</parent>
<dependencies>
<!--jdbc依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>
(2) 配置文件中添加数据库相关信息
application.yml
server:
port: 8080
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mode: HTML5
encoding: UTF-8
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
(3) 创建实体类、接口,在Repository或Service层实现类中使用JdbcTemplate
SpringBoot 封装了JDBC,不需要采用原生的方式,只需要使用JdbcTemplate
原理:SpringBoot在启动的时候,会根据配置文件yml找到数据源以待连接,并自动创建一个名为JdbcTemplate的对象注册进bean
JdbcTemplate底层是通过jdbc的方式去连接数据源,因为封装了起来,所以直接调用接口方法就能实现curd
new BeanPropertyRowMapper(Class)可以将结果集映射成一个实体类
实现类
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<User> findAll() {
//查询使用query()方法 通过new BeanPropertyRowMapper可以将结果集映射成一个实体类
return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));
}
@Override
public User findById(long id) {
return jdbcTemplate.queryForObject("select * from user where id = ?",newObject[]{id},new BeanPropertyRowMapper<>(User.class));
}
@Override
public void save(User user) {
jdbcTemplate.update("insert into user(name,score) values(?,?)",user.getName(),user.getScore());
}
@Override
public void update(User user) {
jdbcTemplate.update("update user set name = ?,score = ? where id = ?",user.getName(),user.getScore(),user.getId());
}
@Override
public void deleteById(long id) {
jdbcTemplate.update("delete from user where id = ?",id);
}
}
2. SpringBoot整合Mybatis
(1) pom.xml中导入依赖
<!--继承父包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
</parent>
<dependencies>
<!-- <!–jdbc依赖–>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-jdbc</artifactId>-->
<!-- <version>2.4.1</version>-->
<!-- </dependency>-->
<!-- MyBatis相关依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
(2) 创建实体类、Repository或Service接口,然后创建接口对应的mapper.xml
要点:mapper.xml创建在resouces文件夹中
(如果xml是灰色试着改一下pom.xml中mybatis配置的版本)
mapper.xml是用来实现接口业务方法的sql语句
mapper namespace: 业务接口路径
id:方法名称,resultType: 返回类型,parameterType: 参数类型
<?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.ruoxi.mapper.UserRepository">
<select id="findAll" resultType="User">
select * from user limit #{param1},#{param2}
</select>
<select id="count" resultType="int">
select count(id) from user
</select>
<select id="findById" parameterType="long" resultType="User">
select * from user where id = #{id}
</select>
<insert id="save" parameterType="User">
insert into user(name,score) values(#{name},#{score})
</insert>
<update id="update" parameterType="User">
update user set name = #{name},score = #{score} where id = #{id}
</update>
<delete id="deleteById" parameterType="long">
delete from user where id = #{id}
</delete>
</mapper>
(3) 编写application.yml配置文件,添加mybatis的配置(包括数据源等)
mapper-locations: classpath:/mapper/*.xml 就代表mapper扫描是resouces/mapper下的所有xml文件
type-aliases-package: 代表将实体类的路径给提取出来
server:
port: 8080
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mode: HTML5
encoding: UTF-8
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:/mapper/*.xml
type-aliases-package: com.ruoxi.entity
(4) 给Application启动类添加@MapperScan注解
@SpringBootApplication
@MapperScan("com.ruoxi.repository")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
说明:
到这一步,Application启动类的自动扫描不能扫描到业务层的接口,因为这时业务层接口是mybatis去管理的
这时候要在Application启动类上添加@MapperScan注解(将mapper也扫描进IOC),使业务层接口交给Spring去管理,这样业务实现类中的@Autowire注解才能生效
备注:
MyBatis原生使用步骤:
① 用InputStream获取MyBatis配置
② 获取SqlSessionFactory
③ 创建SqlSession并打开事务(openSession())
④ 获取mapper实现接口的代理对象
⑤ 使用代理对象(下例中是userRepository)
⑥ 提交事务
⑦ 关闭事务
InputStream inputStream =
Test.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory =
sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取实现接⼝的代理对象
UserRepository userRepository =
sqlSession.getMapper(AccountRepository.class);
// 调用代理对象的方法,获取所有的user
List<User> userList = userRepository.findAll();
for (User user:userList){
System.out.println(user);
}
sqlSession.close();
而在SpringBoot中,使用了注解去替换原来的方式,将业务层交给了spring保管,把繁琐的操作给包装了起来,只用直接调用业务层接口方法可以执行sql了
例如
@Controller
@RequestMapping("/mapper")
public class UserMapperHandler {
@Autowired
private UserRepository userRepository;
@GetMapping("/findAll")
public ModelAndView findAll(){
ModelAndView modelAndView = new ModelAndView();
List<User> userList = userRepository.findAll();
for (User user:userList){
System.out.println(user);
}
modelAndView.addObject("userList",userList);
modelAndView.setViewName("ShowUserList");
return modelAndView;
}
}
3. SpringBoot整合SpringData JPA
SpringDataJPA简介:
JPA:通过注解或XML的方式描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中
jpa hibernate 框架实现了JPA,SpringDataJPA底层就是通过jpa hibernate来实现的 (jpa hibernate是全自动化映射的框架)
SpringData:SpringData就是Spring提供了一个操作数据的框架
SpringData JPA:SpringData JPA是SpringData框架下的一个基于JPA标准操作数据的模块,基于JPA的标准数据进行操作,简化操作持久层的代码,只需要编写业务接口并继承JpaRepository接口
即是实现了curd的方法,不用实现接口,也不用手写sql了
SpringDataJPA 使用步骤
(1) pom.xml中导入依赖
<!-- 导入jpa的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.4.1</version>
</dependency>
(2) 创建实体类,并使用一些实现映射的注解(实现实体类和表的映射)
@Entity :表示与表映射的实体类
@id : 表示主键
@GeneratedValue(strategy = GenerationType.AUTO) : 表示生成策略为自增
@Column : 表示除了主键外的属性的映射
@Data
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
@Column
String name;
}
(3) 编写业务接口,并继承泛型接口JpaRepository
JpaRepository<T,ID> 泛型参数说明:T是实体类,ID是主键类型(不能使用基本数据类型)
public interface UserRepository extends JpaRepository<User,Long> {
//可以定义一些除了jpa实现的curd外的方法
public User getById();
}
补充1:自定义一些具有命名规范的方法,jpa会自动自动实现该方法,例如上面的getById()
补充2:JpaRepository接口的方法
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
(4) 创建Handler,注入业务接口 (这里是UserRepository)
注意点:findById(id) 在源码中返回的是一个Optional类,需要调用get()方法去获取实体类对象,也可以通过添加getById方法去代替使用
@RestController
public class UserHandler {
@Autowired
private UserRepository userRepository;
//这里就可以直接调用业务接口的方法 也就是JpaRepository实现的方法
@GetMapping("/findAll")
public List<User> findAll(){
return userRepository.findAll();
}
@GetMapping("/findById")
public User findById(Long id){
userRepository.getById();
return userRepository.findById(id).get();
}
//RequestBody 用于将客户端传来的json对象转换成java对象
@PostMapping("/save")
public User save(@RequestBody User user){
return userRepository.save(user); //没有id主键就添加
}
//RequestBody 用于将客户端传来的json对象转换成java对象
@PutMapping("/put")
public User update(@RequestBody User user){
return userRepository.save(user); //有id主键就覆盖更新
}
@DeleteMapping("/delete/{userId}")
public void delete(@PathVariable("userId") Long id){
userRepository.deleteById(id);
}
}
以上是关于SpringBoot整合JDBCMybatisSpringData JPA的主要内容,如果未能解决你的问题,请参考以下文章
[SpringBoot系列]SpringBoot如何整合SSMP
SpringBoot完成SSM整合之SpringBoot整合junit