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