JDBC之SqlHelper
SqlHelper工具类如下:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.cc.foo_006.DbUtil; /**
* SQL执行工具类
* @author CC11001100
*
*/
public class SqlHelper{ /**
* 执行sql dql语句
* @param clazz
* @param sql
* @param args
* @return
*/
public <T> List<T> dql(Class<T> clazz,String sql,Object ...args){ List<T> list=new ArrayList<>(); Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null; try {
conn=DbUtil.getInstance().getConnection();
pstmt=conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
pstmt.setObject(i+1,args[i]);
}
rs=pstmt.executeQuery();
while(rs.next()){
Map<String,Object> map=new HashMap<>();
ResultSetMetaData meta=rs.getMetaData();
for(int i=1;i<=meta.getColumnCount();i++){
map.put(meta.getColumnLabel(i),rs.getObject(i));
}
T o=clazz.newInstance();
for(String key:map.keySet()){
ReflectionUtil.setFieldValue(o,key,map.get(key));
}
list.add(o);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}finally{
DbUtil.getInstance().close(conn,pstmt,rs);
}
return list;
} /**
* 执行sql dml语句
* @param conn
* @param sql
* @param args
* @throws SQLException
*/
public void dml(Connection conn,String sql,Object ...args) throws SQLException{
PreparedStatement pstmt=null; try {
pstmt=conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
pstmt.setObject(i+1,args[i]);
}
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw e;
}finally{
DbUtil.getInstance().close(pstmt);
}
} }
反射工具类如下:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays; /**
* 反射工具类
* @author CC11001100
*
*/
public class ReflectionUtil { /**
* 设置属性可访问
* @param field
*/
public static void makeFieldAccessible(Field field) {
if (!Modifier.isPublic(field.getModifiers())) {
field.setAccessible(true);
}
} /**
* 设置方法可访问
* @param method
*/
public static void makeMethodAccessible(Method method) {
if (!Modifier.isPublic(method.getModifiers())) {
method.setAccessible(true);
}
} /**
* 获取本类显示声明的属性
* @param object
* @param fieldName
* @return
*/
public static Field getDeclaredField(Object object, String fieldName) {
try {
return object.getClass().getDeclaredField(fieldName);
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
return null;
} /**
* 获取属性值(自己的或继承来的)
* @param object
* @param fieldName
* @return
*/
public static Object getFieldValue(Object object, String fieldName) {
try {
Field field=getField(object,fieldName);
if(field==null) return null; Field.setAccessible(new Field[]{field},true);
return field.get(object);
} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
} /**
* 设置属性的值(自己的或继承来的)
* @param object
* @param fieldName
* @param fieldValue
* @throws NoSuchFieldException
*/
public static void setFieldValue(Object object, String fieldName, Object fieldValue) throws NoSuchFieldException {
Field field=getField(object,fieldName);
if(field==null) throw new NoSuchFieldException() ; try {
Field.setAccessible(new Field[]{field},true);
field.set(object,fieldValue);
} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
} /**
* 提取冗余代码:根据名字获取属性,然后setField or getField
* @param object
* @param fieldName
* @return
*/
private static Field getField(Object object,String fieldName){
try {
//从自己开始往上顺藤摸瓜
Class<?> clazz=object.getClass();
while(clazz!=Object.class){
Field[] fields=clazz.getDeclaredFields();
for(int i=0;i<fields.length;i++){
//子类不应该继承父类的private,所以无视父类们的private field
if(Modifier.isPrivate(fields[i].getModifiers()) && clazz!=object.getClass()) continue;
if(fieldName.equals(fields[i].getName())){
return fields[i];
}
}
clazz=clazz.getSuperclass();
}
} catch (IllegalArgumentException | SecurityException e) {
e.printStackTrace();
}
return null;
} /**
* 获取在本类显示声明的方法
* @param object
* @param methodName
* @param parameterTypes
* @return
*/
public static Method getDeclaredMethod(Object object, String methodName, Class<?>[] parameterTypes) {
try {
return object.getClass().getDeclaredMethod(methodName,parameterTypes);
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
return null;
} /**
* 获得方法,无论是本类声明还是继承来的
* @param object
* @param methodName
* @param parameterTypes
* @return
*/
private static Method getMethod(Object object, String methodName, Class<?>[] parameterTypes) {
Class clazz=object.getClass();
while(clazz!=Object.class){
Method methods[]=clazz.getDeclaredMethods();
Method.setAccessible(methods,true); //太挫了..
for(int i=0;i<methods.length;i++){
//子类不应该操作父类的private method
if(Modifier.isPrivate(methods[i].getModifiers()) && clazz!=object.getClass()) continue;
//因为Class只有一份,所以可以借助内置的进行比较,如果**名称**和**参数(数量、位置、类型)**都相同,则认定为同一个方法,返回值修饰符等不予考虑
//这么做不能区分包装类型和基本类型,难道它们底层实现不一致?妈的我怎么知道... int.class!=Integer.class
if(methodName.equals(methods[i].getName()) && Arrays.equals(methods[i].getParameterTypes(),parameterTypes)) return methods[i];
}
clazz=clazz.getSuperclass();
}
return null;
} /**
* 调用方法(本类声明或继承而来)
* @param object
* @param methodName
* @param parameterTypes
* @param parameters
* @return
* @throws NoSuchMethodException
*/
public static Object invokeMethod(Object object, String methodName, Class<?>[] parameterTypes,Object[] parameters) throws NoSuchMethodException {
Method method=getMethod(object,methodName,parameterTypes);
if(method==null) throw new NoSuchMethodException(); try {
return method.invoke(object,parameters);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
} }
数据对象如下:
public class User {
private String id;
private String username;
private String passwd;
private int power;
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", passwd=" + passwd + ", power=" + power + "]";
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
测试如下:
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; import org.cc.foo_006.DbUtil;
import org.junit.Test; public class Main_016 { @Test
public void test_001(){ Connection conn=null; try {
conn=DbUtil.getInstance().getConnection();
conn.setAutoCommit(false); SqlHelper sqlHelper=new SqlHelper(); sqlHelper.dml(conn,"INSERT INTO t_user (id,username,passwd) VALUES (?,?,?)","1001","root","toor");
sqlHelper.dml(conn,"INSERT INTO t_power (u_id,power) VALUES (?,?)","1001",7); conn.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
DbUtil.getInstance().close(conn);
}
} @Test
public void test_002(){ SqlHelper sqlHelper=new SqlHelper();
List<User> list=sqlHelper.dql(User.class,"SELECT t1.id,username,passwd,power FROM t_user AS t1 JOIN t_power AS t2 ON t1.id=t2.u_id WHERE t1.id=?","1001"); for(User u:list){
System.out.println(u);
} } }
数据库语句如下:
drop table if exists t_power;
drop table if exists t_user; drop table if exists t_user;
create table t_user(
id varchar(20) primary key ,
username varchar(20) not null,
passwd varchar(20) not null
)charset utf8; drop table if exists t_power;
create table t_power (
id int primary key auto_increment ,
u_id varchar(20) ,
power int ,
constraint t_user_fk foreign key (u_id) references t_user(id)
)charset utf8;
JDBC之SqlHelper的更多相关文章
- java jdbc sqlhelper
package com.shop.util; import java.sql.*; //SqlHelper类 //定义了数据库连接函数,关闭查询结果集,关闭Statement对象,关闭数据库连接 // ...
- java sqlhelper
dbinfo.properties部分: 注意每行末尾不可以有空格 #oracle configure UserName=scott Password=tiger Driver=oracle.jdbc ...
- java版本的sqlHelper
以下版本的sqlHelper可以支持普通的DDL,DML和查询语句,对于连接池,事务等的支持还有待改进 1)将数据库连接相关信息存储为属性文件,如database.properties,建立DataB ...
- 转!!各种数据库的jdbc驱动下载及连接方式
各种数据库驱动 数据库名称 下载地址 说明 Mysql http://www.mysql.com/products/connector/j/ Shipped. But need to download ...
- JAVA WEB SQLHelper类的封装
在这次做项目中,我对自己最满意的就是封装了一下SQLHelper类,我对自己感到骄傲主要是 我是初学者,我刚开始不知道可以这样做,我只是想着试着去这样做了,结果真的可以,所以我 在我的模块就自己封装了 ...
- java 版本SQLHelper
package com.jack.SQLHelper; import java.sql.*;import java.util.logging.*;import javax.swing.table.*; ...
- 2015.8.2 jdbc实现商品类的增删查改
在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...
- 纯Java JDBC连接数据库,且用JDBC实现增删改查的功能
Java JDBC连接数据库 package cn.cqvie.yjq; import java.sql.*; /** * 注册数据库的驱动程序,并得到数据库的连接对象 * @author yu * ...
- [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...
随机推荐
- php的字符串转2进制函数
<?php $file1 = '16.jpg'; $file2 = 'test.txt'; $file3 = '47.jpg'; $size = filesize($file1); echo ' ...
- python 内置函数 : compile()
这个函数用来编译一段字符串的源码,结果可以生成字节码或者AST(抽像语法树),字节码可以使用函数exec()来执行,而AST可以使用eval()来继续编译. 参数source是一串字符串的源码,或者是 ...
- iOS开发——网络篇——文件下载(NSMutableData、NSFileHandle、NSOutputStream)和上传、压缩和解压(三方框架ZipArchive),请求头和请求体格式,断点续传Range
一.小文件下载 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion ...
- BZOJ1901——Zju2112 Dynamic Rankings
1.题目大意:区间第k小,有单点修改 2.分析:这个是树状数组套线段树,也是主席树....为什么主席树这么多QAQ 就是树套树的那种插入什么的,注意啊,一定要动态开内存..不然会爆.. 然后算答案有两 ...
- 自动布局之autoresizingMask使用详解(Storyboard&Code)
自动布局之autoresizingMask使用详解(Storyboard&Code) http://www.cocoachina.com/ios/20141216/10652.html 必须禁 ...
- OpenCV成长之路(5):图像直方图的应用
正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...
- win10与ubantu双系统产生的引导错误问题-----unknown filesystem
在win10和ubantu双系统中开机启动时出现unknown filesystem的解决办法 出现上述问题是引导区出错了. 方法如下: grub rescue>ls grub rescue ...
- postgresql 函数&存储过程 ; 递归查询
函数:http://my.oschina.net/Kenyon/blog/108303 紧接上述,补充一下: 输入/输出参数的函数demo(输入作为变量影响sql结果,输出作为结果返回) create ...
- 【GoLang】golang 中可变参数的 定义、传递 示例
支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数. package main import "fmt" // 这个函数 ...
- WCF 定制自己的签名验证逻辑
关键点: 1. 保证在客户端设置签名. client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentU ...