Springboot整合持久层框架

一、前言


Springboot在数据层涉及到的技术主要有数据库、持久层框架、数据源三个,三个是不同知识点,千万不能弄混了;

数据库可以选用mysql、clickhouse等

持久层框架可以选择用mybatis、jdbcTemplate等

数据源选择用druid、c3p0等

这篇文章主要介绍spring boot如何整合数据源。springboot中数据库选择和持久层框架选择使用参考以下文章
Springboot整合数据源_程序三两行的博客-CSDN博客

二:整合jdbcTemplate

spring默认提供的持久层解决方案就是是jdbcTemplate,是一个操作数据库的模板对象,里面就是封装了jdbc

核心依赖,数据源选择druid

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.29</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

使用默认的数据源配置

spring:
  datasource:
    #四项基本配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root

 使用

    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    //使用JdbcTemplate  里面的api进行操作数据库
    public void  test(){
        String sql ="select * from user";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
    }

注意:

引入 spring-boot-starter-jdbc之后,可以看到默认的数据源是Hikari

 但是也可以使用druid数据源

三:整合mybats

导入数据库驱动依赖

//数据库驱动
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <scope>runtime</scope>
</dependency>
//mybatis依赖
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.1.1</version>
</dependency>

 可以看到引入mybatis依赖之后包含了jdbc和hikari   

这里使用默认的数据源Hikari

spring:
  datasource:
    #四项基本配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root

 注意:我们这里配置完成后,Springboot是如何加载这些信息的呢?这就涉及到Springboot自动配置原理,启动之后boot中的数据源配置类,如下会自动给我们配置

接下来就是开发了,mybatis可以通过注解开发也可以通过写xml文件的形式开发

注解方式

创建一个接口UserMapper,如下:

public interface UserMapper {
    @Select("select * from user")
    List<User> getAllUsers();

    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "username", column = "u"),
            @Result(property = "address", column = "a")
    })
    @Select("select username as u,address as a,id as id from user where id=#{id}")
    User getUserById(Long id);

    @Select("select * from user where username like concat('%',#{name},'%')")
    List<User> getUsersByName(String name);

    @Insert({"insert into user(username,address) values(#{username},#{address})"})
    @SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = Integer.class)
    Integer addUser(User user);

    @Update("update user set username=#{username},address=#{address} where id=#{id}")
    Integer updateUserById(User user);

    @Delete("delete from user where id=#{id}")
    Integer deleteUserById(Integer id);
}

 @Select、@Insert、@Update 以及 @Delete 四个注解分别对应 XML 中的 select、insert、update 以及 delete 标签,@Results 注解类似于 XML 中的 ResultMap 映射文件,@SelectKey 注解可以实现主键回填的功能,即当数据插入成功后,插入成功的数据 id 会赋值到 user 对象的id 属性上。

UserMapper 创建好之后,还要配置 mapper 扫描,有两种方式,一种是直接在 UserMapper 上面添加 @Mapper 注解,这种方式有一个弊端就是所有的 Mapper 都要手动添加,要是落下一个就会报错,还有一个一劳永逸的办法就是直接在启动类上添加 Mapper 扫描,如下:

@SpringBootApplication
//写到dao就可以了 不用*
@MapperScan(basePackages = "com.javayihao.top.dao")
public class MybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisApplication.class, args);
    }
}

 xml方式开发

首先还是要创建一个接口UserMapper

public interface UserMapper {
    List<User> getAllUser();

    Integer addUser(User user);

    Integer updateUserById(User user);

    Integer deleteUserById(Integer id);
}

然后创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-21-mapper.dtd">
<mapper namespace="com.javayihao.top.dao.UserMapper">
    <select id="getAllUser" resultType="com.javayihao.top.pojo.User">
        select * from t_user;
    </select>
    <insert id="addUser" parameterType="com.javayihao.top.pojo.User">
        insert into user (username,address) values (#{username},#{address});
    </insert>
    <update id="updateUserById" parameterType="com.javayihao.top.pojo.User">
        update user set username=#{username},address=#{address} where id=#{id}
    </update>
    <delete id="deleteUserById">
        delete from user where id=#{id}
    </delete>
</mapper>

此时,关于UserMapper.xml放置的位置有两种:

第一种直接放在和UserMapper接口相同的位置

这样的方式有个问题就是maven在打包项目的时候,java目录下的xml资源不会被加载,所以如果放在同接口相同的位置,需要在pom.xml文件中增加如下配置,避免扫描不到xml文件

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

第二种:放在resources下面

 放在 resources 目录下,这样就不用担心打包时被忽略了,记着在mapper接口类使用mapper注解,app启动类配置mapperscan注解

还需在配置文件中告诉mybatis去哪扫描mapper

mybatis.mapper-locations=classpath:mapper/*.xml
//如果有多级目录使用/
mybatis.mapper-locations=classpath:com/xx/mapper/*.xml

至此 Springboot整合mybatis完成

四、整合jpa

1、什么是JPA?


全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。

为我们提供了:

1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

如:@Entity、@Table、@Column、@Transient等注解。

 2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

如:entityManager.merge(T t);

 3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

如:from Student s where s.name = ?

但是:

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

也就是说:

JPA是一套ORM规范,Hibernate实现了JPA规范!如图:

 2、什么是spring data jpa?


spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。如图:

 接口约定命名规则:

3、springboot集成spring data jpa

依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

数据源还是使用默认的数据源

编写实体类

对POJO类增加Entity的注解,并指定表名(如果不指定,默认的表名为student),然后指定ID的及其生成策略,这些都是JPA的知识,与Spring boot无关,代码:

//使用jpa注解配置映射关系
@Entity//告诉jpa这是和数据库映射的类
@Table(name="tb_student")//table指明和哪个表映射 如果省略默认就是student表
public class Student {
    //属性id
    @Id//这是一个主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
    private Integer id;
    //属性name
    @Column(name = "name",length = 50)//默认属性就是列名
    private String name;

接口

//继承JpaRepository完成对数据库的操作 
public interface StuRepository extends JpaRepository<Student,Integer>{
    public int add(Student student);
}

基本配置

#更新或者參加数据表
spring.jpa.hibernate.ddl-auto=update
#打印sql语句控制台
spring.jpa.show-sql=true

测试

@Controller
public class IndexController {
    @Autowired
    StuRepository stuRepository;
    @GetMapping("/index/{id}")
    public void index(@PathVariable ("id") Integer id){
       //直接使用jpa提供好的方法
 Student student = stuRepository.getOne(id);
        System.out.println(student);
    }
}

前面直接使用的是jpa规范中定义好的接口,我们也可自己在接口中定义方法

//继承JpaRepository完成对数据库的操作
public interface StuRepository extends JpaRepository<Student,Integer>{
    @Query("select * from com.guxf.domain.Author au where id=:id")
    public List<Student> queryByName(@Param("id") Integer id);
}

关于更详细得springboot+jpa的用法参考文章地址

 

SpringBoot系列——Spring-Data-JPA - huanzi-qch - 博客园 (cnblogs.com)

SpringBoot系列——Spring-Data-JPA(升级版) - huanzi-qch - 博客园 (cnblogs.com)

SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口 - huanzi-qch - 博客园 (cnblogs.com) 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序三两行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值