1. JDBC
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.43.105:3306/jdbc
driver-class-name: com.mysql.cj.jdbc.Driver
效果:
默认使用com.zaxxer.hikari.HikariDataSource作为数据源;数据源的相关配置都在DataSourceProperties里面
自动配置原理:
org.springframework.boot.autoconfigure.jdbc:
1. 参考DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以使用spring.datasource.type指定自定义的数据源类型;
2、SpringBoot默认可以支持;
HikariDataSource
org.apache.tomcat.jdbc.pool.DataSource
BasicDataSource
3. 自定义数据源类型
@Configuration
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"}
)
static class Generic {
Generic() {
}
@Bean
public DataSource dataSource(DataSourceProperties properties) {
// 使用DataSourceBuilder创建数据源,利用反射出啊关键响应type的数据源,并且绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}
- DataSourceInitializer:ApplicationListener;
作用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
默认只需要将文件命名为
schema‐*.sql、data‐*.sql
默认规则:schema.sql,schema‐all.sql;
可以使用
schema:
‐ classpath:department.sql
指定位置
如果你用的是spring2xx版本需要加上下面的一句话
initialization-mode: always
- 操作数据库:自动配置类jdbcTemplate操作数据库
2. 整合Druid数据源
导入druid数据源
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public 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<String, String>();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "123456");
initParams.put("allow", "");//默认就是允许所有访问
initParams.put("deny", "192.168.43.105");
bean.setInitParameters(initParams);
return bean;
}
//2. 配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<String, String>();
initParams.put("exclusions", "*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
3. 整合MyBatis
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
步骤:
1. 配置数据源相关属性
2. 给数据库建表
3. 创建JavaBean
1. 注解版
package com.matthew.springboot.mapper;
import com.matthew.springboot.bean.Department;
import org.apache.ibatis.annotations.*;
/**
* @Description TODO
* @Author Matthew
* @Date 2019/6/9 14:25
* @Version 1.0
*/
//指定这是一个操作数据库的mapper
@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);
@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);
}
问题:
自定义MyBatis的配置规则;给容器中添加一个ConfigurationCustomizer;
package com.matthew.springboot.config;
import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
/**
* @Description TODO
* @Author Matthew
* @Date 2019/6/9 14:59
* @Version 1.0
*/
@org.springframework.context.annotation.Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer(){
@Override
public void customize(Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
使用MapperScan批量扫描所有的Mapper接口
@MapperScan(value = "com.matthew.springboot.mapper")
public class SpringBoot06DataMabytisApplication {
让数据库的列名和字段匹配
数据库是department_name
bean中是departmentName
package com.matthew.springboot.config;
import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
/**
* @Description TODO
* @Author Matthew
* @Date 2019/6/9 14:59
* @Version 1.0
*/
@org.springframework.context.annotation.Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer(){
@Override
public void customize(Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
2. 配置文件版
mybatis:
config-location: classpath:mybatis/mybatis-config.xml 指定全局配置文件的位置
mapper-locations: classpath:mybatis/mapper/*.xml 指定sql映射文件的位置
mapUnderscoreToCamelCase
Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn.
支持从经典数据库列名A_COLUMN到驼峰式经典Java属性名称aColumn的自动映射。
4. JPA
1. SpringData简介
2. 整合SpringData JPA
JPA:ORM(Object Relational Mapping);
- 编写一个实体类(bean)和数据表进行映射,并且配置好映射关系;
package com.matthew.springboot.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
/**
* @Description TODO 使用JPA注解配置映射关系
* @Author Matthew
* @Date 2019/6/10 17:47
* @Version 1.0
*/
@Getter
@Setter
@Entity//高速JPA这是一个实体类(和数据表映射的类)
@Table(name = "tbl_user")//@Table来指定和哪个数据表对应;如果省略默认表名就是user
public class User {
@Id//这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
private Integer id;
@Column(name = "last_name" ,length = 50)//这是和数据表对应的一个列
private String lastName;
@Column//省略默认列名就是属性名
private String email;
}
- 编写一个Dao接口来操作实体类对应的数据表(Repository)
//继承JpaRepository来完成对数据库的操作,第一个泛型是操作的实体类,第二个是主键的类型
public interface UserRepository extends JpaRepository<User,Integer> {}
- 基本的配置
spring:
datasource:
hikari:
jdbc-url: jdbc:mysql://192.168.43.105/jpa
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
#更新或者创建数据表结构
ddl-auto: update
#控制台显示SQL
show-sql: true
- 编写controller进行测验
package com.matthew.springboot.controller;
import com.matthew.springboot.entity.User;
import com.matthew.springboot.repository.UserRepository;
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;
import javax.jws.soap.SOAPBinding;
/**
* @Description TODO
* @Author Matthew
* @Date 2019/6/10 18:09
* @Version 1.0
*/
@RestController
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Integer id) {
User user = userRepository.findById(id).orElse(null);
return user;
}
@GetMapping("/user")
public User insertUser(User user) {
User save = userRepository.save(user);
return save;
}
}
http://localhost:8080/user?lastName=zhangsan&email=aa
http://localhost:8080/user?lastName=lisi&email=bb
http://localhost:8080/user/1
页面输出
{"id":3,"lastName":"lisi","email":"bb"}
控制台输出
Hibernate: select user0_.id as id1_0_0_, user0_.email as email2_0_0_, user0_.last_name as last_nam3_0_0_ from tbl_user user0_ where user0_.id=?
Hibernate: insert into tbl_user (email, last_name) values (?, ?)
Hibernate: insert into tbl_user (email, last_name) values (?, ?)
Hibernate: select user0_.id as id1_0_0_, user0_.email as email2_0_0_, user0_.last_name as last_nam3_0_0_ from tbl_user user0_ where user0_.id=?