一 配置文件
1 常见的配置文件格式:
properties 里面内容的格式 key=value(并且不用写“”)
xml
若我们的配置文件为properties,并且放在src目录下.
我们可以通过 ResourceBundle类快速获取里面的配置信息
使用步骤:
1.获取ResourceBundle 对象:
static ResourceBundle getBundle("文件名称不带后缀名")
2.通过ResourceBundle 对象获取配置信息
String getString(String key) :通过执行key获取指定的value
Demo:
jdbc.properties(我们在src目录下创建此文件 内容如下)
# 配置文件 里面是key value的形式
# java 的使用 通过ResourceBoundle对象快速获得 骚的一批
driverclass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day07
user=root
password=123456
写个测试类读取信息:
package jdbc;
import java.util.ResourceBundle;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args){
ResourceBundle rb = ResourceBundle.getBundle("jdbc");
System.out.println(rb.getString("driverclass"));
System.out.println(rb.getString("url"));
System.out.println(rb.getString("user"));
System.out.println(rb.getString("password"));
}
}
输出:
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/day07
root
123456
Process finished with exit code 0
2 配置文件方式优点
操作方便,方便修改防止硬编码,(xml的方式就不再举例子了,后面会有)
二 常用的连接池(理解即可)
-
DBCP
-
C3P0
1 dbcp连接池:
所属:apache组织的
使用步骤:
- 导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
- 使用api
使用api分为硬编码方式和非硬编码方式
(硬编码方式就是通过类设置属性,非硬编码就是属性存配置文件,我们读取)
1.1举个栗子
硬编码方式:
package jdbc;
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args){
//创建连接池
BasicDataSource ds = new BasicDataSource();
//手动设置配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///day07");
ds.setUsername("root");
ds.setPassword("1234");
// 获得连接
try {
Connection connection = ds.getConnection();
// 执行 sql 获得结果等等。。。。。。
// 略
} catch (SQLException e) {
e.printStackTrace();
}
}
}
-----------------------------------------------------------------
非硬编码方式:
package jdbc;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args) throws Exception {
//存放配置文件
Properties prop = new Properties();
// 直接加载 就行
prop.load(new FileInputStream("src/dbcp.properties"));
// prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");// 也是硬编码方式 不使用
//创建连接池
DataSource ds = BasicDataSourceFactory.createDataSource(prop);
// 获得连接
ds.getConnection();
// 下面相同 略。。。。。
}
}
2 c3p0连接池
所属:c3p0 组织开发
使用:hibernate和spring使用
相对来说优点:有自动回收空闲连接的功能.(dbcp没有此功能)
使用步骤:
- 导入jar包(c3p0-0.9.1.2.jar)
- 使用api
举个栗子
配置文件 c3p0.properties(名字固定)
#固定的键一定不能错
#文件的命名也是固定的不能改变 (文件名)
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/day07
c3p0.user=root
c3p0.password=123456
package jdbc;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* Create by SunnyDay on 2018/11/12
*/
public class C3p0Demo {
public static void main(String[] args) throws Exception {
ComboPooledDataSource pool = new ComboPooledDataSource();
// 硬编码方式 不推荐使用 推荐使用 配置文件(配置好直接new 对象就能使用 底层帮我们做了设置功能)
// pool.setDriverClass("com.mysql.jdbc.Driver");
// pool.setJdbcUrl("jdbc:mysql://localhost:3306/day07");
// pool.setUser("root");
// pool.setPassword("123456");
Connection connection = pool.getConnection();
String sql = "SELECT * FROM CATEGORY";
PreparedStatement prst = connection.prepareStatement(sql);
ResultSet rs = prst.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("cid") + "::" + rs.getString("cname"));
}
// 调用工具类
JdbcUtil.releaseResource(connection, prst, rs);
}
}
附:c3p0-config.xml(使用xml方式的也行 如下 , 文件名不能错)
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/day07
root
123456
30000
30
10
30
100
10
200
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/xxxx
root
1234
5
20
10
40
20
5
三 dbutils
1 前文讲了获连接池的几种方式这里可以进行封装下方便使用
DataSourceUtils.java (连接池相关封装工具类)
package jdbc;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Create by SunnyDay on 2018/11/12
*
* usage: 使用本工具要求:
* 1首先导包(c3p0)
* 2其次写配置文件(写好就行 ,工具会自动检测)
* 3 写sql 获得结果
*/
public class DataSourceUtils {
private static ComboPooledDataSource pool = new ComboPooledDataSource();
/**
* 获取连接池
* @return 连接池(c3p0 的连接池 使用本工具类 要导包)
* */
public static DataSource getDataSource(){
return pool;
}
/**
* 获取连接
* @return 连接
* */
public static Connection getConnection() throws SQLException {
return pool.getConnection();
}
/**
*
* 释放资源
* @param conn 连接
* @param statement 预编译
* @param resultSet 结果集合
* */
public static void releaseResource(Connection conn, Statement statement, ResultSet resultSet) {
closeResultSet(resultSet);
closeStatement(statement);
closeConnnection(conn);
}
//关闭连接
private static void closeConnnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 关闭结果集合
private static void closeResultSet(ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 关闭预编译状态
private static void closeStatement(Statement statement) {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2 有了连接池工具类我们就可以结合dbutils快速实现curd了
dbutils简介:是apache组织的一个工具类,jdbc的框架,更方便我们使用
使用步骤:
2.1.导入jar包(commons-dbutils-1.4.jar)
2.2创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法:
new QueryRunner(Datasource ds);
2.3.编写sql
2.4.执行sql
query(..):执行r操作
update(...):执行cud操作
2.5简单的代码实现
package jdbc;
import org.apache.commons.dbutils.QueryRunner;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args) throws Exception {
// 获得对象 通过构造函数(参数DataSource接口子类)
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 写sql
String sql = "insert into category values(?,?)";
// 执行sql
qr.update(sql, "c201", "厨电");
}
}
查看数据库(插入成功):
看过我们的测试类感慨万千,以前读取数据库的数据,操作数据库时,写了七八步呢,这里三行代码就插入一条数据这就ojbk了快乐了。
(有了框架工具类就是快乐了 哈哈)
3 dbutils 的api
有了上面的例子我们就接下来详细的总结一下api的使用
核心类或者接口:
1 QueryRunner:类名
作用:操作sql语句
构造器:
new QueryRunner(Datasource ds);
注意:(使用这个构造时)
底层帮我们创建连接,创建语句执行者 ,释放资源.
常用方法:
query(..):
update(..):
2 DbUtils:释放资源,控制事务 类
closeQuietly(conn):内部处理了异常
commitAndClose(Connection conn):提交事务并释放连接
3 ResultSetHandler:封装结果集 接口
实现类:
(了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回。
(了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回。
★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回。
★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
(了解)ColumnListHandler, 将查询结果的指定一列放入list中返回 。
(了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回。
★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回。
★ScalarHandler,针对于聚合函数(一个返回值) 例如:count(*) 返回的是一个Long值。
1ResultSetHandler 实现类的简单栗子
(了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回。
package jdbc;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import java.util.Arrays;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args) throws Exception {
// 获得对象 通过构造函数(参数DataSource接口子类)
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 写sql
String sql = "select * from category";
// 执行sql
Object[] query = qr.query(sql, new ArrayHandler());
System.out.println(Arrays.toString(query));
}
}
输出:[c001, 电器] 查询记录中的第一条
(了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
package jdbc;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import java.util.Arrays;
import java.util.List;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args) throws Exception {
// 获得对象 通过构造函数(参数DataSource接口子类)
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 写sql
String sql = "select * from category";
// 执行sql
List
重要的栗子 ★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
首先搞个bean类如下(Category.java)
package domain;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Category {
private String cid;
private String cname;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Category{" +
"cid='" + cid + '\'' +
", cname='" + cname + '\'' +
'}';
}
}
测试类:
package jdbc;
import domain.Category;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.util.Arrays;
import java.util.List;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args) throws Exception {
// 获得对象 通过构造函数(参数DataSource接口子类)
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 写sql
String sql = "select * from category";
// 执行sql
Category category = qr.query(sql, new BeanHandler<>(Category.class));
System.out.println(category.toString());
}
}
结果:
Category{cid='c001', cname='电器'}
★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将 每一个bean对象
放入list中返回(不在举例子 )
★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值Demo
package jdbc;
import domain.Category;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.util.Arrays;
import java.util.List;
/**
* Create by SunnyDay on 2018/11/12
*/
public class Test0 {
public static void main(String[] args) throws Exception {
// 获得对象 通过构造函数(参数DataSource接口子类)
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
// 写sql
String sql = "select count(*) from category";
// 执行sql
Object obj = qr.query(sql, new ScalarHandler());
System.out.println(obj);
}
}
结果:
5
Process finished with exit code 0
四 完结!!!