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>
<!--        &lt;!&ndash;jdbc依赖&ndash;&gt;-->
<!--        <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怎么整合activiti

SpringBoot完成SSM整合之SpringBoot整合junit

springboot整合jedis

SpringBoot 整合其他框架 -- SpringBoot整合Mybatis

SpringBoot 整合其他框架 -- SpringBoot整合Junit