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 ...
随机推荐
- JVM内存监控工具 Jvisualvm
这个工具是官方提供的,直接在JDK工具包下的bin目录找找就可以找到,或者打开cmd直接输入"jvisualvm"即可打开该工具(配置好java环境变量). 需要在catalina ...
- Understand:高效代码静态分析神器详解(转)
之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...
- hiho #1151 : 骨牌覆盖问题·二 (递推,数论)
#1151 : 骨牌覆盖问题·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题? ...
- 40 网络相关函数(八)——live555源码阅读(四)网络
40 网络相关函数(八)——live555源码阅读(四)网络 40 网络相关函数(八)——live555源码阅读(四)网络 简介 15)writeSocket向套接口写数据 TTL的概念 函数send ...
- java文件和文件夹复制、删除、移动操作
java文件和文件夹复制.删除.移动操作 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputS ...
- python 类修饰器
1. 修改类函数. 场景: 如果要给一个类的所有方法加上计时,并打印出来.demo如下: # -*- coding:utf-8 -*- import time def time_it(fn): &qu ...
- ubuntu14.04 server安装vncserver
$ sudo apt-get install -y tightvncserver $ vncserver 转自: https://www.liquidweb.com/kb/how-to-install ...
- 【GoLang】GoLang 单元测试、性能测试使用方法
单元测试代码: ackage test import ( // "fmt" "testing" ) func Test_FlowControl(t *testi ...
- Fraction to Recurring Decimal
Given two integers representing the numerator and denominator of a fraction, return the fraction in ...
- struts2 servlet api 访问方式
Action中访问ServletAPI. 主要就是接收表单参数及向域对象中存取值. 关于SevletAPI的方法在Action中有三种方式: 1.完全解耦合的形式: * 使用一个类:ActionCon ...