JDBC是一种用于执行SQL语句的API,可以为多种关系数据库提供统一访问,它是由一组用Java语言编写的类和接口。是Java访问数据库的标准规范。
JDBC是Java提供的一种标准规范,具体的实现由各个数据库厂商去实现。对开发者来说屏蔽了不同数据库之间的区别,可以使用相同的方式(Java API)去操作不同的数据库。两个设备之间要进行通信需要驱动,不同数据库厂商对JDBC的实现类就是去连接数据库的驱动。如mysql-connector-java
连接mysql
数据库的驱动。
// mysql 数据库:“com.mysql.jdbc.Driver”
Class.forName(driver);
Connection conn=DriverManager.getConnection(url,userName,password);
Statement statement =conn.createStatement();
ResultSet rs =statement.executeQuery(sql);
在使用JDBC进行数据库操作过程中,每次使用就要创建连接,同时使用完毕还必须得关闭连接,操作繁琐容易出错,并且Connection的取得和释放是代价比较高的操作。解决这个问题的方法就是连接池。连接池就是事先取得一定数量的Connection,程序执行处理的时候不是新建Connection,而是取得预先准备好的Connection。
提供连接池机能的技术叫做DataSource。DataSource是JDK提供一个标准接口在javax.sql.DataSource
包下。常见的DBCP、C3P0、druid等。
spring-boot-starter-jdbc
主要提供了三个功能,第一个就是对数据源的装配,第二个就是提供一个JdbcTemplate简化使用,第三个就是事务
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@SpringBootApplication
public class Application implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(Application.class);
@Autowired
DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println(">>>>>>>>>>>>>>>>>服务启动执行");
showConnection();
}
private void showConnection() throws SQLException {
logger.info("dataSource:{}", dataSource.getClass().getName());
Connection connection = dataSource.getConnection();
logger.info("connection:{}", connection.toString());
}
}
当前的pom文件中仅仅配置了spring-boot-starter-jdbc和mysql数据库驱动
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
runtime
在DataSourceAutoConfiguration
类的内部类PooledDataSourceConfiguration
标识了默认支持的数据源。
@Configuration
@Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
@Import({Hikari.class, Tomcat.class, Dbcp2.class, Generic.class, DataSourceJmxConfiguration.class})
protected static class PooledDataSourceConfiguration {
protected PooledDataSourceConfiguration() {
}
}
默认支持Hikari、Tomcat、Dbcp2、Generic、DataSourceJmxConfiguration这五种数据源。从上面的数据源和连接信息的打印可以知道默认情况下Springboot装配的是Hikari数据源。
对于Springboot默认支持的五种数据源,可以通过上面两种方式(一、排除默认数据源,添加使用的数据源;二、添加使用的数据源,使用配置文件指定使用的数据源) 进行选择使用数据源。如果是其他开源的数据源呢?比如阿里的druid数据源。有两种方式。
com.alibaba
druid
1.1.23
spring:
datasource:
url: jdbc:mysql://localhost:3306/readinglist?characterEncoding=utf8&useSSL=false
username: root
password: 12345678
type: com.alibaba.druid.pool.DruidDataSource
第二种
import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@SpringBootApplication
public class Application implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(Application.class);
@Autowired
DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println(">>>>>>>>>>>>>>>>>服务启动执行");
showConnection();
}
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/readinglist?characterEncoding=utf8&useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("12345678");
return dataSource;
}
private void showConnection() throws SQLException {
logger.info("dataSource:{}", dataSource.getClass().getName());
Connection connection = dataSource.getConnection();
logger.info("connection:{}", connection.toString());
}
}
Spring对数据库的操作在jdbc上面做了深层次的封装。使用Spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
Springboot中在需要使用事务的方法上面添加@Transactional
,需要注意的是,默认只会对运行时异常进行事务回滚,非运行时异常不会回滚事务。
Controller层定义了两个接口
@Service
public class DataOpeServiceImpl implements DataOpeService {
private Logger logger = LoggerFactory.getLogger(DataOpeServiceImpl.class);
@Autowired
private JdbcTemplate template;
@Override
public String queryData() {
String sql = "select * from t where id=1";
RowMapper data = new BeanPropertyRowMapper<>(T.class);
T t = template.queryForObject(sql, data);
return t.toString();
}
@Override
public String addData() {
List data = new ArrayList<>();
for (int i = 0; i < 2; i++) {
T item = new T();
item.setA(i);
item.setB(i);
data.add(item);
}
for (int i = 0; i < data.size(); i++) {
String sql = "insert into t(a,b) values (" + data.get(i).getA() + "," + data.get(i).getB() + ")";
logger.info("sql:{}", sql);
template.execute(sql);
}
return null;
}
}