springboot(五).springboot的数据访问

一个技术框架始终是要和数据库打交道的,前面的几篇文章都没有提及springboot的数据访问,接下来这篇文章重点来说下springboot的数据访问。

      首先我们新建一个springboot项目,名称是demo3。

一.jdbc

1.依赖和配置

(1).添加的依赖

除了spring-boot-starter依赖和spring-boot-starter-test依赖外,还要添加下面3个依赖:

(2).配置数据源

application.yml配置文件中配置数据库信息,如下:

注意:springboot2.0以下版本用的默认是mysql-connector-java 5

com.mysql.jdbc.Driver 是 mysql-connector-java 5中的
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的

在本次实战中我们用的springboot2.1.4,则依赖默认用的是mysql-connector-java 6,所以驱动是:com.mysql.cj.jdbc.Driver,

为了能让DataSourceInitializer类生效,则需要配置:initialization-mode: always,如下图:

(3).默认配置

默认使用class org.apache.tomcat.jdbc.pool.DataSource作为数据源。

数据源的默认配置都在DataSourceProperties类中。

2.DataSourceInitializer类

DataSourceAutoConfiguration类中用到的DataSourceInitializer类

作用:

       runSchemaScripts();运行建表语句;

       runDataScripts();运行插入数据sql语句;

默认只要将文件命名为这种形式:schema-*.sql(建表语句)、data-*.sql(插入数据语句)

例子, 在resource文件下新建一个建表语句,如下:

启动项目,查看数据库,department表已经存在了,如下图:

另外一种方法让项目在启动执行sql文件,把刚才的schema-all.sql重名为department.sql。把数据库中department先删掉。

 建表语句目录如下:

在配置文件中,配置这个建表语句,内容如下:

再次启动项目查看并刷新这个数据库,可以看到department表已经创建出来了,如下图:

3.操作数据库

springboto已经自动配置了注入了jdbcTemplate

例子:从数据库查询一条记录。

先把刚才配置文件中新建表的sql文件配置部分注释,不然每次重启都会新建一张空白表,如下图:

接着在刚才新建的表中手动插入一条记录,如下图:

编写一个HelloController,代码如下:

package com.example.demo3.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
public class HelloController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/query")
    public Map query(){
       List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from department");
       return list.get(0);
    }

}

重启项目后,在浏览器地址栏输入:localhost:8080/query,响应页面如下,可以看到查到了我们刚才插入的数据:

二.Druid数据源

1.设置数据源

添加druid依赖

我们可以在maven仓库中找到该依赖:https://mvnrepository.com/artifact/com.alibaba/druid

      

在application.yml中配置数据源:

在测试类中我们获取到spring容器中的DataSource,来看看它的类名,测试类代码如下:

package com.example.demo3;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo3ApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() {
        System.out.println(dataSource.getClass());
    }

}

启动测试类,可以看到控制输出,数据源已经切换成了com.alibaba.druid.pool.DruidDataSource

2.自定义配置

(1).让其它配置生效

在applcation.yml文件中,添加这些配置,如下图:

编写一个配置类DruidConfig,让上红框中的配置生效,该类如下:

package com.example.demo3.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DruidConfig {

    //给application.yml中其他配置加上前缀spring.datasource,让其生效
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druid(){
        return new DruidDataSource();
    }
}

如果启动时项目报错如下:

则在pom文件中引入log4j依赖,如下图。再次启动项目,就不会报错了

(2).配置Druid监测

在DruidConfig类中配置一个管理后台的servlet和一个监控Filter,代码如下:

package com.example.demo3.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    //给application.yml中其他配置加上前缀spring.datasource,让其生效
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druid(){
        return new DruidDataSource();
    }

    //配置一个管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String, String> initParam = new HashMap<>();
        initParam.put("loginUsername", "root");
        initParam.put("loginPassword", "123456");
        initParam.put("allow", "");
        initParam.put("deny", "192.168.0.103"); //这里配的是本机ip
        bean.setInitParameters(initParam);
        return bean;
    }

    //配置一个监控Filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map<String,String> initParam = new HashMap<>();
        initParam.put("exclusions", "*.js,*.css,/druid/*");
        bean.setInitParameters(initParam);

        bean.setUrlPatterns(Arrays.asList("/*"));

        return bean;
    }
}

启动项目,在浏览器地址栏输入:localhost:8080/druid 回车,输入用户名:root,密码:123456,登录

登录后就可以看到监控页面了,如下图:

三.整合mybatis

1.步骤

(1).添加依赖

给项目中引入mybatis的依赖,如下:

(2).给数据库建表,department,employee

department表:

employee表:

(3).创建javaBean,Department,Employee

这两个实体类的属性和数据库的字段相对应,这里就就不在展示了,放的位置如下:

到这里我们的准备工作完成了,下面来看看如何应用。

2.注解版

(1).编写一个接口,如下图:

package com.example.demo3.interf;

import com.example.demo3.bean.Department;
import org.apache.ibatis.annotations.*;

@Mapper   //指定这是一个操作数据库的Mapper
public interface DepartmentMapper {

    /**
     * 通过id查询部门信息
     * @param id
     * @return
     */
    @Select("select * from department where id=#{id}")
    public Department getDepartmentById(Integer id);

    /**
     * 通过id删除部门信息
     * @param id
     * @return
     */
    @Delete("delete from department where id=#{id}")
    public int delDepartmentById(Integer id);

    /**
     * 保存部门信息
     * 开启自动主键,把主键绑定给对象属性id
     * @param department 部门对象
     * @return
     */
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("insert into department (departmentName) values (#{departmentName})")
    public int insertDepartment(Department department);

    /**
     * 修改部门信息
     * @param department
     * @return
     */
    @Update("update department set departmentName=#{departmentName} where id=#{id}")
    public int updateDepartment(Department department);
}

(2).编写controller直接调用,如下图:

package com.example.demo3.controller;

import com.example.demo3.bean.Department;
import com.example.demo3.interf.DepartmentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DepartmentController {

    @Autowired
    DepartmentMapper departmentMapper;

    /**
     * 查询部门信息
     * @param id
     * @return
     */
    @GetMapping("/dept/{id}")
    public Department getDept(@PathVariable("id") Integer id){
        return departmentMapper.getDepartmentById(id);
    }

    @GetMapping("/dept")
    public Department insertDept(Department department){
        departmentMapper.insertDepartment(department);
        return department;
    }
}

(3).测试

启动项目,在浏览器地址栏输入  http://localhost:8080/dept?departmentName=cdd , 回车。会把这个部门名称存进数据库,再展示到页面,如下图:

(4).附加

开启驼峰命名规则
大家有没有发现department表的departmentName字段是驼峰命名法,可实际中往往是这样的department_name。此时数据绑定不上了,该怎么做? 可以编写一个配置类,在配置类中开启驼峰规则绑定数据,配置类如下:

package com.example.demo3.config;

import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisConfig {

    @Bean
    public ConfigurationCustomizer configurationCustomizer(){
        return new ConfigurationCustomizer() {
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);   //开启驼峰命名规则
            }
        };
    }
}

 

批量扫描mapper接口

在实际开发过程当中,如果有很多的xxxMapper接口,每个接口上都要打@Mapper注解,不打就报错,太麻烦了。 我们可以给启动类或配置类上打@MapperScan,批量扫描mapper接口,如下图:

这时候可以去掉departmentMapper接口上打的@Mapper注解,照样能够正常运行。

3.配置文件版

(1).添加员工映射接口

代码如下图:

package com.example.demo3.mapper;

import com.example.demo3.bean.Employee;

/**
 * 注意要用@Mappser或@MapperScan注解把这个Mapper扫描到,
 * 这里我在前面已经用@MapperScan扫描这个接口所在的包了
 */
public interface EmployeeMapper {

    /**
     * 查询员工信息
     * @param id
     * @return
     */
    public Employee getEmpById(Integer id);

    /**
     * 保存员工信息
     * @param employee
     * @return
     */
    public Employee insertEmp(Employee employee);
}

(2).添加mybatis全局配置文件

配置文件内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--开启驼峰命名规则-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>

目录结构如下:

(3).添加员工sql映射配置文件

配置文件内容如下,这个配置文件和映射接口EmployeeMapper 相对应,映射规则和以前学的mybatis一样:

<?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.demo3.mapper.EmployeeMapper"> <!--这里的命名空间和和之前的EmployeeMapper接口对应-->

    <!--查询员工信息-->
    <select id="getEmpById" resultType="com.example.demo3.bean.Employee">
        select * from employee where id=#{id}
    </select>

    <!--保存员工信息-->
    <insert id="insertEmp">
        insert into employee (id,last_name,email,gender,d_id) values (#{id},#{lastName},#{email},#{gender},#{dId})
    </insert>

</mapper>

(4).配置上面两个文件位置

在application.yml中配置mybatis的主配置文件位置和sql映射文件位置,如下图:

(5).测试

先在employee表中插入一条数据,如下图:

编写一个EmployeeController,代码如下:

package com.example.demo3.controller;

import com.example.demo3.bean.Employee;
import com.example.demo3.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmployeeController {

    @Autowired
    EmployeeMapper employeeMapper;

    /**
     * 查询员工信息
     * @param id
     * @return
     */
    @GetMapping("/emp/{id}")
    public Employee getEmp(@PathVariable("id") Integer id){
        return employeeMapper.getEmpById(id);
    }
}

启动项目,在浏览器地址栏输入:http://localhost:8080/emp/1 ,回车,可以看到下面的响应,说明成功了。

四.整合JPA

1.springData JPA简介

(1).简介

spring Data是为了简化构建基于spring框架应用的数据库访问技术,包括菲关系型数据库、Map-Reduce框架、云数据服务

等等;当然也包含对关系型数据库的访问支持。

(2).spring data体系图

2.整合JPA

JPA也是基于对象关系映的(ORM,Object Relational Mapping)。

(1).引入springboot jpa依赖

首先添加springboot jpa依赖,用2.1.4版本的可能会报错,这里用1.5.20版本:

(2).编写一个实体类

编写一个实体类(bean)和数据表进行映射,并且配置好映射关系

              @Entity  //告诉JPA这是一个实体类(和数据库表映射的类)

              @Table(name="tbl_user")  //@Table来指定和那个数据库表对应,如果省略,表名默认为类名小写

              @Id   //这是一个主键

              @GeneratedValue(strategy = GenerationType.IDENTITY)  //这是一个自增主键

              @Column(name = "last_name", length = 50)  //设置数据库表对应的列名、长度;省略,默认列名就是属性名。

如下图所示:

package com.example.demo3.bean;

import javax.persistence.*;

//使用jpa注解配置映射关系
@Entity   //告诉jpa这是一个实体类(和数据库表映射)
@Table(name="tbl_user")    //@Table来指定和那个表映射,如果省略表明默认为类名小写
public class User {

    @Id  //这是一个主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  //这是一个自增主键
    private Integer id;

    @Column(name="last_name", length = 50)   //设置数据库表对应的列名
    private String lastName;

    @Column     //省略,默认列名就是属性名
    private String email;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

(3).编写一个Dao接口

编写一个Dao接口来操作实体类对应的数据库表,代码如下:

package com.example.demo3.dao;

import com.example.demo3.bean.User;
import org.springframework.data.jpa.repository.JpaRepository;

//继承JpaRepository来完成数据库的操作
public interface UserDao extends JpaRepository<User, Integer> {
}

(4).基本的配置

在application.yml中做如下配置:

(5).启动项目

查看jdbc数据库,可以看到tbl_user表已经创建出来了,如下图:

(6).编写一个controller

编写一个UserController,来对tal_user表进行操作,如下图:

package com.example.demo3.controller;

import com.example.demo3.bean.User;
import com.example.demo3.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    UserDao userDao;

    /**
     * 查询用户
     * @param id
     * @return
     */
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") Integer id){
       return userDao.getOne(id);
    }

    /**
     * 保存用户
     * @param user
     * @return
     */
    @GetMapping("/user")
    public User insertUser(User user){
        User user1 = userDao.save(user);
        return user1;
    }
}

(7).发请求测试

启动项目,在浏览器地址栏输入:http://localhost:8080/user?lastName=zhangsan&email=aa,返回如下:

 

到这里我们springboot访问数据库的部分就说完了,同样本篇文章也是在观看了尚硅谷的视频教程后总结的笔记。非常感谢尚硅谷的教学视频,写在这里只是为了加深我们印象,如果能为其他同学提供一点点帮助就再好不过了。

发布了45 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_41968788/article/details/89890122