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 ...
随机推荐
- EF接触02
Ado.net Entity Framework早期称为ObjectSpace.基于Ado.net操作数据库的一组类库. 什么是ADO.NET? 基础.net平台下的操作数据库的一组Api或组建.五大 ...
- C 语言 typedef
虽然#define语句看起来象typedef,但实际上却有本质上的差别.对于#define来说,仅在编译前对源代码进行了字符串替换处理:而对于typedef来说,它建立了一个新的数据类型别名.由此可见 ...
- python 函数的调用 和执行 小知识
1.符号表 执行一个函数会引入一个用于函数的局部变量的新符号表. 更确切地说, 函数中的所有的赋值都是将值存储在局部符号表: 而变量引用首先查找局部符号表, 然后是上层函数的局部符号表, 然后是全局符 ...
- 【转】UML类图几种关系的总结
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...
- 前端开发必须知道的JS(二) 闭包及应用
http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...
- Bootstrap之表格checkbox复选框全选
效果图: HTML中无需添加额外的一列来表示复选框,而是由JS完成,所以正常的表格布局就行了: <table class="table table-bordered table-hov ...
- neutron的基本原理
neutron是openstack的一个重要模块,也是比较难以理解和debug的模块之一. 我这里安装如图安装了经典的三个节点的Havana的Openstack 图1 分三个网络: Externa ...
- C# 毕业证书打印《三》
打印很关键的方法,打印方法DataPrint(),将你要打印的数据信息发送到打印机就可以了,打印机将自动处理. public void DataPrint() { try { PrintDocumen ...
- strcpy C++实现
#include <iostream> #include <assert.h> using namespace std; char *strcpy(char *strDest, ...
- Java RuntimeException异常处理汇总
Java中所有异常的父类是Throwable类,在Throwable类下有两大子类: 一个是Error类,指系统错误异常,例如:VirtualMachineError 虚拟机错误,ThreadDeat ...