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的更多相关文章

  1. java jdbc sqlhelper

    package com.shop.util; import java.sql.*; //SqlHelper类 //定义了数据库连接函数,关闭查询结果集,关闭Statement对象,关闭数据库连接 // ...

  2. java sqlhelper

    dbinfo.properties部分: 注意每行末尾不可以有空格 #oracle configure UserName=scott Password=tiger Driver=oracle.jdbc ...

  3. java版本的sqlHelper

    以下版本的sqlHelper可以支持普通的DDL,DML和查询语句,对于连接池,事务等的支持还有待改进 1)将数据库连接相关信息存储为属性文件,如database.properties,建立DataB ...

  4. 转!!各种数据库的jdbc驱动下载及连接方式

    各种数据库驱动 数据库名称 下载地址 说明 Mysql http://www.mysql.com/products/connector/j/ Shipped. But need to download ...

  5. JAVA WEB SQLHelper类的封装

    在这次做项目中,我对自己最满意的就是封装了一下SQLHelper类,我对自己感到骄傲主要是 我是初学者,我刚开始不知道可以这样做,我只是想着试着去这样做了,结果真的可以,所以我 在我的模块就自己封装了 ...

  6. java 版本SQLHelper

    package com.jack.SQLHelper; import java.sql.*;import java.util.logging.*;import javax.swing.table.*; ...

  7. 2015.8.2 jdbc实现商品类的增删查改

    在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...

  8. 纯Java JDBC连接数据库,且用JDBC实现增删改查的功能

    Java JDBC连接数据库 package cn.cqvie.yjq; import java.sql.*; /** * 注册数据库的驱动程序,并得到数据库的连接对象 * @author yu * ...

  9. [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)

    1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...

随机推荐

  1. centos安装

    转:http://www.cnblogs.com/Johness/archive/2012/12/03/2800126.html 在已经安装了Win7的系统下安装CentOS 注意:1.由于涉及到对硬 ...

  2. LazyLoad.js及scrollLoading.js

    http://blog.csdn.net/ning109314/article/details/7042829 目前图片延迟加载主要分两大块,一是触发加载(根据滚动条位置加载图片):二是自动预加载(加 ...

  3. iOS 8 Xcode6 设置Launch Image 启动图片

    本人apem http://www.mamicode.com/info-detail-494411.html 如何设置App的启动图,也就是Launch Image? Step1 1.点击Image. ...

  4. ionic不同view跳转到同一个

    ionic不同view跳转到同一个 view并保留历史的路由设计 上代码:state 里面新加一个状态 .state("other", { url: "/other&qu ...

  5. SMTP协议--在cmd下利用bat命令行发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 选择‘开始’-‘运行’,输入cmd,进入命令提示符窗口. Windows7默认没有开始Telnet服务,请在运 ...

  6. 数据结构与算法实验题6.1 s_sin’s bonus byFZuer

    玩家从n 个点n-1 条边的图,从节点1 丢下一个小球,小球将由于重力作用向下落,而从小球所在点延伸出的每一条边有一个值pi 为小球通过该条边的概率(注意从同一个节点向下延伸的所有边的pi 的和可以小 ...

  7. django xadmin自定义菜单

    1. 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): retur ...

  8. ASP.NET 上的 Async/Await 简介

    原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述, ...

  9. redis 异常解决办法

    redis 异常解决办法 26069:M 08 Aug 17:06:58.858 # WARNING: The TCP backlog setting of 511 cannot be enforce ...

  10. iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁

      我们在使用dispatch_sync 时可能会出现死锁,看下面的例子: import UIKit class ViewController: UIViewController { var seri ...