JDBC 使用common-dbutiles
一:第三方jar mysql-connector-java-5.1.45-bin.jar,需要关注的核心类:
1、DbUtils----操作数据库的连接注册和释放。
2:、QueryRunner---对数据库进行操作的类,比如增删改查等。
3、ResultSetHandler--- 对查询结果集的处理的核心类。
代码:
package mysql_comm_demo; import Jdbc_Test.jdbcutils;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner; import java.sql.Connection;
import java.sql.SQLException; public class comm_test { public static void main(String ...args)throws SQLException{
db_Test.con_mysql();
}
}
class db_Test{
private static final Connection con= jdbcutils.getCon();
static void con_mysql() throws SQLException{
/*
用QueryRunner来进行操作数据库。sql用字符串占位符,在使用调用queryrunner的update(Connection con,String sql,Object ...para)
根据动态传入的para 替换sql中占位符,其中para可以是数组进行操作。
*/
QueryRunner op_my=new QueryRunner();
String sql="insert into system_user (nid,username,password) values(?,?,?)";
Object[] info={,"oop",""};
int row=op_my.update(con,sql,info);
DbUtils.closeQuietly(con);
/*
通过判断row的大小,来判断执行是否成功。
*/
if(row>){
System.out.print(String.format("执行信息如下:%s","执行成功!" ));
}
} }
二:结果集处理:
ResultSetHandler:
四种方法:1、ArrayHandler:获取查询的结果第一个结果。
2、ArrayListHandler:获取查询结果所有结果的数组的list集合。
3、BeanHandler:获取查询结果的中的第一个javabean的对象。
4、BeanListHandler:获取查询结果的所有的javabean的集合。
5、MapHandler:获取查询第一个结果,并是Map类型,Map<String,Object>因为列名称的类型是String而列的具体类型未知。
6、MapListHandler:获取查询的结果集,是一个List集合,集合的类型为:Map<String,Object>
其中方法2和4是比较重要。
javabean:
是一个java特有的数据类型,把数据封装成对象,需要有以下特点:
1、要有空参数的构造方法。
2、要有getXxx和setXxxx方法。
package mysql_comm_demo; public class Sys_User {
/*
javabean:
1、需要有空参数的构造器。
2、有getxxx和setxx方法。
*/
public Sys_User(){};
private int nid;
private String username;
private String password;
/*
需要注意的时候get或者set 后面的字段首字母大写。
*/
public int getNid(){
return this.nid;
}
public int setNid(int nid){
this.nid=nid;
return this.nid;
}
public String getUsername(){
return this.username;
}
public void setUsername(String user){
this.username=user;
}
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password=password;
} @Override
public String toString() {
return this.nid+" "+this.username+" "+this.password;
}
}
package mysql_comm_demo; import Jdbc_Test.*;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*; import java.sql.Array;
import java.sql.Connection; import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map; public class comm_Res {
public static void main(String ... args)throws SQLException{
//select_My.ex_Han();
//select_My.ex_Arlist();
//select_My.ex_Beahan();
//select_My.ex_Bean_List();
//select_My.co_List();
//select_My.sca_H();
select_My.m_H();
//select_My.m_Lh();
}
} class select_My{
private static final Connection con=jdbcutils.getCon();
private static final String sql="SELECT * FROM system_user ";
static void ex_Han()throws SQLException{
QueryRunner qr=new QueryRunner();
/*
通过queryrunner调用query方法,对数据库进行查询。
<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
该方法返回是泛型。类型不确定由处理结果集ResultSetHandler<T>来确定该方法返回的类型。
ResultSetHandler<T>是接口,改参数传递是实现该接口的实现类。ArrayHandler或者ArrayHandelerList等。
String sql:查询的sql语句用? 占位。
Object... params:sql语句的替代参数。
ArrayHandler:单个数组集。
ArrayHandelerList:是数组级套数组集。 第一种方法:
ArrayHandler 方法返回查询结果的第一个列的数组对象。无论你查询多少个结果,只返回第一个结果。
ResultSetHandler implementation that converts a ResultSet into an Object[]. This class is thread safe.
数据格式:['root',123]
*/
ArrayHandler ah=new ArrayHandler();
Object[] obj=qr.query(con,sql,ah);
for(Object i:obj){
System.out.print(i);
}
}
static void ex_Arlist()throws SQLException{
/*
第二种: ArrayListHandler
返回查询结果的数组集的List集合
数据形式:[Objects[]]
*/
QueryRunner qr=new QueryRunner();//执行数据平台。
ArrayListHandler arl =new ArrayListHandler();
List<Object[]> res=qr.query(con,sql,arl);
if(res.size()!=){
for(Object[] obj:res){
for (Object i:obj){
System.out.print(i+"\t");
}
System.out.print("\n");
}
} }
static void ex_Beahan()throws SQLException{
/*
第三种方法是:JAVABEAN
返回查询结果的第一行的数据的javabean对象。
构造方法:
BeanHandler(Class<? extends T> type)
参数:传入具有JAVABEAN的特点的class文件。
参数格式:classname.class
返回类型为:classname
*/
QueryRunner qr=new QueryRunner();
BeanHandler<Sys_User> beh=new BeanHandler<>(Sys_User.class);//注意beanhandler是泛型类Class BeanHandler<T>
Sys_User sys=qr.query(con,sql,beh);
System.out.print(sys);
}
static void ex_Bean_List() throws SQLException{
/*
第三种方法:Class BeanListHandler<T>
ResultSetHandler implementation that converts a ResultSet into a List of beans. This class is thread safe.
参数和上面一致。
返回值:List集合的classname object集合。
*/
QueryRunner qr=new QueryRunner();
BeanListHandler<Sys_User> bl=new BeanListHandler<>(Sys_User.class);
List<Sys_User> sys=qr.query(con,sql,bl);
for(Sys_User s:sys){
System.out.println(s);
}
}
static void co_List() throws SQLException{
/*
方法:ColumnListHandler 指定返回指定列的值。
构造器:分无参数和有参数
无参数:默认返回的是第一列的值。
有参数:可以指定传入列的名字(字符串),指定返回列的值,由于不确定类型,所以在返回结果的时候,
使用List<Object>形式。
*/
ColumnListHandler<Object[]> col=new ColumnListHandler<>("username");
QueryRunner qr=new QueryRunner();
List<Object[]> qr_obj=qr.query(con,sql,col);
System.out.print(qr_obj);
}
static void sca_H()throws SQLException{
/*
方法:ScalarHandler
该方法返回单一数据。所以在查询单一数据的时候可以用这个。比如说查执行语句的条数。
空参构造方法。
如果清楚返回类型可以进行指定。
参数构造方法也可以指定列的名字,需要字符串。返回只是一个数据而不是一个集合。
ResultSetHandler implementation that converts one ResultSet column into an Object. This class is thread safe.
*/
String sql="select count(*) from system_user";
ScalarHandler<Object> sc=new ScalarHandler<>();
QueryRunner qr=new QueryRunner();
Object obj=qr.query(con,sql,sc);
System.out.print(obj);
}
static void m_H()throws SQLException{
/*
方法:MapHandler 返回的是单个map类型,只返回当前结果的第一个。
ResultSetHandler
implementation that converts aResultSet
into aList
ofMap
s. This class is thread safe.
注意返回的类型是:Map<String,Object> 因为key是列的名字。
而列的类型不确定所以是Object
*/
MapHandler mh=new MapHandler();
QueryRunner qr=new QueryRunner();
Map<String,Object> ma=qr.query(con,sql,mh);
System.out.print(ma.values());
System.out.print(ma.keySet());
}
static void m_Lh()throws SQLException{
/*
方法:MapHandler 返回的是单个map类型,返回的是所有的列(map)的List集合。
ResultSetHandler implementation that converts a ResultSet into a List of Maps. This class is thread safe.
注意返回的类型是:Map<String,Object> 因为key是列的名字。
而列的类型不确定所以是Object
*/
MapListHandler ml=new MapListHandler();
QueryRunner qr=new QueryRunner();
List<Map<String,Object>> rest=qr.query(con,sql,ml);
for(Map<String,Object> obj:rest){
Collection<Object> val=obj.values();
for(Object a: val){
System.out.print(a+"\t");
}
System.out.print("\n");
}
}
}
Jdbcutils工具类:
package Jdbc_Test; import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties; public class jdbcutils {
private jdbcutils(){};
private static Connection con;
public static void main(String[] args)throws IOException{ }
public static Connection getCon(){
/*
通过读取properites配置文件来获取数据库连接信息。
通过类加载器,读取当前父目录的配置文件。通过class.getClassLoader方法getResourceAstream获取配置文件的
内容,然后通过IO流处理properites文件获取对应的key值。
配置文件便于灵活配置数据库信息。
*/
InputStream inp=jdbcutils.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro=new Properties();
try {
pro.load(inp);
}catch (Exception ex){
throw new RuntimeException(ex+"读取配置文件失败!");
}
try {
String Drverclass = pro.getProperty("Driver.class");
String url = pro.getProperty("Url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
Class.forName(Drverclass);
con = DriverManager.getConnection(url, username, password);
}catch (Exception ex){
throw new RuntimeException(ex+"数据库连接失败!");
}
return con;
}
public static void cls_re(Connection con, Statement sta, ResultSet re){
if(con!=null){
try{
con.close();
}catch (Exception ex){}
}
if(sta!=null){
try{
sta.close();
}catch (Exception ex){}
}
if(re!=null){
try{
re.close();
}catch (Exception ex){}
} }
public static void cls_re(Connection con, Statement sta){
if(con!=null){
try{
con.close();
}catch (Exception ex){}
}
if(sta!=null){
try{
sta.close();
}catch (Exception ex){}
} }
}
JDBC 使用common-dbutiles的更多相关文章
- java线程阻塞问题排查方法
我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题.今天终于了了这个心结.把解决过程总结下和大家分享. 首先用jstack命令打出这个进程的全部线程堆栈.拿到线程dump文件之后,搜索 ...
- Cause: net.sf.cglib.beans.BulkBeanException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
2017-03-13 15:40:15,003 ERROR [com.hisense.hitv.service.dotexc.impl.DotExcPolicyServiceImpl.updateD ...
- SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: InlineParameterMap
<select id="getResByName" resultClass="Resources" parameterClass="java.l ...
- JDBC的批处理操作三种方式 pstmt.addBatch()
package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...
- JDBC API Description
package java.sql description What the JDBCTM 4.2 API Includes Versions What the java.sql Package Con ...
- Sqoop:Could not load db driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver
Sqoop version:1.4.6-cdh Hadoop version:2.6.0-cdh5.8.2 场景:使用Sqoop从MSSqlserver导数据 虽然1.4.6的官网说 Even if ...
- JDBC数据库连接池技术
在JDBC中,获得连接或释放资源是非常消耗系统资源的两个过程,为了解决此类性能问题,通常采用连接池技术,来共享连接.这样我们就不需要每次都创建连接.释放连接了,这些操作都交给了连接池. 用池的概念来管 ...
- Weblogic常见故障常:JDBC Connection Pools(转)
WebLogic Server中数据库连接池是一个经常出问题的地方,总结一下出问题的原因和解决办法. 一.数据库连接泄漏 此类问题一般都是由于开发人员没有正确关闭数据库连接造成的.比如使用完Conne ...
- Java数据库——JDBC 2.0操作
可滚动的结果集 让结果集滚动起来 //================================================= // File Name : JDBC20_demo //-- ...
- 怎么安装MYSQL5.0的JDBC驱动
1.下载mysql for jdbc driver. http://dev.mysql.com/downloads/connector/j/3.1.htmlMySQL Connector/J is ...
随机推荐
- js静态数据分页展示
拿vue做示例 首先定义data data() { return { tableData: [], // 当前页的数据,用于给表格展示用的 tableDataAll: [], // 需要拿来分页的总数 ...
- CodeForces760B
B. Frodo and pillows time limit per test:1 second memory limit per test:256 megabytes input:standard ...
- CSS流体(自适应)布局下宽度分离原则——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1463 一.简短的前言 ...
- AGC008E:Next or Nextnext
传送门 考虑转化成图论问题,\(i\) 向 \(p_i\) 连边,那么合法方案一定是形成了若干个简单环或自环 考虑一个环内的情况: 如果 \(a_i=p_i\),那么 \(i\) 向 \(a_i\) ...
- vue 面试时需要准备的知识点
前端火热的框架层出不穷,作为码农的我们,依旧需要去学习,去探索新的问题,学习新技术,其实就是为了写一手好的,自认为是高质量的代码.今天主要分享一下前端最火的框架vue,也是我比较喜欢的框架. vue上 ...
- OpenGL学习--07--模型加载(obj)
1.tutorial07.cpp // Include standard headers #include <stdio.h> #include <stdlib.h> #inc ...
- 最长斐波那契序列-LeetCode-873
英文版A sequence X_1, X_2, ..., X_n is fibonacci-like if: - n >= 3- X_i + X_{i+1} = X_{i+2} for all ...
- AR中的SLAM(二)
写在前面 本文想讨论一下AR的架构和SLAM在其中的作用. AR AR的框架可以简单划分为感知和交互两部分. 感知部分主要负责信息的收集和处理.信息主要通过不同的传感器收集,包括图像.设备加速度.距离 ...
- svn 同步资源库时忽略某些文件类型和文件夹
项目开发中,开发人员经常用SVN来管理代码,在和服务器同步时,每次都看到一堆.class,.log,target等文件,这样很不舒服. 解决方法: 打开:window-->preferences ...
- 1 Java程序文件中函数起始行和终止行在程序文件位置中的判定__抽象语法树方法
应用需求: 实现对BigCloneBench中函数体的克隆检测,必须标注出起始行号和终止行号. 问题: 给定一个Java文件,从中提取出每个函数的起始行和终止行. 难点: 这个问题的难点在于,对于Ja ...