第四天 JDBC应用
第一节 封装工具类
DBUtils类功能:1.注册驱动。2.获取连接。3.释放资源
1.1 重用性方案:
package DB.www;
import java.sql.*;
/**
* @author liu
* @create 2020-12-27-11:44
*/
public class DBUtils {
//定义连接字符串内容
private static String url = "jdbc:mysql://localhost:3306/schools?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";
private static String user = "root";
private static String password = "root";
private static Connection connection = null;
//1.注册驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获得连接
public static Connection getConnection(){
try {
connection = DriverManager.getConnection(url, user,password);
return connection;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//3.释放资源
public static void closeAll(ResultSet resultSet, Statement statement,Connection connection){
try {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
1.2 跨平台方案:
db.properties配置文件:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/schools?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
user=root
password=root
package DB.www.utils;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @author liu
* @create 2020-12-29-11:09
*/
public class DBUtils2 {
//定义连接字符串内容
private static String url ;
private static String user ;
private static String password ;
private static String driver ;
private static Connection connection = null;
//1.注册驱动
static {
try {
//通过流读取文件
//InputStream inputStream = new FileInputStream("src\\db.properties");
InputStream is = DBUtils2.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(is);
//为各个属性赋初值
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
//注册驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//2.获得连接
public static Connection getConnection(){
try {
connection = DriverManager.getConnection(url, user,password);
return connection;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//3.释放资源
public static void closeAll(ResultSet resultSet, Statement statement, Connection connection){
try {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
package test;
import DB.www.utils.DBUtils2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @author liu
* @create 2020-12-29-11:36
*/
public class TestJDBCForDQL2 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = DBUtils2.getConnection();
String sql = "select * from dept";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int deptno = resultSet.getInt(1);
String dname = resultSet.getString("dname");
String ioc = resultSet.getString("ioc");
System.out.println(deptno+":" + dname + ":" + ioc);
}
} catch (Exception throwables) {
throwables.printStackTrace();
}finally {
DBUtils2.closeAll(resultSet,preparedStatement,connection);
}
}
}
第二节 ResultSet查询封装
ORM(Object Relational Mapping)实体类(Entity):零散数据的载体
在应用开发中,从数据库查询出的结果集(ResultSet)一般都需要取得(get)其中的数据然后存放到(set)实体对象(entity)中,以便进一步处理。常用也最易理解的方式是从ResultSet中取得(get)向应的字段值然后调用实体对象的set方法,把值保存在实体对象中。
实体类
package entity;
import java.io.Serializable;
/**
* @author liu
* @create 2020-12-27-16:18
*/
public class Dept implements Serializable {
private int deptno;
private String dname;
private String ioc;
@Override
public String toString() {
return "Dept{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", ioc='" + ioc + '\'' +
'}';
}
public Dept() {
this.deptno = deptno;
this.dname = dname;
this.ioc = ioc;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getIoc() {
return ioc;
}
public void setIoc(String ioc) {
this.ioc = ioc;
}
}
总结:
- 将一行中多个零散数据进行整理
- 通过Entity的规则将表中的数据进行对象的封装
- 表名=类名;列名=属性名;提供各属性的get,set方法
- 提供无参构造方法(视情况添加有参构造方法)
第三节 DAO模式
3.1 工具类封装
案例:实现emp表的查询、添加、修改、删除
3.1.1 封装DButils
由于多处都需要使用数据库连接和释放,所以把功能封装到工具类中DButils
四个功能:1.注册驱动。2.获取连接。3.释放资源
package DB.www;
import java.sql.*;
/**
* @author liu
* @create 2020-12-27-11:44
*/
public class DBUtils {
//定义连接字符串内容
private static String url = "jdbc:mysql://localhost:3306/schools?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";
private static String user = "root";
private static String password = "root";
private static Connection connection = null;
//1.注册驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获得连接
public static Connection getConnection(){
try {
connection = DriverManager.getConnection(url, user,password);
return connection;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//3.释放资源
public static void closeAll(ResultSet resultSet, Statement statement,Connection connection){
try {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
3.2 DAO设计模式
DAO(Database Access Object 数据库访问对象)
为了降低耦合,提出了DAO封装数据库操作的设计模式。
它可以实现业务逻辑与数据库访问相分离。相对来说,数据库是比较稳定的,其中DAO组件依赖与数据库系统,提供数据库访问的接口,隔离了不同的数据库实现。
DAO模式的组成部分
1.DAO接口(主要包含添加、修改、删除方法)
2.DAO实现类
3.实体类(domain,beans,entity,pojo,model)
–作用:用在数据访问代码和业务逻辑代码之间通过实体类来传输数据
–实体类特征:
- 属性一般使用private修饰
- 提供public修饰的getter/settrt方法
- 实体类提供无参构造方法,根据业务提供有参构造
- 实现java.io.Serializable接口,支持序列化机制
4.数据库连接和关闭工具类
设计的包名
domain存放实体类
utils存放工具类
dao存放接口
dao.impl存放实现类
使用DAO设计模式实现emp表的查询、添加、删除、修改
第四节 Druid连接池
4.1 为什么使用连接池
用户每次请求都需要向数据库获取连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库资源,并且极易造成数据库服务器内存溢出、宕机。
现流行的有:DBCP,C3P0,Druid等。
Druid是目前比较流行的高性能的,分布式列储存的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一、亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二、实时数据注入
druid支持数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三、可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即使在加大数据规模的情况下,也能保证其实效性
四、多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop.spark,kafka,storm和samza等
五、丰富的社区
druid拥有丰富的社区
4.2 使用步骤
配置文件database.properties:
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=
uaername=root
password=root
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位 60000毫秒/1000毫秒等于60秒
maxWait=5000
4.2.1 导入jar包
druid-1.1.5.jar
mysql驱动包
4.2.2 编写工具类
package com.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author liu
* @create 2020-12-30-20:15
*/
public class DruidUtils {
//创建连接池对象
private static DruidDataSource dataSource;
private static Connection connection;
static {
//创建连接池
Properties properties = new Properties();
InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("database.properties");
try {
properties.load(inputStream);
//通过德鲁伊连接池工厂创建一个连接池,自动解析properties文件里的键值对
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获得一个连接池
public static DruidDataSource getDataSource(){
return dataSource;
}
public static Connection getConnection(){
try {
connection = dataSource.getConnection();
return connection;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static void closeAll(ResultSet resultSet, Statement statement,Connection connection){
try {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}