一个技术框架始终是要和数据库打交道的,前面的几篇文章都没有提及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访问数据库的部分就说完了,同样本篇文章也是在观看了尚硅谷的视频教程后总结的笔记。非常感谢尚硅谷的教学视频,写在这里只是为了加深我们印象,如果能为其他同学提供一点点帮助就再好不过了。