dbcp找不到工厂类
c3p0工程类配置和set都可以
druid 配置set出错
JdbcTemplate
1 DBUtils工具类
1.1 如果我们使用jdbc进行开发,我们会发现代码重复度很高。
为了简化jdbc开发,所以apache commons 组件中给我们提供了一个成员DBUtils。
- DBUtils 就是简化jdbc开发的工具包。
使用的时候需要在项目中导入jar包。
commons-dbutils-版本.jar - DBUtils封装了对jdbc的操作,简化了jdbc操作。
1.2 DBUtils中有三个核心对象
-
QueryRunner:提供了对sql语句操作的API。
-
ResultSetHandler接口:定义了执行完select语句后,如何封装结果集。
-
DbUtils:工具类,定义了关闭资源和与事务相关的方法。
-
注意:DBUtils仅仅只是封装了jdbc的操作。不仅需要导入DBUtils的jar包,一定不能忘了要导入 jdbc的jar包。
1.3 QueryRunner 核心类
-
构造方法
QueryRunner()
QueryRunner(DataSource ds) -
成员方法
用于执行insert,update,delete语句
int update(Connection conn, String sql, Object… params)
int update(String sql, Object… params)
用于执行select语句
T query(Connection conn, String sql, ResultSetHandler rsh, Object… params)
T query(String sql, ResultSetHandler rsh, Object… params) -
练习:使用QueryRunner完成增删改操作
package com.mysql.dbUtils.demo;
/*
* 使用DBUtils工具类完成增删改操作
* int update(Connection conn, String sql, Object... params)
* */
import com.mysql.dbUtils.jdbcutils.JdbcUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import java.sql.SQLException;
public class Demo1 {
@Test
public void insert() throws SQLException {
QueryRunner qr = new QueryRunner();
Object[] params = {
50,"帅哥部","邮电大学"};
int i = qr.update(JdbcUtil.getConnection(), "insert into dept values (?,?,?)", params);
System.out.println(i);
}
@Test
public void update() throws SQLException {
QueryRunner qr = new QueryRunner();
Object[] params = {
"运营部","邮电",50};
int i = qr.update(JdbcUtil.getConnection(), "update dept set dname=?,address=? where deptid=?", params);
System.out.println(i);
}
@Test
public void delete() throws SQLException {
QueryRunner qr = new QueryRunner();
int i = qr.update(JdbcUtil.getConnection(), "delete from dept where deptid=?", 50);
System.out.println(i);
}
}
package com.mysql.dbUtils.jdbcutils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtil {
private JdbcUtil(){
}
private static Properties info = new Properties();
private static Connection conn;
static{
InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
try {
info.load(is);
} catch (IOException e) {
e.printStackTrace();
}
}
static{
try {
Class.forName(info.getProperty("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
conn = DriverManager.getConnection(info.getProperty("url"),info.getProperty("user"),info.getProperty("password"));
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
- 配置信息内容
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false
user=root
password=123456
1.4 QueryRunner实现查询
-
T query(Connection conn, String sql, ResultSetHandler rsh, Object… params)
-
ResultSetHandler接口:结果集的处理类
实现类:
ArrayHandler:把结果集中第一条数据封装到一个Object数组中。
数组中的每一个元素就是这条记录中的每一个字段值。
ArrayListHandler:把结果集中每一条记录封装到一个Object数组中,
把数组在封装到List集合中。
BeanHandler:把结果集中的第一个数据封装到一个指定的javaBean中。
BeanListHandler:把结果集中的每一条数据封装到一个指定的javaBean中。
把每一个javaBean封装到集合中。
ColumnListHandler:把结果集中指定列的字段值封装到List集合中。
MapHandler:把结果集中的第一条数据封装到map集合中,key是列名,value是数据
MapListHandler:把结果集中的每一行封装到一个map集合中。
把map集合存储到List中。
ScalarHandler:用来获取单个数据。比如select count(*) from dept; -
javaBean:就是一个java类,在开发中用于封装数据。
实现Serializable接口,这个可以省略,不影响代码
私有字段
无参构造
get和set方法
package com.mysql.dbUtils.demo;
import com.mysql.dbUtils.domain.Dept;
import com.mysql.dbUtils.jdbcutils.JdbcUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
/*
* 使用DBUtils工具类完成查询操作
* */
public class Demo2 {
@Test
//ArrayHandler
public void test1() throws SQLException {
QueryRunner qr = new QueryRunner();
Object[] obj = qr.query(JdbcUtil.getConnection()