共计 13334 个字符,预计需要花费 34 分钟才能阅读完成。
C3P0 连接池
创建 C3P0 连接池的工具类
* 连接的规范接口:
* javax.sql.DataSource 接口
* 接口的实现类对象
* ComboPooledDataSource
* 成员位置创建 ComboPooledDataSource 对象
* 使用静态代码块给 ComboPooledDataSource 设置 4 大数据量连接信息
* 创建一个静态方法返回 Connection 对象
* 创建一个静态方法释放资源
public class C3P0Utils {
// 成员位置创建 ComboPooledDataSource 对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 使用静态代码块给 ComboPooledDataSource 设置 4 大数据量连接信息
static{
try {
dataSource.setDriverClass(“com.mysql.jdbc.Driver”);
dataSource.setJdbcUrl(“jdbc:mysql://localhost:3306/mybase4”);
dataSource.setUser(“root”);
dataSource.setPassword(“root”);
} catch (Exception e) {
throw new RuntimeException(“ 设置连接信息失败!”);
}
}
// 创建一个静态方法返回 Connection 对象
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(“ 获取数据库连接信息失败!”);
}
}
// 定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
创建读取 XML 配置文件的 C3P0 工具类
public class C3P0UtilsReadXML {
// 成员位置创建 ComboPooledDataSource 对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 使用静态代码块给 ComboPooledDataSource 设置 4 大数据量连接信息
/*static{
try {
dataSource.setDriverClass(“com.mysql.jdbc.Driver”);
dataSource.setJdbcUrl(“jdbc:mysql://localhost:3306/mybase4”);
dataSource.setUser(“root”);
dataSource.setPassword(“root”);
} catch (Exception e) {
throw new RuntimeException(“ 设置连接信息失败!”);
}
}*/
// 创建一个返回 ComboPooledDataSource 的方法
public static DataSource getDataSource(){
return dataSource;
}
// 创建一个静态方法返回 Connection 对象
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(“ 获取数据库连接信息失败!”);
}
}
// 定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DBCP 连接池
创建 DBCP 连接池的工具类
* 连接的规范接口:
* javax.sql.DataSource 接口
* 接口的实现类对象
* BasicDataSource
* 重写 getConnection 方法
public class DBCPUtils {
// 创建连接池的实现类对象
private static BasicDataSource dataSource = new BasicDataSource();
// 设置连接数据库的 4 大变量, 使用 BasicDataSource 中的 set 方法设置
static{
// 设置注册的驱动信息
dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
// 设置 Url
dataSource.setUrl(“jdbc:mysql://localhost:3306/mybase4”);
// 设置用户名
dataSource.setUsername(“root”);
// 设置密码
dataSource.setPassword(“root”);
// 可选信息
//dataSource.setInitialSize(100);
//dataSource.setMaxActive(1000);
}
// 创建获取数据库连接对象的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(“ 获取数据库连接对象失败 ”);
}
}
// 定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
读取配置文件的方式
/*
* 创建 DBCP 连接池工具类
* 使用读取配置文件的方式
* DBCP 中有一个工厂类 BasicDataSourceFactory
* 工厂类中有一个静态方法
* static DataSource createDataSource(Properties prop)
* 此方法返回的就是 DataSource 接口的实现类对象 BasicDataSource
*
* 创建 Propertis 集合 +IO 技术读取配置文件
* 把配置文件传入 BasicDataSourceFactory 静态方法 createDataSource 中
*/
public class DBCPUtilsReadConfig {
// 创建 DataSource 变量
private static DataSource dataSource;
static{
try {
// 创建 Propertis 集合 +IO 技术读取配置文件
// 使用类加载器, 扫描包下的文件
InputStream is = DBCPUtilsReadConfig.class.getClassLoader()
.getResourceAsStream(“dbcpconfig.properties”);
// 创建 Propertis 集合
Properties prop = new Properties();
prop.load(is);
// 把配置文件传入 BasicDataSourceFactory 静态方法 createDataSource 中
dataSource = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
throw new RuntimeException(“ 读取配置文件失败 ”);
}
}
// 创建获取数据库连接对象的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(“ 获取数据库连接对象失败 ”);
}
}
// 定义一个释放资源的方法
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat !=null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
* 使用 DBUtils 工具类对数据库表进行增删改查
* DBUtils 工具类作用: 简化 JDBC 的开发(6 步)
*
* DBUtils 有 3 个核心类
* 1.QueryRunner: 使用 QueryRunner 中的方法对数据库进行增删改查
* 2.DbUtils: 提供了大量的释放资源的方法
* 3.ResultSetHandler 接口: 提供了处理查询结果集的方法
*
* QueryRunner 类
* 构造方法:
* QueryRunner() 空参数构造方法
* 调用更新和查询方法的时候, 需要传入 Connection 对象
* QueryRunner(DataSource ds) 带 DataSource 数据库连接池的构造方法
* 调用更新和查询方法的时候 QueryRunner 会自动从 DataSource 实现类对象中获取数据库连接对象, 使用完毕会自动归还
* 成员方法:
* 执行执行增删改的成员方法
* int update(Connection conn, String sql, Object… params) 用来执行增删改的 SQL
* int update(String sql, Object… params) 用来执行增删改的 SQL
* 参数:
* Connection conn: 数据库连接对象
* String sql: 拼接的 sql 语句, 可以使用? 占位符
* Object… params:? 占位符的实际参数, 可以使用 Object[]
* 返回值:
* int: 执行的有效行数
* 执行执行查询的成员方法
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object… params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object… params)
* 参数:
* Connection conn: 数据库连接对象
* String sql: 拼接的 sql 语句, 可以使用? 占位符
* Object… params:? 占位符的实际参数, 可以使用 Object[]
* ResultSetHandler<T> rsh: 用来存储查询之后的结果集, 可以传入 ResultSetHandler9 种实现类对象
* 返回值:
* <T> T: 传入的 ResultSetHandler 实现类不同, 返回的结果集也不同, 使用泛型, 传入什么结果集, 就返回对应的类型
public class Demo01DBUtils {
// 创建 QueryRunner 对象, 构造方法中传入连接池的实现类对象
QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
/*
* 使用 QueryRunner, 对数据库表进行删除数据
*/
@Test
public void delete(){
try {
// 拼接增加的 sql 语句
String sql = “DELETE FROM category WHERE cid=?”;
// 调用 QueryRunner 中 update 方法执行 sql 语句
// 创建对象数据, 储存? 占位符的实际参数
//Object[] parmars = {“ 洗 ”,10};
int row = qr.update(sql, 7);
System.out.println(row);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 使用 QueryRunner, 对数据库表进行修改数据
*/
@Test
public void update(){
try {
// 拼接增加的 sql 语句
String sql = “UPDATE category SET cname=? WHERE cid=?”;
// 调用 QueryRunner 中 update 方法执行 sql 语句
// 创建对象数据, 储存? 占位符的实际参数
Object[] parmars = {“ 洗 ”,10};
int row = qr.update(sql, parmars);
System.out.println(row);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 使用 QueryRunner, 对数据库表进行增加(插入) 数据
*/
@Test
public void insert(){
try {
// 拼接增加的 sql 语句
String sql = “INSERT INTO category(cname) VALUES(?)”;
// 调用 QueryRunner 中 update 方法执行 sql 语句
int row = qr.update(sql, “ 玩具 ”);
System.out.println(row);
} catch (Exception e) {
System.out.println(e);
}
}
}
使用 QueryRunner 对数据库表进行查询的九种查询方式
/*
* 使用 QueryRunner 对数据库表进行查询
* <T> T query(String sql, ResultSetHandler<T> rsh, Object… params)
*/
public class Demo02DBUtils {
// 创建 QueryRunner 对象, 构造方法中传入数据库连接池的实现类
QueryRunner qr = new QueryRunner(C3P0UtilsReadXML.getDataSource());
/*
* 第九种查询方式: 使用 KeyedHandler(Map 嵌套 Map)
* KeyedHandler 会把结果集的每一行数据封装到 Map 集合中
* key: 字符串类型列名
* value: 列名对应的值(不同的列, 数据类型不同,value 使用 Object 类型)
* 多个 Map 集合存储到另外一个 Map 集合中
* key: 指定的字符串列名, 不指定则默认使用第一列
* value: 传入存储每行数据的 Map 集合
*
* 构造方法:
* KeyedHandler() 不指定列名
* KeyedHandler(int columnIndex) 指定列号 1,2,3,4
* KeyedHandler(String columnName) 指定字符串格式列名
*/
@Test
public void keyedHandler(){
try {
// 拼接 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法, 结果集使用 KeyedHandler
//Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler(“cid”));
Map<Object,Map<String,Object>> mapmap = qr.query(sql, new KeyedHandler(“cname”));
// 遍历 Map 集合取出存储每一行数据的 Map 集合
for (Object obj: mapmap.keySet()) {
// 根据 key 取出值存储每一行数据的 Map 集合
Map<String,Object> map = mapmap.get(obj);
// 遍历 Map 集合
for(String key : map.keySet()){
System.out.print(obj+”:”+key+”…”+map.get(key)+”\t”);
}
// 打印完每一行数据之后换行
System.out.println();
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第八种查询方式: 使用 ScalarHandler(重点)
* ScalarHandler 用于执行返回单个数据的 sql 语句
* 使用聚合函数查询的结果都是单个数据
* 或者查询某一行的某一个字段
*/
@Test
public void scalarHandler(){
try {
// 拼接 sql 语句
String sql = “SELECT SUM(cid) FROM category”;
sql = “SELECT cname FROM category WHERE cid=?”;
// 调用 QueryRunner 中的 query 方法, 结果集使用 ScalarHander
// 返回的值的数据类型不确定, 使用 Object 类型
Object obj = qr.query(sql, new ScalarHandler(),2);
System.out.println(obj);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第七种查询方式: 使用 MapListHandler
* 1.MapListHandler 会把多条数据, 存储到多个 Map 集合中
* key: 字符串类型列名
* value: 列名对应的值(不同的列, 数据类型不同,value 使用 Object 类型)
* 2. 会把多个 Map 集合存储 List 集合中
*/
@Test
public void mapListHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 MapListHandler
List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
// 遍历 List 集合, 取出 Map 集合
for (Map<String, Object> map : list) {
// 遍历 Map 集合
for(String key: map.keySet()){
System.out.print(key+”…”+map.get(key)+”\t”);
}
System.out.println();// 打印完每行数据之后换行
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第六种查询方式: 使用 MapHandler
* MapHandler 把结果集的第一行数据存储 Map 集合中
* key: 字符串类型列名
* value: 列名对应的值(不同的列, 数据类型不同,value 使用 Object 类型)
*/
@Test
public void mapHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 MapHandler
Map<String,Object> map = qr.query(sql, new MapHandler());
// 使用 keySet 遍历 Map 集合
Set<String> set = map.keySet();
for (String key : set) {
// 通过 key 使用 get 方法获取 value
Object value = map.get(key);
System.out.print(key+”…”+value+” “);
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第五种查询方式: 使用 ColumnListHandler
* ColumnListHandler 会把结果集中指定列的数据封装到一个 List 集合中
* 如果不指定列, 则默认使用第一列数据存储到 List 集合中
* ColumnListHandler()
* ColumnListHandler(int columnIndex) 列号 1,2,3,4
* ColumnListHandler(String columnName) 列名
*/
@Test
public void columnListHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 ColumnListHandler
// 返回一个 List 集合, 因为列的数据类型不同, 所有元素使用 Object 类型
List<Object> list = qr.query(sql, new ColumnListHandler(“cname”));
for (Object object : list) {
System.out.println(object);
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第四种查询方式: 使用 BeanListHandler(重点)
* BeanListHandler 会把多个条数据封装到多个 JavaBean 对象中
* 多个 JavaBean 对象存储到 List 集合中
*
* 注意:
* JavaBean 中必须有空参数构造方法
*/
@Test
public void beanListHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 BeanListHandler
List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));
// 遍历存储 Category 的 list 集合
for (Category category : list) {
System.out.println(category);
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第三种查询方式: 使用 BeanHandler(重点)
* BeanHandler 会把结果集的第一条数据, 封装到指定的 JavaBean 对象中
* 构造方法:
* BeanHandler(Class<T> type) 传递 JavaBean 对象的 class 文件对象
* BeanHandler 内部会根据传递的 class 文件对象使用反射技术创建 JavaBean 对象, 把查询的结果集中第一行数据存储到 JavaBean 中
* 相当于
* Category c = new Category();
* c.setXXX(xxx);
* c.setXXX(xxx);
* c.setXXX(xxx);
* 注意:
* JavaBean 中必须有空参数构造方法
*/
@Test
public void beanHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 结果集传入 BeanHandler
Category cate = qr.query(sql, new BeanHandler<>(Category.class));
System.out.println(cate);
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第二种查询方式: 使用 ArrayListHandler
* ArrayListHandler 中会把多条结果封装到多个对象数组中
* 一个对象数组封装一行数据
* 多个对象数组需要存储到 list 集合中
*/
@Test
public void arrrayListHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category where cid = ?”;
sql = “SELECT * FROM category where cid in(?,?)”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 传入 ArrayListHandler 结果集
List<Object[]> list = qr.query(sql, new ArrayListHandler(), 1,3);
// 遍历集合
for (Object[] objects : list) {
// 遍历对象数组
for (Object obj : objects) {
System.out.print(obj+” “);
}
System.out.println();// 换行
}
} catch (Exception e) {
System.out.println(e);
}
}
/*
* 第一种查询方式: 使用 ArrayHandler
* ArrayHandler 会把结果集第一条数据封装到一个对象(Object) 数组中
* 数组中的每一个元素, 就是第一条数据数据的每一列的值
*/
@Test
public void arrayHandler(){
try {
// 拼接查询 sql 语句
String sql = “SELECT * FROM category”;
// 调用 QueryRunner 中的 query 方法执行查询 sql 语句, 传入 ArrayHandler 结果集
Object[] objs = qr.query(sql, new ArrayHandler());
// 遍历数组
for (Object obj : objs) {
System.out.print(obj+” “);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145514.htm