最后一天jdbc的学习总结,学完咯,用了3天,还是长了一点,今天学了数据库连接池和dbutils的使用
数据库连接池是什么?
用户在申请数据库连接时,通常会获取一个Connection和一个preparedstatement,但是如果一次性的有太多的用户来申请了数据库的使用,这时候数据库可能就顶不住了,就像双十一的用户量,正常的数据库怎么会顶得住大量的访问呢,这时候就出现了数据库连接池,来规划用户的访问,它会设计最大的Connection的建立和最小的建立,同样他会对preparedstatement的数量进行一个限制。
但是数据库连接池有很多种,现在主流的是druid,我就直接学了这个,其他的就随便了解了一下,其实差不多,就是导入的包不太一样(嘿嘿嘿),在用法上没什么区别,但是底层的源码就不知道了。
代码如下:
public Connection druidcon() throws Exception {
//建立一个配置文件来存放配置信息
Properties pro = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
//获得druid的连接
Connection con = dataSource.getConnection();
System.out.println(con);
return con;
}
看着是挺简单的,但是还真是挺简单的
下面就是dbutils的使用了,别下错了,是有s,不是dbutil,我就下错了,包里没有QueryRunner,还找了半天。
代码如下:
/**
* 测试dbutils中的update
*/
@Test
public void testqueryupdate() {
int i = 0;
Connection con = null;
try {
con = druidcon();
//得到query工具类
QueryRunner queryRunner = new QueryRunner();
String sql = "insert into user(user,password) value(?,?)";
i = queryRunner.update(con, sql, "handidi", "987654");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
until.close(con,null);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("添加成功了"+i+"条记录");
}
/**
* 一条记录的查询
*/
@Test
public void testquery() {
Connection con = null;
QueryRunner runner = null;
try {
con = druidcon();
runner = new QueryRunner();
String sql = "select user,password from user where password = ?";
BeanHandler<user> handler = new BeanHandler<>(user.class);
user user = runner.query(con, sql, handler, "123456");
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
until.close(con,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 多条记录的查询
*/
@Test
public void testquerylist() {
Connection con = null;
QueryRunner runner = null;
try {
con = druidcon();
runner = new QueryRunner();
String sql = "select xh,name,broth from student where xh < ?";
BeanListHandler<student> handler = new BeanListHandler<>(student.class);
List<student> studeng = runner.query(con, sql, handler, 10);
studeng.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
until.close(con,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 特定值的查找
*/
@Test
public void testqueryvalue() {
Connection con = null;
QueryRunner runner = null;
try {
con = druidcon();
runner = new QueryRunner();
String sql = "select count(*) from user";
BeanHandler<user> handler = new BeanHandler<>(user.class);
ScalarHandler scalarHandler = new ScalarHandler();
Long count =(Long) runner.query(con, sql, scalarHandler);
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
until.close(con,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
涉及到了Handler类的接收,必须定义一个Handler类就接收查询语句的返回值,但是Handler有很多,我只使用了BeanHandler和ScalarHandler,
还有一个带list的