JDBC(默认支持的数据源)
1)创建新的Springboot项目,添加web模块、mysql模块、jdbc模块
2) 连接我们的数据库:
打开我们的虚拟机,然后启动mysql的容器
3)在我们的项目中,添加数据源的配置信息。
这里使用yml文件,properties文件也一样。
在resources下:创建application.yml文件。
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://10.6.11.17:3306/jdbc
在mysql的客户端上面,创建jdbc数据库:
4)测试数据源是否配置成功
在test包下:
效果:
默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源
数据源的相关配置都在DataSourceProperties里面。
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties
implements BeanClassLoaderAware, EnvironmentAware, InitializingBean {
5) 自动配置的原理
org.springframework.boot.autoconfigure.jdbc:
1、参考DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以使用
spring.datasource.type指定自定义的数据源类型;
2、SpringBoot默认支持的数据源:
org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource
3、自定义数据源类型
/**
* Generic DataSource configuration.
*/
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
4、自动运行sql语句的原理
DataSourceAutoConfiguration:中有一个DataSourceInitializer对象。
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSourceInitializer dataSourceInitializer(DataSourceProperties properties,
ApplicationContext applicationContext) {
return new DataSourceInitializer(properties, applicationContext);
}
···
}
DataSourceInitializer:ApplicationListener
class DataSourceInitializer implements ApplicationListener
作用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
默认只需要将文件命名为:
schema‐*.sql、data‐*.sql
默认规则:schema.sql,schema‐all.sql;
自定义名字:
在配置文件中:
schema:
‐ classpath:department.sql
指定位置
验证:
在resources下:创建默认命名规则的:schema-all.sql文件:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`departmentName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
现在jdbc中还没有department表:
运行我们的Springboot项目:
刷新jdbc数据库:
使用自定义的命名规则:
修改schema-all.sql 的名字为:department.sql
在application.yml文件中:
删除jdbc中的department表,然后再次启动Springboot项目:
5、操作数据库:Springboot自动配置了JdbcTemplate操作数据库
说明Springboot已经帮我们配置好了JdbcTemplate模板引擎,我们可以直接使用:
创建HelloController:
@Controller
public class HelloController {
@Autowired
private JdbcTemplate jdbcTemplate;
@ResponseBody
@RequestMapping("/query")
public Map<String, Object> queryDepartment() {
List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from department");
//返回第一条数据
return mapList.get(0);
}
}
启动应用:
打开mysql的客户端:
添加一条数据:
打开浏览器:输入:http://localhost:8080/query
整合Druid数据源(阿里的数据源连接池)
1)导入druid的依赖
<!--导入druid的数据源-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
2) 切换数据源:
使用type来切换数据源
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://10.6.11.17:3306/jdbc
type: com.alibaba.druid.pool.DruidDataSource
# schema:
# - classpath:department.sql
3) 运行测试类:
数据源切换成功。
4)添加druid的独有配置
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://10.6.11.17:3306/jdbc
type: com.alibaba.druid.pool.DruidDataSource
#数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# schema:
# - classpath:department.sql
dubug一下,看是否是其他属性配置成功:
给contextLoads中的System.out.println(dataSource);打上断点
dubug运行该测试方法:
因为我们在application配置文件中配置的:spring-datasource:开头的配置信息,都是DataSourceProperties中的
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties
而DataSourceProperties类中,根本没有druid那些独有的配置信息:
5)自己配置druid数据源
在config包下,创建MyDruidConfig类:
这样就能将application配置文件中的druid的独有配置信息调入到我们的druid数据源当中了。
如果没有添加@ConfigurationProperties(prefix = “spring.datasource”)的话:
需要自己手动一个一个的配置
@Bean
DataSource druid() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setInitialSize(5);
druidDataSource.setMaxActive(10);
···
return druidDataSource;
}
再次dubug测试方法:
6)配置druid的监控
在MyDruidConfig类中:
//配置Druid的监控
//1、配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","123456");
initParams.put("allow","");//默认就是允许所有访问
initParams.put("deny","192.168.15.21");//不然访问
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");//排除静态资源
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
启动Springboot应用:
在浏览器中输入:http://localhost:8080/druid
输入自己配置的用户名与密码:
initParams.put("loginUsername","admin");
initParams.put("loginPassword","123456");
在浏览器中输入:http://localhost:8080/query
然后点击SQL监控:
点击Web应用:就是我们的配置WebAppStat List过滤器
监控成功!!!
整合MyBatis
前期准备阶段
1)创建新的项目,添加web、mysql、mybatis模块:
导入druid依赖:
<!--导入druid的数据源-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
2)创建application.yml文件:
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://10.6.11.17:3306/mybatis
type: com.alibaba.druid.pool.DruidDataSource
#数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
schema:
- classpath:sql/department.sql
- classpath:sql/employee.sql
3) 创建新的数据库mybatis:
4)在resours下:参加过sql文件夹
里面放入:department.sql 和 employee.sql文件:
department.sql:
/*
Navicat MySQL Data Transfer
Source Server : 本地
Source Server Version : 50528
Source Host : 127.0.0.1:3306
Source Database : restful_crud
Target Server Type : MYSQL
Target Server Version : 50528
File Encoding : 65001
Date: 2018-03-05 10:41:40
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`departmentName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
employee.sql文件:
/*
Navicat MySQL Data Transfer
Source Server : 本地
Source Server Version : 50528
Source Host : 127.0.0.1:3306
Source Database : restful_crud
Target Server Type : MYSQL
Target Server Version : 50528
File Encoding : 65001
Date: 2018-03-05 10:41:58
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lastName` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`gender` int(2) DEFAULT NULL,
`d_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
5) 创建config:DruidConfig配置类:
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
DataSource druid() {
return new DruidDataSource();
}
//配置Druid的监控
//1、配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "123456");
initParams.put("allow", "");//默认就是允许所有访问
initParams.put("deny", "192.168.15.21");//不然访问
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*");//排除静态资源
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
6) 启动Springboot应用:
打开mysql的客户端:生成了两个表:
注释掉,application配置文件中的schema:(防止再次启动应用,表又归零!)
# schema:
# - classpath:sql/department.sql
# - classpath:sql/employee.sql
7)创建bean对象:
根据数据库mybatis中的两个表,创建对应的JavaBean对象。
Employee:
public class Employee {
private Integer id;
private String lastName;
private Integer gender;
private String email;
private Integer dId;
··· get和set方法
}
Department:
public class Department {
private Integer id;
private String departmentName;
··· get和set方法
}
mybatis的使用
注解版
1)创建mapper文件夹:DepartmentMapper(接口)
@Mapper
public interface DepartmentMapper {
@Select("select * from department where id=#{id}")
public Department getDeptById(Integer id);
@Delete("delete from department where id=#{id}")
public int deleteDeptById(Integer id);
//回显主键的id。
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into department(departmentName) values(#{departmentName})")
public int insertDept(Department department);
@Update("update department set departmentName=#{departmentName} where id=#{id}")
public int updateDept(Department department);
}
2) 创建一个DepartmentController:
@RestController
public class DepartmentController {
@Autowired
private DepartmentMapper departmentMapper;
@GetMapping("/dept/{id}")
public Department findDepartmentById(@PathVariable("id") Integer id) {
return departmentMapper.getDeptById(id);
}
@GetMapping("/dept")
public Department addDepartment(Department department) {
departmentMapper.insertDept(department);
return department;
}
}
3) 启动Springboot应用:
在浏览器中输入:http://localhost:8080/dept/1
在浏览器中输入:http://localhost:8080/dept?departmentName=aa
问题:
我们将mysql中的departmentName改为:department_name.
修改我们的DepartmentMapper中的departmentName为:department_name。
再次启动Springboot应用:
在浏览器中输入:http://localhost:8080/dept?departmentName=bb
如果你的mybat的依赖版本的1.3.2以上,会执行成功,因为默认支持驼峰命名了。如果失败的话,我们需要自定义mybatis的规则:
创建MybatisConfig配置类:
@Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer customizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
//使用驼峰命名规则
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
或者使用在配置文件中,配置驼峰命名规则。
4)扫描多个mapper类:
在配合类上面加上:
@MapperScan(value = “com.liuzhuo.springboot.mapper”)
使用MapperScan批量扫描所有的Mapper接口;
@MapperScan(value = "com.liuzhuo.springboot.mapper")
@SpringBootApplication
public class SpringBoot06DataMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot06DataMybatisApplication.class, args);
}
}
这样,我们就不必须要在每个mapper类上,加@Mapper注解了
配置文件版
1)创建EmployeeMapper接口:
//必须使用@Mapper或者@MapperScan。二者其一即可
public interface EmployeeMapper {
public Employee findEmplById(Integer id);
public void insertEmpl(Employee employee);
}
2) 创建mybatis的全局配置文件:
在resours下创建mybatis/mapper文件夹:
在mybatis文件夹下,创建mybatis的全局配置文件:
不会写的话,看mybatis的官网文档,mybatis已经被整合到github上面:
其中的什么数据源,mapper的文件扫描,我们全部删除,我们已经使用application.yml文件配置了。
最终mybatis-config.xml:
就设置了一个使用驼峰命名法
<?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)创建mapper.xml文件:
在mapper文件夹下,创建employee-mapper.xml
文件不会写,看官方文档:
最终employee-mapper.xml:
<?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.liuzhuo.springboot.mapper.EmployeeMapper">
<!--
public Employee findEmplById(Integer id);
public Employee insertEmpl(Employee employee);
-->
<select id="findEmplById" resultType="com.liuzhuo.springboot.bean.Employee">
select * from employee where id = #{id}
</select>
<insert id="insertEmpl" >
INSERT INTO employee(lastName,email,gender,d_id) VALUES (#{lastName},#{email},#{gender},#{dId})
</insert>
</mapper>
4) 在application.yml文件中,制定全局mybatis.xml和mapper.xml的映射:
mybatis:
config-location: classpath:mybatis/mybatis-config.xml 指定全局配置文件的位置
mapper-locations: classpath:mybatis/mapper/*.xml 指定sql映射文件的位置
5) 创建EmployeeController:
@RestController
public class EmployeeController {
@Autowired
private EmployeeMapper employeeMapper;
@GetMapping("/empl/{id}")
public Employee findEmplById(@PathVariable("id") Integer id) {
return employeeMapper.findEmplById(id);
}
@GetMapping("/empl")
public Employee insertEmpl(Employee employee) {
employeeMapper.insertEmpl(employee);
return employee;
}
}
6) 启动Springboot应用
在浏览器中输入:http://localhost:8080/empl/1
在浏览器中输入:http://localhost:8080/empl?lastName=jack&&email=4324324@qq.com&&gender=1&&dId=2
再次浏览器中输入:http://localhost:8080/empl/1
最主要的就是在application配置文件中:
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
更多使用参照:
mybatis-spring-boot-autoconfigure
整合SpringData JPA
SpringData简介
整合SpringData JPA
JPA:ORM(Object Relational Mapping)
1)创建新的Springboot项目,添加web、mysql、jpa模块:
2)在application.yml配置文件中:
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://10.6.11.17:3306/jpa
jpa:
# 自动创建数据库的表
hibernate:
ddl-auto: update
# 显示sql语句
show-sql: true
3) 在mysql客户端中创建jpa数据库:
4)编写一个实体类(bean)和数据表进行映射,并且配置好映射关系
在bean包下,创建User类:
//使用JPA注解配置映射关系
@Entity //表明是一个实体与数据库中的某个表对应的注解
@Table(name = "t_user") //表示User类与t_user表对象,不写的话,默认就类名小写的表名
public class User {
@Id //这是一个主键:javax.persistence.Id;
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
private Integer id;
@Column(name = "last_name", length = 50)//这是和数据表对应的一个列
private String lastName;
@Column //省略默认列名就是属性名
private String email;
····get和set方法
}
5)编写一个Dao接口来操作实体类对应的数据表(Repository):
继承JpaRepository类就行:<T,U>: T : 实体类, U : 主键类型
6)基本的配置(JpaProperties)
spring:
jpa:
hibernate:
# 更新或者创建数据表结构
ddl‐auto: update
# 控制台显示SQL
show‐sql: true
7) 编写UserController类
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/user/{id}")
public User findUserById(@PathVariable("id") Integer id) {
User user = userRepository.findOne(id);
return user;
}
@GetMapping("/user")
public User insertUser(User user) {
User save = userRepository.save(user);
return save;
}
}
8) 启动Springboot应用:
打开mysql的客户端:
自动帮我们创建了t_user表
在浏览器中输入:http://localhost:8080/user/1
在浏览器中输入:http://localhost:8080/user?lastName=zhangsan&email=89028394@qq.com
控制台:(打印出了sql语句)
mysql客户端:
其他博客:
https://blog.csdn.net/oChangWen/article/details/52788274?locationNum=3