一、需要的jar包:
itcast-tools-1.4.jar http://pan.baidu.com/s/1Dbo2i
commons-beanutils-1.8.3.jar http://pan.baidu.com/s/1Dbo2i
commons-logging-1.1.1.jar http://pan.baidu.com/s/1c0yefK0
mysql-connector-java-5.1.28-bin.jar http://pan.baidu.com/s/1eQjgUqA
c3p0-0.9.2-pre1.jar http://pan.baidu.com/s/1mg1lBa4
commons-dbutils-1.4.jar http://pan.baidu.com/s/1o6OOdcu
mchange-commons-0.2.jar http://pan.baidu.com/s/1hqEkZvm
c3p0-config.xml http://pan.baidu.com/s/1ntzhCZR 注:连数据库的配置文件,初次使用要修改密码、用户名
二、结果集封装用到的方法
TxQueryRunner类是common-dbutils下QueryRunner类的子类,用来简化JDBC操作。TxQueryRunner类内部使用了JdbcUtils.getConnection()类来获取连接对象,以及使用 JdbcUtils.releaseConnection()关闭连接。
● int[] batch(String sql, Object[][] params):执行批处理,参数sql是SQL语句模板,params为参数;
● T query(String sql, ResultSetHandler<T> rh):执行查询,执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果;
● T query(String sql, ResultSetHandler<T> rh, Object… params):执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果,params是sql语句的参数;
● int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;
● int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);
● int update(String sql, Object… params):执行增、删、改语句,参数sql是要执行的SQL语句,参数params是参数(多个参数);
三、单表结果集封装
QueryRunner的三个方法:
*update() --> insert/update/delete(能实现事务处理)
*query() --> select
*batch() --> 批处理
1、测试查询
JDBC查询后的结果是ResultSet
而QueryRunner查询后的结果是通过ResultSet映射后的数据。
1.QueryRunner第一步执行select,得到ResultSet
2.把ResultSet转换成其他类型!
通过转换结果:
1.JavaBean:把结果集封装到JavaBean中(最常见)
query的第二个参数类型为ResultSetHandler,它是个接口,表示映射的结果类型。
1).使用BeanHandler把单行结果集映射到Bean中
a).BeanHandler --> 它是ResultSetHandler的实现类,它的作用是把结果集封装到Person对象中
b).结果集的列名与Person的属性名必须相同
String sql = "select * from t_person where pid = ?";
QueryRunner qr = new TxQueryRunner();
Person p = qr.query(sql,new BeanHandler<Person>(Person.class,"1"));
2).使用BeanListHandler把多行结果集映射到List<Bean>,即多个JavaBean对象。
a).一行结果集记录对应一个JavaBean对象,多行就对应List<Bean>
String sql = "select * from t_person";
QueryRunner qr = new TxQueryRunner();
List<Person> listP = qr.query(sql,new BeanListHandler<Person>(Person.class));
2.Map:把结果集封装到Map中
1).使用MapHandler把结果集的列名做为key、列值作为key值(重名的结果集的列名会覆盖)
String sql = "select * from t_person where pid = ?";
QueryRunner qr = new TxQueryRunner();
Map<String,Object> map = qr.query(sql,new MapHandler,"1");
2).使用MapListHandler把结果集的列名做为key、列值作为key值;一行对应一个Map多个对应List<Map>
String sql = "select * from t_person";
QueryRunner qr = new TxQueryRunner();
List<Map<String,Object>> map = qr.query(sql,new MapListHandler);
3.Object:把结果集封装到Object中(结果集是单行单列的)
String sql = "select count(*) from t_person";
QueryRunner qr = new TxQueryRunner();
Object obj = qr.query(sql,new ScalarHandler());
Number number = (Number)obj;
long cnt = number.longValue();//任意选int cnt = number.intValue();
注:select count(1),结果一定是整数!
>Integer
>long
>bigInteger
不同的驱动,结果不同!无论是那种类型,它就是Number类型!强转成Number一定不会错
四、多表结果集的映射
select * from t_person p,t_address a where p.aid=a.aid and p.pid='aaa';
结果集包含两个对象!
使用MapHandler来处理:
1).把结果集封装到map中
2).使用map生成Person对象
3).使用map生成address对象
4).把两个实体对象建立起关系
String sql = "select * from t_person p,t_address a where p.aid=a.aid and p.pid='aaa'";
QueryRunner qr = new TxQueryRunner();
Map map = qr.query(sql,new MapHandler(),"aaa");//1).把结果集封装到map中
Person p = CommonUtils.toBean(map,Person.class);//2).使用map生成Person对象
Address addr = CommonUtils.toBean(map,Address.calss);//3).使用map生成address对象
p.setAddress(addr);//4).把两个实体对象建立起关系
注:以上需要用到t_person(pid,pname,age,sex,aid)和t_address(aid,province,city,district,street)表aid和pid分别是主键。