如有转载和引用,请注明出处,谢谢

代码不一定完整,具体代码已经托管到 git@osc 完整代码点我

1. 定义我们需要的注解

要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用注解标识 model 与数据库的映射关系一样,这里我也设计了三个注解

Table 注解

用来表明该类与数据表的关联关系

package com.loweir.jdbcUtil.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by loweir on 2017/3/10.
* 用来标记类与数据库表的关系
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table { // 对应的数据库表名
public String name(); // 对应的数据库名,暂时无用,以后可能用到
public String catalog() default "";
}

column 注解

用来标记类中属性与数据表中字段的关联关系

package com.loweir.jdbcUtil.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by loweir on 2017/3/10.
* 编辑类中属性与数据库表字段的关系
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column { // 数据字段名称
public String name(); // 是否允许为空
public boolean nullable() default true; // 是否是主键
public boolean primary() default false; // 主键是否自增长 默认 true
public boolean autoIncrement() default true;
}

like 注解 用于支持模糊查询

package com.loweir.jdbcUtil.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by loweir on 2017/3/10.
* 标记这个字段需要模糊查询
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Like { LikeType value() default LikeType.BOTH;
}

LikeType 代码,枚举类型

package com.loweir.jdbcUtil.annotation;

/**
* Created by loweir on 2017/3/10.
*/
public enum LikeType {
BOTH, // 全匹配 eg. %abc%
BEFORE, // 前匹配 eg. %abc
AFTER // 后匹配 eg. abc%
}

字段属性表

package com.loweir.jdbcUtil.annotation;

/**
* Created by loweir on 2017/3/10.
* 临时存储映射信息
*/
public class DBColumnInfo { private String name; // 数据库字段名称 private boolean nullable; // 是否为空 private boolean primary; // 是否是主键 private boolean autoIncrement; // 是否是自增 private LikeType likeType ; // 模糊查询 public DBColumnInfo() {
} public DBColumnInfo(String name, boolean nullable, boolean primary, boolean autoIncrement,LikeType likeType) {
this.name = name;
this.nullable = nullable;
this.primary = primary;
this.autoIncrement = autoIncrement;
this.likeType = likeType;
} // setter and getter
}

2. 反射工具类

提供一些常用的反射操作

package club.loweir.jdbc.util;

/**
* Created by loweir on 2016/9/7.
*/
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class BeanReflectionUtil { /**
* 获得某类的静态属性
* @param className
* @param fieldName
* @return
* @throws Exception
*/
public static Object getStaticProperty(String className,String fieldName)throws Exception{
Class cls=Class.forName(className);
Field field=cls.getField(fieldName);
Object provalue=field.get(cls);
return provalue;
}
/**
* 获取参数对象的属性值
* @param obj
* @param propertyName
* @return
* @throws Exception
*/
public static Object getPrivatePropertyValue(Object obj,String propertyName)throws Exception{
Class cls=obj.getClass();
Field field=cls.getDeclaredField(propertyName);
field.setAccessible(true);
Object retvalue=field.get(obj);
return retvalue;
} /**
* 执行某对象的方法
* @param owner
* @param methodName
* @param args
* @return
* @throws Exception
*/
public Object invokeMethod(Object owner,String methodName,Object[] args)throws Exception{
Class cls=owner.getClass();
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
Method method=cls.getMethod(methodName,argclass);
return method.invoke(owner, args);
} /**
* 执行静态类的方法
* @param className
* @param methodName
* @param args
* @return
* @throws Exception
*/
public Object invokeStaticMethod(String className,String methodName,Object[] args)throws Exception{
Class cls=Class.forName(className);
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
Method method=cls.getMethod(methodName,argclass);
return method.invoke(null, args);
} public static Object newInstance(String className)throws Exception{
Class clss=Class.forName(className);
java.lang.reflect.Constructor cons=clss.getConstructor();
return cons.newInstance();
} /**
* 等到对象的所有属性
* @param className
* @return
* @throws ClassNotFoundException
*/
public static Field[] getBeanDeclaredFields(String className) throws ClassNotFoundException{
Class clss=Class.forName(className);
Field[] fs = clss.getDeclaredFields();
return fs;
} /*
* 得到类中的方法
*/
public static Method[] getBeanDeclaredMethods(String className) throws ClassNotFoundException{
Class clss=Class.forName(className);
Method[] methods = clss.getMethods();
return methods;
} /**
* bean的属性拷贝
* @param source 被拷贝的对象
* @param target 拷贝的对象
*/
public static void copyProperties(Object source,Object target){ try {
List<Field> list = new ArrayList<Field>();
Field[] sourceFild = getBeanDeclaredFields(source.getClass().getName());
Field[] targetFild = getBeanDeclaredFields(target.getClass().getName());
Map<String,Field> map = new HashMap<String,Field>();
for(Field field : targetFild){
map.put(field.getName(), field);
}
for(Field field : sourceFild){
if(map.get(field.getName())!=null){
list.add(field);
}
}
//source 属性值
for(Field field : list){
if(field.getName().equals("tableName")){
continue;
}
Field tg = map.get(field.getName());
tg.setAccessible(true);
tg.set(target, getPrivatePropertyValue(source,field.getName()));
} } catch (Exception e) {
e.printStackTrace();
}
} }

3. 简单的 model

package com.loweir.jdbcUtil.test.model;

import com.loweir.jdbcUtil.annotation.Column;
import com.loweir.jdbcUtil.annotation.Like;
import com.loweir.jdbcUtil.annotation.Table; /**
* Created by loweir on 2017/3/10.
* 测试使用model 对应数据库的 department 表
*/
@Table(name="department")
public class Department { @Column(name = "id",nullable = false,primary = true,autoIncrement = true)
private Integer id; // 一般情况下,对部门名称有模糊搜索的需求
@Like
@Column(name = "name")
private String name; @Column(name = "description")
private String description; // setter and getter
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getDescription() {
return description;
} public void setDescription(String description) {
this.description = description;
}
}

4. 注解解析

将对象的上的注解进行解析,得到对应关系

package com.loweir.jdbcUtil.annotation;

import com.loweir.jdbcUtil.utils.BeanReflectionUtil;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; /**
* Created by loweir on 2017/3/10.
* 注解解析类
*/ public class AnnotationParse { /**
* 得到 Table 注解,如果不使用 Table 注解,可在类中使用 tableName 属性,可用于水平分表处理
* @param bean
* @return
*/
public static String getTableName(Object bean) {
Table table = bean.getClass().getAnnotation(Table.class);
if (table != null) {
return table.name();
}
else {
try {
return (String) BeanReflectionUtil.getPrivatePropertyValue(bean, "tableName");
} catch (Exception e) {
// 此处可以换成对应的日志操作
System.out.println("请检查类 [" + bean.getClass().getName() + "] 是否添加了 Table 注解 或者 tableName 成员变量!");
e.printStackTrace();
}
}
return null;
} /**
* 获取一个对象中属性注解,
* @param bean
* @return
*/
public static List<DBColumnInfo> getDBColumn(Object bean) {
List<DBColumnInfo> dbColumnInfos = new ArrayList<DBColumnInfo>();
DBColumnInfo dbColumnInfo = null;
Field[] fields = bean.getClass().getDeclaredFields();
for(Field field : fields) {
Column column = field.getAnnotation(Column.class); // 得到 字段注解
if (column != null) { // 如果字段注解不为空
// 得到like
Like like = field.getAnnotation(Like.class); // 判断是否使用模糊查询
if (like == null) {
dbColumnInfo = new DBColumnInfo(column.name(),column.nullable(),column.primary(),column.autoIncrement(),null);
}
else {
dbColumnInfo = new DBColumnInfo(column.name(),column.nullable(),column.primary(),column.autoIncrement(),like.value());
}
dbColumnInfos.add(dbColumnInfo);
}
}
return dbColumnInfos;
}
/**
* 返回表字段的所有字段 column1,column2,column3
* @param object
* @return
*/
public static String getTableAllColumn(Object object){
List<DBColumnInfo> list = getDBColumn(object);
StringBuffer sb = new StringBuffer();
int i=1;
for(DBColumnInfo vo :list){
sb.append(vo.getName());
if(i!=list.size()){
sb.append(",");
}
i++;
}
return sb.toString();
}
}

5. jdbc工具类

package club.loweir.jdbc.util;

import java.lang.reflect.Field;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class DBManager {
Statement st=null;
PreparedStatement pstmt = null;
CallableStatement cst = null; /**get database connection
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost/score_v2","root","root");
//"jdbc:mysql://localhost/bookge","root",""
//"jdbc:mysql://localhost:3306/bookge"
//user=root&password=root&useUnicode=true&characterEncoding=gb2312";
//con.setAutoCommit(false);
return con;
} /**
* @param args
*/
public static void main(String[] args) throws SQLException{
// TODO Auto-generated method stub
System.out.println("------conn--------" + getConnection());
//System.out.println(DbPool.getPool());
System.out.println("------conn.getAutoCommit()--------" + getConnection().getAutoCommit());
//System.out.println("------DbPool.class.hashCode()--------" + DbPool.class.hashCode());
} public static void clearup(PreparedStatement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException se) {
se.printStackTrace();
}
pstmt = null;
}
} public static List getObjectListBySql(String sql ,Object[] args ,Object obj,String colums) {
List<Object> list = new ArrayList<Object>();
Connection conn = null;
ResultSet result = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
pstmt.setObject(i+1, args[i]);
}
result = pstmt.executeQuery();
//SqlRowSet result = this.getConnection().prepareStatement(sql);
Map<String,String> map = new HashMap<String,String>();
if(colums!=null && colums.length()>0){
String[] tempStrings = colums.split(",");
for(String str: tempStrings){
map.put(str.trim(), str.trim());
}
}else{
Object tableName = AnnoationParse.getTableName(obj);
List<DBColumn> clist = AnnoationParse.getDBColumn(obj);
for(DBColumn vo : clist ){
map.put(vo.getColumnName(), vo.getColumnName());
}
}
//obj 熟悉字段
Field[] fields = BeanReflectionUtil.getBeanDeclaredFields(obj.getClass().getName()); while(result.next()){
Object temp = BeanReflectionUtil.newInstance(obj.getClass().getName());
for(Field field : fields){
if(map.get(field.getName())!=null){
field.setAccessible(true);
field.set(temp, result.getObject(field.getName()));
}
}
list.add(temp);
}
} catch (Exception e) {
e.printStackTrace();
// log.error(StringUtil.outputException(e));
}
finally {
clearup(conn, pstmt, result);
}
return list;
} /**
* Close database resource.
*
* @param conn
* @param pstmt
*/
public static void clearup(Connection conn, PreparedStatement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException se) {
se.printStackTrace();
}
pstmt = null;
} if (conn != null) {
try {
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
conn = null;
} } /**
* Close databse resource.
*
* @param conn
* @param pstmt
* @param rs
*/
public static void clearup(Connection conn, PreparedStatement pstmt,
ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException se) {
se.printStackTrace();
}
rs = null;
} if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException se) {
se.printStackTrace();
}
pstmt = null;
} if (conn != null) {
try {
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
conn = null;
}
} /**
* Close databse resource.
* @param pstmt
* @param rs
*/
public static void clearup(PreparedStatement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException se) {
se.printStackTrace();
}
rs = null;
} if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException se) {
se.printStackTrace();
}
pstmt = null;
} } }

6. 结合反射实现查询操作

package com.loweir.jdbcUtil;

import com.loweir.jdbcUtil.annotation.AnnotationParse;
import com.loweir.jdbcUtil.annotation.DBColumnInfo;
import com.loweir.jdbcUtil.annotation.LikeType;
import com.loweir.jdbcUtil.utils.BeanReflectionUtil; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; /**
* Created by loweir on 2017/3/10.
*/
public class JdbcUtil { /**
* 根据一个实例对象 得到对应的数据数据,该操作会根据实例对象中的非空项进行where 查询
* 当全部项为空时使用 select * from tableName
* 不管查出多少数据,只取第一条记录
* 没有数据返回 null
*/
public Object getBean(Object bean) {
List<Object> list = new ArrayList<Object>();
try {
Field[] fields = BeanReflectionUtil.getBeanDeclaredFields(bean.getClass().getName());
Object tableName = AnnotationParse.getTableName(bean);
StringBuffer where = new StringBuffer();
List<Object> propertyValue = new ArrayList<Object>();
List<DBColumnInfo> clist = AnnotationParse.getDBColumn(bean);
for(DBColumnInfo vo : clist ){
Object o = BeanReflectionUtil.getPrivatePropertyValue(bean,vo.getName());
if(o!=null && !o.toString().equals("")){
if (vo.getLikeType() == null) {
where.append(" and ").append(vo.getName()).append(" =?");
propertyValue.add(o);
}
else {
where.append(" and ").append(vo.getName()).append(" like ? ");
if (vo.getLikeType() == LikeType.BEFORE) { // 前
propertyValue.add("%" + o);
}
else if (vo.getLikeType() == LikeType.BOTH ) { // 后
propertyValue.add("%" + o + "%");
}
else {
propertyValue.add(o + "%");
}
} }
}
String sql = null;
SqlRowSet result = null;
//带条件的查询
if(propertyValue.size()>0){
sql = "select * from "+tableName+ " where "+ where.toString().substring(4);
}
else{
sql = "select * from "+tableName;
} if(propertyValue.size()>0){
result = this.getJdbcTemplate().queryForRowSet(sql,propertyValue.toArray());
}
else{
result = this.getJdbcTemplate().queryForRowSet(sql);
} Map<String,String> map = new HashMap<String,String>();
for(DBColumnInfo vo : clist ){
map.put(vo.getName(), vo.getName());
} while(result.next()){
Object temp = BeanReflectionUtil.newInstance(bean.getClass().getName());
for(Field field : fields){
if(map.get(field.getName())!=null){
field.setAccessible(true);
field.set(temp, result.getObject(field.getName()));
}
}
list.add(temp);
}
} catch (Exception e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
return list.get(0);
}
else {
return null;
}
} /**
* 根据对象ID得出数据
*/
public Object getBeanById(Object bean) {
Object temp = null;
boolean isexist = false;
try {
temp = BeanReflectionUtil.newInstance(bean.getClass().getName());
Object tableName = AnnotationParse.getTableName(bean);
StringBuffer where = new StringBuffer();
List<DBColumnInfo> list = AnnotationParse.getDBColumn(bean);
for(DBColumnInfo vo : list ){
if(vo.isPrimary()){
where.append(" and ").append( vo.getName()+"='").append(BeanReflectionUtil.getPrivatePropertyValue(bean, vo.getName())).append("'");
}
}
String sql = "select * from "+tableName+ " where "+ where.toString().substring(4);
//// log.info("getObjectById: "+sql); SqlRowSet result = this.getJdbcTemplate().queryForRowSet(sql);
Field[] fields = BeanReflectionUtil.getBeanDeclaredFields(bean.getClass().getName());
Map<String,String> map = new HashMap<String,String>();
Set<String> set = new HashSet<>();
for(DBColumnInfo vo : list ){
map.put(vo.getName(), vo.getName());
}
while(result.next()){
isexist = true;
for(Field field : fields){
//表字段存在才有意义
if(map.get(field.getName())!=null){
field.setAccessible(true);
field.set(temp, result.getObject(field.getName()));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
if(isexist){
return temp;
}
return null;
} /**
* 根据sql语句和类型返回对应的对象,不管sql语句能查出多少条记录 都取 第一条
*/
@Override
public <T> T getBean(String sql, Class<T> bean) {
// TODO Auto-generated method stub
return (T) new BeanHandlerImpl().convert(this.getJdbcTemplate().queryForRowSet(sql), bean);
} /**
* 提供安全的sql查询方法,防止 sql 注入攻击,不管条件sql语句能查出多少条记录 都取 第一条
*/
@Override
public <T> T getBean(String sql, Object[] params, Class<T> bean) {
return (T) new BeanHandlerImpl().convert(this.getJdbcTemplate().queryForRowSet(sql, params), bean);
} /**
* 根据一个实例对象 得到对应的数据数据,该操作会根据实例对象中的非空项进行where 查询
* 当全部项为空时使用 select * from tableName
* 取出全部数据
*/
@Override
public List getBeans(Object bean) {
return getBeans(bean, null);
} /**
* 根据一个实例对象 得到对应的数据数据,该操作会根据实例对象中的非空项进行where 查询
* 当全部项为空时使用 select * from tableName
* 取出对应分页的数据
*/
@Override
public List getBeans(Object bean, Page page) {
List<Object> list = new ArrayList<Object>();
try {
Field[] fields = BeanReflectionUtil.getBeanDeclaredFields(bean.getClass().getName());
Object tableName = AnnotationParse.getTableName(bean);
StringBuffer where = new StringBuffer();
List<Object> propertyValue = new ArrayList<Object>();
List<DBColumnInfo> clist = AnnotationParse.getDBColumn(bean);
for(DBColumnInfo vo : clist ){
Object o = BeanReflectionUtil.getPrivatePropertyValue(bean,vo.getName());
if(o!=null && !o.toString().equals("")){
if (vo.getLikeType() == null) {
where.append(" and ").append(vo.getName()).append(" =?");
propertyValue.add(o);
}
else {
where.append(" and ").append(vo.getName()).append(" like ? ");
if (vo.getLikeType() == LikeType.BEFORE) { // 前
propertyValue.add("%" + o);
}
else if (vo.getLikeType() == LikeType.BOTH ) { // 后
propertyValue.add("%" + o + "%");
}
else {
propertyValue.add(o + "%");
}
}
}
}
String sql = null;
SqlRowSet result = null;
//带条件的查询
if(propertyValue.size()>0){
sql = "select * from "+tableName+ " where "+ where.toString().substring(4);
}
else{
sql = "select * from "+tableName;
} // 添加分页
if(page !=null){
StringBuffer buffer = new StringBuffer();
buffer.append("select count(*) from (");
buffer.append(sql);
buffer.append(") a");
long pageTotal = this.getJdbcTemplate().queryForObject(buffer.toString(),propertyValue.toArray(),Long.class);
page.setTotalRows((int) pageTotal);
sql = sql+ " limit " + page.getOffset()+","+page.getLimit();
} if(propertyValue.size()>0){
result = this.getJdbcTemplate().queryForRowSet(sql,propertyValue.toArray());
}
else{
result = this.getJdbcTemplate().queryForRowSet(sql);
} Map<String,String> map = new HashMap<String,String>();
for(DBColumnInfo vo : clist ){
map.put(vo.getName(), vo.getName());
} while(result.next()){
Object temp = BeanReflectionUtil.newInstance(bean.getClass().getName());
for(Field field : fields){
if(map.get(field.getName())!=null){
field.setAccessible(true);
field.set(temp, result.getObject(field.getName()));
}
}
list.add(temp);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
} /**
* 根据sql语句和类型返回对应的对象,取出全部数据
*/
@Override
public <T> List<T> getBeans(String sql, Class<T> bean) {
return new BeansHandlerImpl().convert(this.getJdbcTemplate().queryForRowSet(sql), bean);
} /**
* 根据sql语句和类型返回对应的对象,取出对应分页的数据
*/
@Override
public <T> List<T> getBeans(String sql, Class<T> bean, Page page) {
if(page !=null){
StringBuffer buffer = new StringBuffer();
buffer.append("select count(*) from (");
buffer.append(sql);
buffer.append(") a");
long pageTotal = this.getJdbcTemplate().queryForObject(buffer.toString(), Long.class);
page.setTotalRows((int)pageTotal);
sql = sql+ " limit " + page.getOffset()+","+page.getLimit();
}
return new BeansHandlerImpl().convert(this.getJdbcTemplate().queryForRowSet(sql), bean);
} /**
* 根据sql语句和类型返回对应的对象,不管sql语句能查出多少条记录 都取 第一条
*/
@Override
public <T> List<T> getBeans(String sql, Object[] parsms, Class<T> bean) {
return new BeansHandlerImpl().convert(this.getJdbcTemplate().queryForRowSet(sql,parsms), bean);
} /**
* 提供安全的sql查询方法,防止 sql 注入攻击,
* 根据sql语句和类型返回对应的对象,取到分页的数据
*/
@Override
public <T> List<T> getBeans(String sql, Object[] parsms, Class<T> bean, Page page) {
// 添加分页
if(page !=null){
StringBuffer buffer = new StringBuffer();
buffer.append("select count(1) from (");
buffer.append(sql);
buffer.append(") a");
long pageTotal = this.getJdbcTemplate().queryForObject(buffer.toString(),parsms,Long.class);
page.setTotalRows((int) pageTotal);
sql = sql+ " limit " + page.getOffset()+","+page.getLimit();
}
return new BeansHandlerImpl().convert(this.getJdbcTemplate().queryForRowSet(sql,parsms), bean);
} /**
*
*/
@Override
public <T> T getSacle(String sql, Class<T> sacle) {
return getJdbcTemplate().queryForObject(sql, sacle);
} @Override
public <T> T getSacle(String sql, Object[] params, Class<T> sacle) {
return getJdbcTemplate().queryForObject(sql, params, sacle);
} /**
* 根据sql 语句和 分页信息得到数据,并将数据封装成一个 JSONARRAY
*/
public JSONArray getJSONArray(String sql,Page page) {
try {
//分页信息
if(page !=null){
StringBuffer buffer = new StringBuffer();
buffer.append("select count(*) from (");
buffer.append(sql);
buffer.append(") a");
long pageTotal = this.getJdbcTemplate().queryForObject(buffer.toString(), Long.class);
page.setTotalRows((int)pageTotal);
sql = sql+ " limit " + page.getOffset()+","+page.getLimit();
} logger.info("pageSql : " + sql);
JSONArray jArray = new JSONArray();
SqlRowSet sqlRowSet = this.getJdbcTemplate().queryForRowSet(sql); JsonArrayHandler jsonArrayHandler = new JsonArrayHandler();
return jsonArrayHandler.convert(sqlRowSet); } catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 安全的 添加参数
* 根据sql 语句和 分页信息得到数据,并将数据封装成一个 JSONARRAY
*/
public JSONArray getJSONArray(String sql,Object[] params,Page page) {
try {
//分页信息
if(page !=null){
StringBuffer buffer = new StringBuffer();
buffer.append("select count(*) from (");
buffer.append(sql);
buffer.append(") a");
long pageTotal = this.getJdbcTemplate().queryForObject(buffer.toString(),params, Long.class);
page.setTotalRows((int)pageTotal);
sql = sql+ " limit " + page.getOffset()+","+page.getLimit();
} logger.info("pageSql : " + sql);
JSONArray jArray = new JSONArray();
SqlRowSet sqlRowSet = this.getJdbcTemplate().queryForRowSet(sql, params); JsonArrayHandler jsonArrayHandler = new JsonArrayHandler();
return jsonArrayHandler.convert(sqlRowSet); } catch (Exception e) {
e.printStackTrace();
}
return null;
} public JSONArray getJSONArray(Object bean,Page page,String column) { return null;
} /////////////////////////////////////////////////////////////////////////////////////////////////////// public int updateBean(Object bean) {
try {
Object tableName = AnnotationParse.getTableName(bean);
StringBuffer property = new StringBuffer();
StringBuffer where = new StringBuffer();
List<Object> propertyValue = new ArrayList<Object>();
List<DBColumnInfo> list = AnnotationParse.getDBColumn(bean);
for(DBColumnInfo vo : list ){
Object o = BeanReflectionUtil.getPrivatePropertyValue(bean, vo.getName());
if(vo.isPrimary()){
where.append(" and ");
where.append(vo.getName()+" = '").append(o).append("'");
// continue;
}
else if(o!=null ){
property.append(",").append(vo.getName()).append("=?");
propertyValue.add(o);
}
}
String sql = "update "+tableName+ " set " +property.toString().substring(1) +" where "+ where.toString().substring(5);
return this.getJdbcTemplate().update(sql, propertyValue.toArray());
} catch (Exception e) {
e.printStackTrace();
}
return 0;
} public int update(String sql) {
return this.getJdbcTemplate().update(sql);
} public int update(String sql, Object[] params) {
return this.getJdbcTemplate().update(sql, params);
} public int[] batch(String[] sqls) {
try {
return this.getJdbcTemplate().batchUpdate(sqls);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public int insert(Object bean) {
try {
Object tableName = AnnotationParse.getTableName(bean);
StringBuffer property = new StringBuffer();
StringBuffer value = new StringBuffer();
List<Object> propertyValue = new ArrayList<Object>();
List<DBColumnInfo> list = AnnotationParse.getDBColumn(bean); for(DBColumnInfo vo : list ){
// 主键
if(vo.isPrimary()){
//有赋值的不是自动增长的
Object o = BeanReflectionUtil.getPrivatePropertyValue(bean, vo.getName());
if(o!=null){
property.append(",").append(vo.getName());
value.append(",").append("?");
propertyValue.add(o);
}
continue;
}
// 不为null
Object o = BeanReflectionUtil.getPrivatePropertyValue(bean, vo.getName());
if(o!=null){
property.append(",").append(vo.getName());
value.append(",").append("?");
propertyValue.add(o);
}
} String sql = "insert into "+tableName+ "("+property.toString().substring(1)+") values("+value.toString().substring(1)+")";
return this.getJdbcTemplate().update(sql, propertyValue.toArray());
} catch (Exception e) {
e.printStackTrace();
}
return 0;
} @Override
public int delete(Object bean) {
try {
Object tableName = AnnotationParse.getTableName(bean);
StringBuffer where = new StringBuffer(" 1=1 ");
List<DBColumnInfo> list = AnnotationParse.getDBColumn(bean);
for(DBColumnInfo vo : list ){
if(vo.isPrimary()){
where.append(" and ").append( vo.getName() +"='").append(BeanReflectionUtil.getPrivatePropertyValue(bean, vo.getName())).append("'");
}
} String sql = "delete from "+tableName+ " where "+ where.toString();
/*// log.info("delete: "+sql);*/
return this.getJdbcTemplate().update(sql); } catch (Exception e) {
e.printStackTrace();
//// log.error(StringUtil.outputException(e));
}
return 0;
} public int deleteAll(Object bean) {
try {
Object tableName = AnnotationParse.getTableName(bean);
String sql = "delete from "+tableName;
return this.getJdbcTemplate().update(sql);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
} public JdbcTemplate getTemplate() {
return this.getJdbcTemplate();
} public int[] batch(String sql, List<Object[]> params) {
// TODO Auto-generated method stub
return this.getJdbcTemplate().batchUpdate(sql, params);
} }

java使用注解和反射打造一个简单的jdbc工具类的更多相关文章

  1. springboot使用自定义注解和反射实现一个简单的支付

    优点: 未使用if else,就算以后增加支付类型,也不用改动之前代码 只需要新写一个支付类,给添加自定义注解@Pay 首先: 定义自定义注解 Pay 定义 CMBPay ICBCPay 两种支付 根 ...

  2. 一个简单的Hibernate工具类HibernateUtil

    HibernateUtil package com.wj.app.util; import org.hibernate.Session; import org.hibernate.SessionFac ...

  3. 【Java】利用注解和反射实现一个"低配版"的依赖注入

    在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...

  4. 使用Java元注解和反射实现简单MVC框架

    Springmvc的核心是DispatcherServlet来进行各种请求的拦截,进而进行后续的各种转发处理.流程图如下: 说明:客户端发出一个http请求给web服务器,web服务器对http请求进 ...

  5. Java基于注解和反射导入导出Excel

    代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...

  6. [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)

    一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...

  7. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

  8. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)

    http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...

  9. Java之注解与反射

    Java之注解与反射 注解(Annotation)简介 注解(Annotation)是从JDK5.0引入的新技术 Annotation作用:注解(Annotation)可以被其他程序如编译器等读取 A ...

随机推荐

  1. WEB服务器6--IIS架构补充篇

    第一部分我将谈谈IIS的两个不同的版本—IIS 5.x 和 IIS 6的处理模型:IIS如何监听来自外界的Http request,如何根据ISAPI Extension Mapping将对于不同Re ...

  2. C#使用DirectoryEntry操作IIS创建网站和虚拟路径

    原文:http://www.cnblogs.com/Aiooioo/archive/2011/05/30/cs-iis.html 在.Net中我们可以使用内置的类DirectoryEntry来承载II ...

  3. ArcGIS10.3.1于2015年6月发布

    http://www.esrichina.com.cn/sectorapplication/ArcGIS%2010.3/index.html

  4. 1203.2——条件语句 之 switch语句

    用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况.例如,输入一个整数,输出该整数对应的星期几的英文表示: #include < ...

  5. 系统简单的UIImagePickerController

    1.从系统相册中读取 /* 判断选择的读取类型是否支持 UIImagePickerControllerSourceTypePhotoLibrary,普通相册 UIImagePickerControll ...

  6. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  7. cocos2d-x创建工程批处理

    cd /d D:\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\project-creator create_project.py -project %1 -packag ...

  8. JOSN的stringify()和parse()方法

    JOSN的stringify()和parse()方法使用,stringify()把对象序列化,parse()把JSON字符串解析为js对象 <script> var book = { ti ...

  9. 基于cygwin构建u-boot(一)环境搭建

    从本文开始,更系统的描述基于cygwin构建u-boot. 之前<痛苦的版本对齐>系列,对于cygwin环境下Sourcery CodeBench,u-boot-1.1.6的构建有侧面的说 ...

  10. Ancient Printer(tire树)

    Ancient Printer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...