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訪問數據庫的部分就說完了,同樣本篇文章也是在觀看了尚硅谷的視頻教程後總結的筆記。非常感謝尚硅谷的教學視頻,寫在這裏只是爲了加深我們印象,如果能爲其他同學提供一點點幫助就再好不過了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章