一、为简化代码,使用DBUtils。
commons-dbutils是Apache提供的一个开源JDBC工具类库,它是对JDBC的简单封装。其中QueryRunner类封装了sql语句的执行,是线程安全的
(1)可以实现增、删、改、查、批处理
(2)考虑了事务处理需要共用Connecton
(3)简化了sql查询,它与ResultSetHandler组合在一起使用可以完成大部分数据库单
public int[ ] batch(Connection conn, String sql,ResultHandler<T>rsh.Object[][] params) throws SQLException:支持批处理insert,update,delete语句
二、Handler类型
ArrayHandler | 将结果集中第一条记录封装到Object[]数组中,数组中每一个元素就是这条记录中每一个字段的值 |
ArrayListHandler | 将结果集中每一条记录都封装到一个Object[]数组中,将这些数组再封装到List集合中 |
BeanHandler | 将结果集第一条记录封装到一个指定的javaBean中 |
BeanListHandler | 将结果集每一条记录封装到指定的javaBean中,将这些javaBean再封装到List集合中 |
utils包中JDBCTools类如下:
package com.xpu.jdbc.utils;
/*utils工具类中会三个提供方法:
1、获取连接池对象
2、从连接池中获取连接
3、将连接归还到连接池
*/
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCTools {
private static DataSource dataSource;
static {
try {
//1、使用类加载器读取配置文件,转换成字节输入流
InputStream is = JDBCTools.class.getClassLoader().getResourceAsStream("druid.properties");
//2、使用properties对象加载字节输入流
Properties properties = new Properties();
properties.load(is);
//3、使用DruidDataSourceFactory创建连接池对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
获取连接池对象
@return
*/
public static DataSource getDataSource() throws Exception {
return dataSource;
}
/**
* 获取连接池对象
* @return
*
*/
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (Exception throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables.getMessage());
}
}
public static void releaseConnection(Connection connection) {
//这里并不抛出编译时异常,而是当用户在运行时产生异常时,才会将这个异常抛出
try {
connection.close();
} catch (Exception throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables.getMessage());
}
}
}
TestDBUtils类如下:
import com.xpu.jdbc.User;
import com.xpu.jdbc.utils.JDBCTools;
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 org.junit.Before;
import org.junit.Test;
import java.sql.SQLException;
import java.util.List;
public class TestDBUtils {
private QueryRunner queryRunner;
@Before
public void init() throws Exception {
//1、创建QueryRunner对象
queryRunner = new QueryRunner(JDBCTools.getDataSource());
}
@Test
public void testInsert() throws Exception {
/*
//第一种方式:需要自己在执行sql语句是手动传入连接对象
//往user表中添加一行数据
QueryRunner queryRunner = new QueryRunner();
//2、调用queryRunner对象的方法执行sql语句,如果实质性增删改的sql语句则调用update方法
String sql = "insert into user(username,password,nickname) values(?,?,?)";
// queryRunner.update(连接对象,sql语句,问号处的参数(属于可变参数))
queryRunner.update(JDBCTools.getConnection(),sql,"dd","123456","ddd");
*/
//第二种方式:直接将连接池对象交给QueryRunner
// QueryRunner queryRunner = new QueryRunner(JDBCTools.getDataSource());
//2、调用queryRunner对象的方法执行sql语句,如果实质性增删改的sql语句则调用update方法
String sql = "insert into user(username,password,nickname) values(?,?,?)";
// queryRunner.update(sql语句,问号处的参数(属于可变参数))
queryRunner.update(sql,"dd","123456","ddd");
}
@Test
public void testDelete() throws SQLException {
//注意:这里也不需要关闭资源,因为底层已经关闭了
//删除id为5的用户
String sql = "delete from user where id=?";
queryRunner.update(sql,5);
}
@Test
public void testUpdate() throws SQLException {
String sql ="update user set nickname=? where id=?";
queryRunner.update(sql,"gai",4);
}
@Test
public void testBatchAdd() throws Exception {
//测试批量添加
//编写sql语句
String sql = "insert into user (username,password,nickname) values (?,?,?)";
//创建一个二维数组,用于存储批量参数,第一维表示批量操作多少条数据,第二维表示每条数据要设置多少个参数
Object[][] params = new Object[100][3];
//循环设置批量添加的数据
for(int i=0;i<100;i++){
params[i][0] = "aobama" + i;
params[i][1] = "123456";
params[i][2] = "qq" + i;
}
queryRunner.batch(sql,params);
}
@Test
public void testFindByID() throws SQLException {
//使用DBUtils执行查询一行数据存到DBUtils中
//查询到的这一行数据封装到User对象中
String sql = "select * from user where id =?" ;
//queryRunner执行查询的语句
//这里用的是反射技术,DBUtils在编写时并不知道要将结果集存到哪个对象中,传user.class通过反射拿到字节码对象,将数据存到user中
User user = queryRunner.query(sql, new BeanHandler<>(User.class), 7);
System.out.println(user);
}
@Test
public void testFindMore() throws SQLException {
//查询多条数据:
// 与查询一条数据的区别:使用的是List<User>集合,以及用的是BeanListHandler<>(User.class)
String sql = "select * from user where id<?";
//多条数据封装到List<User>中
List<User> users = queryRunner.query(sql, new BeanListHandler<>(User.class), 10);
System.out.println(users);
}
@Test
public void testFindCount() throws SQLException {
//目标:查询总用户数
String sql = "select count(*) from user ";
//ScalarHandler<>()是处理单个数据的结果集
Long query = queryRunner.query(sql, new ScalarHandler<>());
System.out.println(query);
}
}