JDBC概述
一、基本介绍
jdbc相关知识小结
事务
一、基本介绍
二、应用实列
package com.shiwu;
import com.JDBC_Utils.utils_demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
@SuppressWarnings("ALL")
//演示事务 的回滚
public class test {
public static void main(String[] args) throws SQLException {
// 使用自己创utils得到连接
Connection connection_utils = utils_demo.get_connection_utils();
// 不让他自动的提交
connection_utils.setAutoCommit(false); //设置false
String sql="update actor set name='小浩纸~~~~' where id=2";
String sql1="update actor set name='浩浩' where id=5";
PreparedStatement preparedStatement=null;
try {
preparedStatement = connection_utils.prepareStatement(sql);
// 执行
preparedStatement.executeUpdate();
// int i=1/0;
PreparedStatement preparedStatement1 = connection_utils.prepareStatement(sql1);
preparedStatement1.executeUpdate();
// 如果所有的代码都执行完成了 就他提交
connection_utils.commit();
} catch (SQLException throwables) {
// 如果报错了 就让他 回滚
connection_utils.rollback();
throwables.printStackTrace();
}finally{
// 使用工具类 释放资源
utils_demo.close_(null, preparedStatement,connection_utils);
}
}
}
batch批量处理
一、基本介绍
二、代码演示
package com.batch;
import com.JDBC_Utils.utils_demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
//演示 批量处理
public class batch_demo {
public static void main(String[] args) throws SQLException {
// 使用工具类得到一个连接
Connection connection_utils = utils_demo.get_connection_utils();
String sql="insert into zh_01 values(?,?) ";
PreparedStatement preparedStatement = connection_utils.prepareStatement(sql);
long start = System.currentTimeMillis();
for (int i = 0; i <5000; i++) {
preparedStatement.setInt(1, i);
preparedStatement.setString(2, "小浩纸~");
// 将数据添加到 批量处理中
preparedStatement.addBatch();
if ((i+1)%1000==0){
// 满了1000 条数据就提交一次
preparedStatement.executeBatch();
// 满了1000 条数据就提交一次 然后在清空
preparedStatement.clearBatch();
}
}
long end = System.currentTimeMillis();
System.out.println("耗时:"+ (end-start));//耗时:72
}
}
数据库连接池
一、传统连接问题的所在
二、一般使用 C3P0 和 Druid
Druid使用演示
代码演示
package com.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.Connection;
import java.util.Properties;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class druid_demo {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileReader("src\\druid.properties"));
// 创建一个数据库连接池 数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
long start=System.currentTimeMillis();
for (int i=0;i<5000;i++) {
Connection connection = dataSource.getConnection();
connection.close();
}
long end=System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
}
二、druid.properties 配置文件的详细信息
#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hsp_db02?rewriteBatchedStatements=true
username=root
password=123456
#initial connection Size
initialSize=10
#min idle connection size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000
Druid 德鲁伊 自建utils工具包
代码演示:将一些初始化 连接和关闭资源都放在一个集合里面
package com.JDBC_Utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class utils_druid {
private static DataSource dataSource;
// 通过static代码块来初始化
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("src\\druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取connection 连接
public static Connection get_Connection() throws SQLException {
return dataSource.getConnection();
}
// 关闭连接
public static void close_(ResultSet set, Statement statement, Connection connection) {
try {
if (set != null) {
set.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
Apaache-DBUtils
一、对resultSet的结果集 进行改造
二、代码案列
1、javaBean实列中 (一个类和mysql中的一个表对应起来)
package com.apache_DB_utils;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
// 和MySQL的 actor 表 形成了映射 将插叙到的 数据存放在这里
public class Actor {
private Integer id;
private String name;
private String sex;
private String borndate; //时间函数 使用 java.lang.utils 或者是 String
private String phone;
// 创建一个无参的构造器 底层反射会使用到
public Actor(){
}
public Actor(Integer id, String name, String sex, String bornDate, String phone) {
this.id = id;
this.name = name;
this.sex = sex;
this.borndate = bornDate;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getBorndate() {
return borndate;
}
public void setBorndate(String borndate) {
this.borndate = borndate;
}
@Override
public String toString() {
return "Actor{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", bornDate=" + borndate +
", phone='" + phone + '\'' +
'}';
}
}
2.完成对应的crud 操作 (增删改查)
package com.apache_DB_utils;
import com.JDBC_Utils.utils_druid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class DB_utils_demo {
//使用 apache-DBUtils 工具类 + druid 完成对表的 crud 操作
@Test
public void query_01() throws SQLException {
// 使用druid 创建连接
Connection connection = utils_druid.get_Connection();
// 创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
String sql="select * from actor where id=?";
// BeanListHandler 将结果集中的每行每列都放入到一个对应的javaBean实列中 然后在放入到对应 List集合中
List<Actor> query = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);
System.out.println("表中的数据是:");
for (Actor q:query){
System.out.println(q);
}
// 关闭连接
// 底层得到resultSet 会帮我们关闭 query set preparedStatement
com.JDBC_Utils.utils_druid.close_(null, null, connection);
}
// 使用 apache-DBUtils 工具类 + druid 完成 dml语言
@Test
public void query_02() throws SQLException {
Connection connection = utils_druid.get_Connection();
QueryRunner queryRunner = new QueryRunner();
// String sql ="update actor set name=? where id=?";
// String sql ="insert into actor values (null ,'张无忌','男','2000-05-05','1479')";
String sql ="delete from actor where id=? ";
// 这里使用的话就是 update
int row = queryRunner.update(connection, sql,7);
System.out.println(row>0?"成功":"失败");
}
}
DAO
一、基本说明:
二、代码案列:
基本设计:
1、工具类
(1) druid_properties
#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hsp_db02?rewriteBatchedStatements=true
username=root
password=123456
#initial connection Size
initialSize=10
#min idle connection size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000
(2) utils_druid
package com.DAO_.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class utils_druid {
private static DataSource dataSource;
// 通过static代码块来初始化
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("src\\druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取connection 连接
public static Connection get_Connection() throws SQLException {
return dataSource.getConnection();
}
// 关闭连接
public static void close_(ResultSet set, Statement statement, Connection connection) {
try {
if (set != null) {
set.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
2、javabean
package com.DAO_.domian;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
// 和MySQL的 actor 表 形成了映射 将插叙到的 数据存放在这里
public class Actor {
private Integer id;
private String name;
private String sex;
private String borndate;
private String phone;
// 创建一个无参的构造器 底层反射会使用到
public Actor(){
}
public Actor(Integer id, String name, String sex, String bornDate, String phone) {
this.id = id;
this.name = name;
this.sex = sex;
this.borndate = bornDate;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getBorndate() {
return borndate;
}
public void setBorndate(String borndate) {
this.borndate = borndate;
}
@Override
public String toString() {
return "Actor{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", bornDate=" + borndate +
", phone='" + phone + '\'' +
'}';
}
}
3、存放xxxDAO、BasicDAO
BasicDAO 公共的父类 存放所有表的共有的方法
package com.DAO_.dao;
import com.DAO_.utils.utils_druid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class BasicDAO<T>{
private QueryRunner queryRunner=new QueryRunner();
private Connection connection=null;
// 对应任何一个表 完成对他的曾删改
public int update(String sql,Object...args) {
Connection connection=null;
// 得到一个连接
try {
connection = utils_druid.get_Connection();
int update = queryRunner.update(connection, sql, args);
return update;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
utils_druid.close_(null, null, connection);
}
}
// 查询返回多个对象 对于多个表
public List<T> query_01(String sql,Class<T> tClass, Object...args){
try {
connection=utils_druid.get_Connection();
List<T> query = queryRunner.query(connection, sql, new BeanListHandler<>(tClass), args);
return query;
} catch (SQLException e) {
throw new RuntimeException();
} finally {
utils_druid.close_(null, null, connection);
}
}
// 查询返回单行单列 对于多个表
public T query_02(String sql,Class<T> tClass, Object...args){
try {
connection=utils_druid.get_Connection();
T query = queryRunner.query(connection, sql, new BeanHandler<>(tClass), args);
return query;
} catch (SQLException e) {
throw new RuntimeException();
} finally {
utils_druid.close_(null, null, connection);
}
}
// 查询返回一个单 对于多个表
public Object query_03(String sql, Object...args){
try {
connection=utils_druid.get_Connection();
Object query = queryRunner.query(connection, sql, new ScalarHandler(), args);
return query;
} catch (SQLException e) {
throw new RuntimeException();
} finally {
utils_druid.close_(null, null, connection);
}
}
}
2.xxxDAO
存放 这个表的独有的方法
package com.DAO_.dao;
import com.DAO_.domian.Actor;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class ActorDAO extends BasicDAO<Actor>{
// 继承了基础的dao 就有了所有的方法
// 如果还要有特有的方法就可以写在这里面
}
4、测试test
就会使测试非常的简洁
package com.DAO_.test;
import com.DAO_.dao.ActorDAO;
import com.DAO_.domian.Actor;
import org.junit.jupiter.api.Test;
import java.util.List;
/**
* @author ZhouHao
* @version 1.0
* 成为想成为的人
*/
public class test_demo {
@Test
// 1.查询的使用
public void test_01(){
ActorDAO actorDAO = new ActorDAO();
List<Actor> actors = actorDAO.query_01("select * from actor where id>?", Actor.class, 1);
System.out.println("===查询的结果是===");
for (Actor a:actors){
System.out.println(a);
}
}
@Test
// 2.修改数据
public void test_02(){
ActorDAO actorDAO = new ActorDAO();
int row = actorDAO.update("update actor set name=? where id=?", "张无忌",1 );
System.out.println(row>0?"成功":"失败");
}
}