SpringData介绍
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理
Spring Data官网:https://spring.io/projects/spring-data
有关数据库相关的启动器:可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.4.3/reference/htmlsingle/#using-boot-starter
- 必要的两个依赖
<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>
- 编写yaml配置文件连接数据库
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_zr?serverTimezone=PRC
driver-class-name: com.mysql.cj.jdbc.Driver
password: root
username: root
- 可以去测试类测试一下是否能连接成功
@SpringBootTest
class DemoApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
//看一下默认数据源
System.out.println(dataSource.getClass());
//获得连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//关闭连接
connection.close();
}
}
- 结果:springboot默认配置的数据源为class com.zaxxer.hikari.HikariDataSource
全局搜索一下,找到数据源的所有自动配置都在 :DataSourceAutoConfiguration文件
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@Conditional(EmbeddedDatabaseCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import(EmbeddedDataSourceConfiguration.class)
protected static class EmbeddedDatabaseConfiguration {
}
@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
//一共导入了六种数据源
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration {
}
HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀
可以使用 spring.datasource.type 在配置文件中指定自定义的数据源类型,值为要使用的连接池实现的全类限定名
JDBCTemplate
-
有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
-
即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate。
-
数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
-
Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,只需手动注入即可使用
-
JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(JdbcOperations.class)
class JdbcTemplateConfiguration {
//注入JdbcTemplate到springIOC容器中
@Bean
@Primary
JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
JdbcProperties.Template template = properties.getTemplate();
jdbcTemplate.setFetchSize(template.getFetchSize());
jdbcTemplate.setMaxRows(template.getMaxRows());
if (template.getQueryTimeout() != null) {
jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());
}
return jdbcTemplate;
}
}
JdbcTemplate主要提供以下几类方法
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
- call方法:用于执行存储过程、函数相关语句
测试:dao层方法编写
@Repository
public class UserDao {
//注入JdbcTemplate模板进行增删改查操作
//JdbcTemplate底层已经实现了自动注入数据源以及获取连接、释放连接,不用我们手动执行,非常方便
@Autowired
JdbcTemplate jdbcTemplate;
//查询user所有数据
public List<Map<String, Object>> queryUsers(String sql) throws SQLException {
List<Map<String, Object>> users = jdbcTemplate.queryForList(sql);
return users;
}
//更新一条数据
public int update(String sql){
int update = jdbcTemplate.update(sql,new Object[]{"chenhui","222222",1,new Date(),15});
return update;
}
//添加一条数据
public int add(String sql){
int add = jdbcTemplate.update(sql,new Object[]{"hui","888888",0,new Date()});
return add;
}
//删除一条数据
public int delete(String sql,int id){
int delete = jdbcTemplate.update(sql,id);
return delete;
}
}
测试类:
@SpringBootTest
class DemoApplicationTests {
//注入daoUserDao对象进行增删改查操作
@Autowired
UserDao userDao;
@Test
void contextLoads() throws SQLException {
//测试查询所有数据
List<Map<String, Object>> users = userDao.queryUsers("select * from t_user");
System.out.println(users);
//测试更新一条数据
int update = userDao.update("update t_user set username=?,password=?,gender=?,regist_time=? where id=?");
System.out.println("更新了"+update+"数据");
//测试添加一条数据
int add = userDao.add("insert into t_user (username,password,gender,regist_time) values(?,?,?,?)");
System.out.println("添加了"+add+"数据");
//测试删除一条数据
int delete = userDao.delete("delete from t_user where id=?", 40);
System.out.println("删除了"+delete+"条数据");
}
}