commons-dbutils-1.6.jar
可以操作JDBC连接数据库并且执行sql语句,处理返回的结果集
三个核心类:
1.DbUtils 关闭资源方法(安静的关闭即不用异常处理)
2.QueryRunner 执行sql语句并且返回你想要的结果集
3.ResultSetHandler接口 参数(使用实现类 想要什么结果集 就传入什么该接口的实现类)
工具类
public class JDBCUtil {
private static String driverClass;
private static String url;
private static String user;
private static String password;
// 使用静态代码块加载驱动 读取配置文件
static {
// 使用系统类来读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
// 获取文件中的数据
driverClass = rb.getString("driverClass");
url = rb.getString("url");
user = rb.getString("user");
password = rb.getString("password");
// 让驱动类只加载一次
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接的方法
public static Connection getConnection(){
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("连接失败");
}
return connection;
}
// 关闭数据库的方法 如果没有结果集需要关闭 直接传null就行
public static void closeAll(ResultSet resultSet, Statement statement, Connection connection) {
// 关闭资源前进行非空判断防止空指针出现
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException("关闭失败");
}
// 加快系统回收的速度
resultSet = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException("关闭失败");
}
statement = null;
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException("关闭失败");
}
connection = null;
}
}
}
配置文件(dbinfo.properties)
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myjdbc
user=root
password=123456
插入
private static void insert() throws SQLException {
// 插入一条数据使用QueryRunner
QueryRunner qr = new QueryRunner();
// 获取连接
Connection conn = JDBCUtil.getConnection();
String sql = "insert into sort values(null,'显示器',5,'这是一台高级显示器')";
// 插入数据
int row = qr.update(conn, sql);
if (row > 0) {
System.out.println("插入成功");
}
// 安静的关闭资源
DbUtils.closeQuietly(conn);
}
更新
private static void update() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "update sort set sname=?,sprice=?,sdesc=? where sid=5";
// 多参数参数 传参方式1 利用数组传
// 方式2 直接传递参数 要和占位符问号的顺序对应
Object[] params = {"咖啡",1000,"java里的咖啡"};
int row = qr.update(connection, sql, params);
if (row > 0) {
System.out.println("修改成功");
}
DbUtils.closeQuietly(connection);
}
ArrayHandler
把查询出来的数据的第一行放进对象数组中并返回
@Test
public void select1() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
// 调用查询方法 传入什么容器 该类就把数据放到什么容器中给你返回
Object[] rel = qr.query(connection, sql, new ArrayHandler());
for (Object object : rel) {
System.out.println(object);
}
DbUtils.closeQuietly(connection);
}
ArrayListHandler
查询每一条记录放到list集合中(每一条记录是一个对象数组)
@Test
public void select2() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List
BeanHandler
把结果的第一行封装成一个JavaBean对象
JavaBean对象规则:
1.成员变量私有化
2.提供空参的构造方法
3.提供set/get方法
符合以上规则的实体类创建出来的对象就是JavaBean对象
@Test
public void select3() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
// 要把使用哪个JavaBean实体类传进去
// 类名.class
Sort sort = qr.query(connection, sql, new BeanHandler<>(Sort.class));
if (sort == null) {
System.out.println("没有该条数据");
}
System.out.println(sort);
DbUtils.closeQuietly(connection);
}
BeanListHandler
把结果集封装成一个JavaBean对象再放入list集合中返回
@Test
public void select4() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List list = qr.query(connection, sql, new BeanListHandler<>(Sort.class));
for (Sort sort : list) {
if (sort == null) {
System.out.println("没有该条数据");
}
System.out.println(sort);
}
DbUtils.closeQuietly(connection);
}
ColumnListHandler
返回指定列的数据放在list中返回
@Test
public void select5() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List
ScalarHandler
查询结果是一个的时候使用的
@Test
public void select6() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select avg(sprice) from sort";
Double long1 = qr.query(connection, sql, new ScalarHandler());
System.out.println(long1);
DbUtils.closeQuietly(connection);
}
MapHandler
将结果集存储在map中返回第一条记录
@Test
public void select7() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
Map<String, Object> map = qr.query(connection, sql, new MapHandler());
Set<String> set = map.keySet();
for (String string : set) {
Object object = map.get(string);
System.out.println(string + "" + object);
}
DbUtils.closeQuietly(connection);
}
MapListHandler
将结果集每一条记录都保存在map中再放入list中返回
@Test
public void select8() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List<Map<String, Object>> list = qr.query(connection, sql, new MapListHandler());
for (Map<String, Object> map : list) {
for (String key : map.keySet()) {
System.out.println(key + " " + map.get(key));
}
}
DbUtils.closeQuietly(connection);
}
java为了解决频繁创建数据库连接和释放数据库连接的问题
使用了数据库连接池来解决并且给出了一套规范 数据库连接池规范(一套接口)
javax.sql.DataSource java扩展包
由数据库厂商提供的
常用数据库连接池 DBCP C3P0
需要导入的jar包(docp中依赖了pool中的类)
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
BasicDataSource 是DataSource(规范类) 的实体类
基础设置(要使用数据库连接池 必须设置的内容)
DataSourceUtil工具类
public class DataSourceUtil {
private static BasicDataSource dataSource = new BasicDataSource();
static {
// 基础设置dataSource
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/myjdbc");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 扩展设置
// 初始化连接数
dataSource.setInitialSize(10);
// 最大活动数
dataSource.setMaxActive(8);
// 最大空闲连接数
dataSource.setMaxIdle(5);
// 最小空闲连接数
dataSource.setMinIdle(2);
}
// 获取数据库连接池
public static DataSource getDataSource() {
return dataSource;
}
}
测试DataSourceUtil类
public class Test {
public static void main(String[] args) throws SQLException {
// 数据库连接池和QueryRunner结合使用
QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSource());
// 插入一条数据
String sql = "insert into sort values(null,?,?,?)";
Object[] params = {"试卷",10,"一份万分试卷"};
int row = qr.update(sql, params);
if (row > 0) {
System.out.println("插入成功");
}
}
}