JAVA中DBUtils的QueryRunner类实现增删改查详解

JAVA中DBUtils的QueryRunner类实现增删改查详解JAVA中DBUtils的QueryRunner类实现增删改查详解

大家好,又见面了,我是你们的朋友全栈君。

一.QueryRunner类实现增删改

连接池代码:JdbcUtil.java

package com.wb.util;
/** * c3p0,dbcp,druid */
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/** * 绝对不能使用单例 * * @author Administrator 硬编码 */
public class JdbcUtil { 

private static Connection con = null;
private static DataSource ds = null;
private static Properties pt = null;
static { 

// 1.获得当前类的加载器
ClassLoader cl = JdbcUtil.class.getClassLoader();
// 通过该加载器得到一个输入流
InputStream in = cl.getResourceAsStream("jdbc.properties");
// 通过输入创一个properties对象
pt = new Properties();
try { 

pt.load(in);
} catch (IOException e) { 

// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getCon() { 

if (ds == null) { 

try { 

ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pt);
} catch (Exception e) { 

// TODO Auto-generated catch block
e.printStackTrace();
}
}
try { 

return ds.getConnection();
} catch (SQLException e) { 

// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void closeCon(Connection con) { 

try { 

con.close();
} catch (SQLException e) { 

// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

具体使用模板:

   publicstaticvoidmain(String[] args)throws Exception{ 
//使用自己的工具类,获取数据库的连接对象
Connection conn = MyJDBCUtils.getConnection();//创建QueryRunner类对象
QueryRunner qr =newQueryRunner(); 
String sql ="UPDATE gjp_ledger set money=? , ldesc=? where lid=?"; 
Object[] params ={ 
998,"买钻石",3};int result = qr.update(conn, sql, params); 
System.out.println(result); 
DbUtils.close(conn);}

二.QueryRunner类获取查询结果集ResultSetHandler

1.常用Handler

  • ArrayHandler 将结果集第一行转成对象数组
  publicstaticvoidmain(String[] args)throws Exception{ 
 
  Connection conn = MyJDBCUtils.getConnection(); 
  String sql ="SELECT * FROM gjp_ledger where lid=?"; 
  //结果集处理方式,ArrayHandler 第一行转成对象数组
  QueryRunner qr =newQueryRunner(); 
  Object[] objects = qr.query(conn, sql,newArrayHandler(),3);
  for(Object obj : objects){ 
 
  System.out.println(obj); 
  } 
  }
  • ArrayListHandler 将结果集中的每一行数据都转成一个对象数组,再将转成的多个对象数组存放到List
  publicstaticvoidmain(String[] args)throws Exception{ 
 
  Connection conn = MyJDBCUtils.getConnection(); 
String sql ="SELECT * FROM gjp_ledger"; 
QueryRunner qr =newQueryRunner();//执行query方法,传递连接对象,SQL语句,结果集处理方式
ArrayListHandler 
List<Object[]> list = qr.query(conn, sql,newArrayListHandler());for(Object[] objects : list){ 
for(Object obj : objects){ 
 
System.out.print(obj+" ");} 
System.out.println();}}
  • BeanHandler 将结果集第一行数据封装到一个对应的业务类实例中
    (1): 定义业务数据类Ledger(实体类,javaBean)
publicclassLedger{ 
//要生成空参、有参构造、set和get方法、toString方法
privateint lid;private String parent;privatedouble money;privateint sid;private String account;private String createtime;private String ldesc;}

(2)测试案例代码

publicstaticvoidmain(String[] args)throws Exception{ 
 
Connection conn = MyJDBCUtils.getConnection(); 
String sql ="SELECT * FROM gjp_ledger"; 
QueryRunner qr =newQueryRunner();//BeanHandler泛型,构造方法(和反射有关系的对象) 
Ledger legder = qr.query(conn, sql,newBeanHandler<Ledger>(Ledger.class)); 
System.out.println(legder);}
  • BeanListHandler 将结果集中的每一行数据都封装到一个对应的业务类实例中,再将多个业务类实例对象存放到List里。
publicstaticvoidmain(String[] args)throws Exception { 
 
Connection conn = MyJDBCUtils.getConnection(); 
String sql ="SELECT * FROM gjp_ledger";//结果集处理方式,BeanListHandler 每一行数据封装到业务数据类中
QueryRunner qr =newQueryRunner(); 
List list = qr.query(conn, sql,newBeanListHandler(Ledger.class));for(Ledger ledger : list){ 
 
System.out.println(ledger);}}
  • MapHandler 将结果集中的第一行数据封装到一个Map中,key是列名,value是对应的值。
  publicstaticvoidmain(String[] args)throws Exception { 
 
Connection conn = MyJDBCUtils.getConnection(); 
String sql ="SELECT * FROM gjp_ledger";//结果集处理方式,MapHandler 封装到一个Map集合中,存储键值对集合
QueryRunner qr =newQueryRunner(); 
Map<String,Object> map = qr.query(conn, sql,newMapHandler());for(String key : map.keySet()){ 
 
System.out.println(key+" "+map.get(key));}}
  • MapListHandler 将结果集中的每一行数据都封装到一个Map里,然后再将多个Map存放到List
   publicstaticvoidmain(String[] args)throws Exception{ 
 
Connection conn = MyJDBCUtils.getConnection(); 
String sql ="SELECT * FROM gjp_ledger";//结果集处理方式,MapListHandler 数据中的每一行封装成Map集合,多个Map集合存储到List集合
QueryRunner qr =newQueryRunner(); 
List<Map<String,Object>> list = qr.query(conn, sql,newMapListHandler());for(Map<String,Object> map : list){ 
for(String key : map.keySet()){ 
 
System.out.print(key+" "+map.get(key));} 
System.out.println();

多表联合查询

 QueryRunner qr = new QueryRunner();
@Override
public List<Emp> getEmpList(Integer pageSize, Integer pageIndex, String empName) { 

List<Emp> empList = new ArrayList<Emp>();
/* //使用new BeanListHandler<>(Emp.class);会导致集合里面字段为空 Connection con = JdbcUtil.getCon(); String sql = "select emp_id empId,emp_name empName,emp_phone empPhone,emp_age empAge,emp_sex empSex,e.depa_id depaId, d.depa_name depaName FROM emp e INNER JOIN depa d ON e.depa_id=d.depa_id WHERE e.emp_name like ? limit ?,?"; try { empList = qr.query(con, sql, new BeanListHandler<>(Emp.class), empName == null || "".equals(empName) ? "%%" : "%" + empName + "%", (pageIndex - 1) * pageSize, pageSize); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.closeCon(con); } for (int i = 0; i < empList.size(); i++) { System.out.println(empList.get(i)); }*/
//使用 new MapListHandler() 需要手动遍历
Connection con = JdbcUtil.getCon();
String sql = "select emp_id,emp_name,emp_phone,emp_age,emp_sex,e.depa_id, depa_name FROM emp e INNER JOIN depa d ON e.depa_id=d.depa_id WHERE e.emp_name like ? limit ?,?";
try { 

List<Map<String,Object>> list = qr.query(con, sql, new MapListHandler(),
empName == null || "".equals(empName) ? "%%" : "%" + empName + "%",
(pageIndex - 1) * pageSize, pageSize);
for(Map<String,Object> map:list){ 

Emp emp = new Emp();
for(String key: map.keySet()){ 

switch (key) { 

case "emp_id":
emp.setEmpId((Integer) map.get(key));
break;
case "emp_sex":
emp.setEmpSex((String) map.get(key));
break;
case "emp_age":
emp.setEmpAge((Integer) map.get(key));
break;
case "emp_phone":
emp.setEmpPhone((String) map.get(key));
break;
case "emp_name":
emp.setEmpName((String) map.get(key));
break;
case "depa_id":
emp.setDepaId((Integer) map.get(key));
break;
case "depa_name":
emp.setDepaName((String) map.get(key));
break;
default:
System.out.println("发生异常");
break;
}
//System.out.println(key+"---"+map.get(key));
}
empList.add(emp);
}
} catch (SQLException e) { 

e.printStackTrace();
} finally { 

JdbcUtil.closeCon(con);
}
for (int i = 0; i < empList.size(); i++) { 

System.out.println(empList.get(i));
}
return empList;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106654.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • flowable实战(八)flowable核心数据库表详细表字段说明

    flowable实战(八)flowable核心数据库表详细表字段说明数据模型设计清单 数据表分类 描述 ACT_GE_* 通用数据表 ACT_RE_* 流程定义存储表 ACT_ID_* 身份信息表 ACT_RU_* 运行时数据库表 ACT_HI_…

  • redis 缓存技术与memcache的最大差别

    redis 缓存技术与memcache的最大差别

  • Ubuntu18.04安装gcc——史上最全安装教程

    Ubuntu18.04安装gcc——史上最全安装教程心路历程:花了整个周末的时间,最终没有安装好gcc,使用的Linux版本是Ubuntu18.04。但是,历尽千辛万苦,第二天晚上终于搞好!!第一步首先在命令行里面输入pingwww.baidu.com。这一步测试Ubuntu是否有网络,若出现如图2所示的信息,可以跳过第二步进行第三步。第二步设置网络,首先在虚拟器-设置-网络适配器里面选择NAT模式。然后再进行第一步操作,有些同学还是没有网络,先别急,还需继续设置,Win+R输入services.msc调出服务,分别右键VMwareDHCP

  • mysql一键部署脚本

    mysql一键部署脚本

  • 软件测试之因果图[通俗易懂]

    软件测试之因果图[通俗易懂]1.某软件规格说明书包含这样的要求:第一列字符必须是A或B,第二列字符必须是一个数字,在此情况下进行文件的修改,但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。

  • 关于maven打包时, 资源文件没有被打包进来的问题

    关于maven打包时, 资源文件没有被打包进来的问题在之前的一篇文章mybatis看这一篇就够了当中,提到过,在使用mybatis时,有时候需要把编写了SQL语句的XML文件,和Java类文件放在一起,如如果不加配置,用maven进行打包时,默认不会将src/main/java目录下的XML文件打包进去。因为src/main/java被设定为了源码目录,默认只会将其中的Java文件进行编译打包。即,默认打包得到的结果如下可以看到com.example.mp.mappers包下没有XML文件我们可以配置pom.xml中的resources标签,指定

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号