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 ...
随机推荐
- Effective Java 读书笔记之七 通用程序设计
一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each ...
- mongodb 维护
如何释放空间? 1. 先用 remove 命令删除数据 2. repair.需要停机,即便你不停机的话 mongodb 自己也会锁住直到 repair 完成.注意要有足够的磁盘空间,需要额外一倍的空间 ...
- jQuery中的checkbox问题
一开始的代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Linux之匹配符
shell常见通配符: 字符 含义 实例 * 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab. ? 匹配任意 ...
- linux定时执行脚本
阅读目录 1. cron服务[Ubuntu环境] 2. crontab用法 3. 编辑crontab文件 4. 流程举例 5. 几个例子 Linux中,周期执行的任务一般由cron这个守护进程来处理. ...
- 前端之css、JavaScript和DOM
css position 一般组合 relative+absolute,以relative为父元素,absolute依照relative进行定位. opcity: 0.5 透明度 z-index: 层 ...
- bootstrap常用的定义风格
primary() 首选项 success() 成功 info() 一般信息 warning() 警告 danger() 危险 <bod ...
- mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题. 首先要说明一下,这些文件都是mysql的日志文件,如 ...
- Calico在Docker中的搭建
一,Multi-host网络需求 开始之前推荐两篇文章 http://xelatex.github.io/2015/11/15/Battlefield-Calico-Flannel-Weave-and ...
- Git打包文件
原文: http://gitbook.liuhui998.com/7_5.html 一.打包文件索引 首先, 我们来看一下打包文件索引, 基本上它只是一系列指向打包文件内位置的书签. 打包文件索引有两 ...