前提:创建数据库表
CREATE DATABASE test
USE `test`;
CREATE TABLE `user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` int(10) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`age`,`birthday`) values (1,'zfx',24,'1991-03-24'),(2,'zjy',23,'1992-06-28');
(1),dbcp连接池
1,commons-dbcp-1.4.jar dbcp的jar包,主要用来创建连接放到池中
commons-pool-1.5.6.jar dbcp依赖包
mysql-connector-java-5.1.5-bin.jar 连接mysql数据库的
2,dbcp连接池的连个核心类
BasicDataSource - 此实现了javax.sql.DataSource接口。
BasicDataSourceFactory– 工厂类,通过读取一个资源文件,创建一个dataSource。
3,将连接用的信息,放到dbcp.properties文件中去
driverClassName=com.mysql.jdbc.Driver
username=root
password=root
url=jdbc:mysql:///test?characterEncoding=UTF8
maxActive=2
4,创建一个工具类,用来维护唯一的连接池dataSource
/**
*
* @author zfx
* 静态工具类
*
*/
public class DbcpDataSourceUtils {
//创建一个静态的dataSource
private static DataSource dataSource ;
//在静态代码块中给dataSource设置值初始化
static{
Properties p = new Properties();
try {
p.load(DbcpDataSourceUtils.class.getClassLoader().getResourceAsStream("cn/zfx/demo6/DSpool/dbcp.properties"));
// 在dbcp中有一个工工厂类可以通读取一个资源文件创建一个dataSource,
//会自动读取properties中设置的值
dataSource = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取整个连接池的静态方法
public static DataSource getDs(){
return dataSource ;
}
//获取connection的静态方法
public static Connection getConn(){
Connection conn = null ;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn ;
}
5,测试dbcp连接池
/**
* 从dbcp连接池中获取连接并查询数据库
*/
@Test
public void testDbcp(){
//1:获取连接
Connection conn = DbcpDataSourceUtils.getConn();
try {
//2:获取数据操作对象
Statement statement = conn.createStatement();
//3:执行
ResultSet resultSet = statement.executeQuery("select * from user");
//4:遍历封装
while(resultSet.next()){
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
System.out.println(resultSet.getInt("age"));
System.out.println(resultSet.getDate("birthday"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
(2),c3p0连接池
1,c3p0-0.9.1.2.jar c3p0 的jar
2,数据库连接池的静态工具类
/**
* @author zfx
* 静态工具类
*/
public class C3p0DataSourceUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource() ;
static{
Properties p = new Properties();
try {
p.load(C3p0DataSourceUtils.class.getClassLoader().getResourceAsStream("cn/zfx/demo6/DSpool/dbcp.properties"));
dataSource.setDriverClass(p.getProperty("driverClassName"));
dataSource.setJdbcUrl(p.getProperty("url"));
dataSource.setUser(p.getProperty("username"));
dataSource.setPassword(p.getProperty("password"));
dataSource.setMaxPoolSize(Integer.parseInt(p.getProperty("maxActive")));
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接池方法
public static DataSource getDs(){
return dataSource;
}
///获取connection连接方法
public static Connection getconnnection(){
Connection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
3,测试工具类
@Test
public void testC3p0(){
Connection connection = null;
connection = C3p0DataSourceUtils.getconnnection();
try {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from user");
while(resultSet.next()){
System.out.println(resultSet.getInt("id"));
System.out.println(resultSet.getString("name"));
System.out.println(resultSet.getInt("age"));
System.out.println(resultSet.getDate("birthday"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
(3),Dbutils学习
1,commons-dbutils-1.4.jar
2,Dbutils核心
Dbutils有两个核心类: -
QueryRunner– 此类可以执行所有sql语句 。insert ,update,datete,select,create
实例方法为:
QueryRunner run = newQueryRunner(Datasource) ; 从dbcp中获取DataSource
Run.query() – 用于执行select语句。
Run.update() 用于执行所有有非selecet 方法.
ResultSetHandler– 执行结果的封装句柄。回调函数。
此句柄只用于run.query(sql,handler)方法中,用于封装查询的结果。且这种封装自动的。
3,测试方法
@Test
public void test(){
QueryRunner runner = new QueryRunner(C3p0DataSourceUtils.getDs());
String sql = "select * from user";
try {
/**
* BeanListHandler ,将查询的结果封装到指定的泛型bean中,然后再封装到list中
*/
List<User> userList = runner.query(sql, new BeanListHandler<>(User.class));
for(User user : userList){
System.out.println(user);
}
/**
* ArrayHandler , 将查询的结果封装成Object[] – 只返回第一行
*/
Object [] obj = runner.query(sql, new ArrayHandler());
for(int i=0; i< obj.length; i++){
System.out.println(obj[i]);
}
/**
* ArrayListHandler 查询多有行,将每一行封装成Object[]然后再放到list中去
*/
List<Object[]> objList = runner.query(sql, new ArrayListHandler());
for(Object [] o : objList){
for(int q=0;q<o.length; q++){
System.out.println(o[q]);
}
}
/**
* BeanHandler 只查询查询到的第一行,将结果封装成Bean
* 要求javaBeean的属性与列名相同
*/
User user = runner.query(sql, new BeanHandler<>(User.class));
/**
* BeanListHandler 将查询到的所有Bean放到List
*/
List<User> userLists = runner.query(sql,new BeanListHandler<User>(User.class));
/**
* ColumnListHandler 只查询某一个字段:将这个字段放到List<Object>
*/
List<Object> users = runner.query(sql, new ColumnListHandler(2));
for(Object ob :users){
System.out.println(ob);
}
/**
* KeyedHandler 以某外列,为key值,保存到Map,中Map<String,Object>
*/
Map<Object,Map<String,Object>> map = runner.query(sql,new KeyedHandler("id"));
/**
* MapHandler 将查询到的第一行,封装到一个map,与BeanHandler类似
*/
Map m = runner.query(sql, new MapHandler());
/**
* MapListHandler 所有结果封装成List<Map> BeanListHander类似
*/
List<Map<String,Object>> maps = runner.query(sql, new MapListHandler());
/**
* ScalarHandler 用于查询聚合函数时使用:用于count
*/
Object count = runner.query("select round(avg(age),2) from user",new ScalarHandler());
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}
}