JDBC通用DAO
dbcBaseDao接口,内容如下:
package com.sun4j.core.jdbc.dao; import java.io.Serializable;
import java.util.List;
import java.util.Map; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet; public interface JdbcBaseDao<T> { void save(T entity); void update(T entity); void delete(T entity); void delete(Serializable id); void deleteAll(); T findById(Serializable id); List<T> findAll(); void batchDelete(Serializable[] ids); void batchUpdate(List<T> list); void batchSave(List<T> list); Map<String, Object> findOne(String sql, Object... args); List<Map<String, Object>> findListMap(String sql, Object... args); void execSQL(String sql); SqlRowSet rowSet(String sql, Object... args); JdbcTemplate getJdbcTemplate(); }
JdbcBaseDaoImpl 实现
package com.sun4j.core.jdbc.dao.impl; import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.util.Assert; import com.sun4j.core.jdbc.dao.JdbcBaseDao; public class JdbcBaseDaoImpl<T> implements JdbcBaseDao<T> {
public static final String SQL_INSERT = "insert";
public static final String SQL_UPDATE = "update";
public static final String SQL_DELETE = "delete";
@Autowired
private JdbcTemplate jdbcTemplate; private Class<T> entityClass; @SuppressWarnings("unchecked")
public JdbcBaseDaoImpl() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
entityClass = (Class<T>) type.getActualTypeArguments()[0];
System.out.println("Dao实现类是:" + entityClass.getName());
} @Override
public void save(T entity) {
String sql = this.makeSql(SQL_INSERT);
Object[] args = this.setArgs(entity, SQL_INSERT);
int[] argTypes = this.setArgTypes(entity, SQL_INSERT);
jdbcTemplate.update(sql.toString(), args, argTypes);
} @Override
public void update(T entity) {
String sql = this.makeSql(SQL_UPDATE);
Object[] args = this.setArgs(entity, SQL_UPDATE);
int[] argTypes = this.setArgTypes(entity, SQL_UPDATE);
jdbcTemplate.update(sql, args, argTypes);
} @Override
public void delete(T entity) {
String sql = this.makeSql(SQL_DELETE);
Object[] args = this.setArgs(entity, SQL_DELETE);
int[] argTypes = this.setArgTypes(entity, SQL_DELETE);
jdbcTemplate.update(sql, args, argTypes);
} @Override
public void deleteAll() {
String sql = " TRUNCATE TABLE " + entityClass.getSimpleName();
jdbcTemplate.execute(sql);
} @Override
public void delete(Serializable id) {
String sql = " DELETE FROM " + entityClass.getSimpleName() + " WHERE id=?";
jdbcTemplate.update(sql, id);
} @Override
public void batchSave(List<T> lt) {
Assert.notEmpty(lt);
StringBuilder sb = new StringBuilder();
sb.append("insert into ").append(entityClass.getSimpleName().toLowerCase()).append("( ");
List<Object[]> params = new ArrayList<Object[]>();
String val = ""; for (T t : lt) {
int index = 0;
Field[] fields = t.getClass().getDeclaredFields();
if (fields != null && fields.length > 0) {
Object[] objVal = new Object[fields.length]; for (Field field : fields) {
try {
field.setAccessible(true);
Object obj = field.get(t);
if (params.size() == 0) {
sb.append(field.getName()).append(" ,");
val += ", ? ";
}
objVal[index++] = obj;
} catch (Exception e) {
e.printStackTrace();
}
}
params.add(objVal);
}
}
sb.deleteCharAt(sb.length() - 1);
val = val.substring(1);
sb.append(") value (").append(val).append(")");
String sql = sb.toString();
jdbcTemplate.batchUpdate(sql, params);
} @Override
public void batchUpdate(List<T> lt) {
Assert.notEmpty(lt);
StringBuilder sb = new StringBuilder();
sb.append("update ").append(entityClass.getSimpleName().toLowerCase()).append(" set ");
List<Object[]> params = new ArrayList<Object[]>();
Object primaryKey = "id";
for (T t : lt) {
int index = 0;
Field[] fields = entityClass.getDeclaredFields();
if (fields != null && fields.length > 0) {
Object id = null;
Object[] objVal = new Object[fields.length];
for (Field field : fields) {
try {
field.setAccessible(true);
Object obj = field.get(t);
if (field.getName().equalsIgnoreCase("id")) {
primaryKey = obj;
id = obj;
} else {
if (params.size() == 0) {
sb.append(field.getName()).append(" = ? ,");
}
objVal[index++] = obj;
}
} catch (Exception e) {
e.printStackTrace();
}
objVal[index] = id;
}
params.add(objVal);
}
}
sb.deleteCharAt(sb.length() - 1);
sb.append(" where ").append(primaryKey).append(" = ? ");
String sql = sb.toString();
jdbcTemplate.batchUpdate(sql, params);
} @Override
public T findById(Serializable id) {
String sql = "SELECT * FROM " + entityClass.getSimpleName() + " WHERE id=?";
RowMapper<T> rowMapper = BeanPropertyRowMapper.newInstance(entityClass);
return jdbcTemplate.query(sql, rowMapper, id).get(0);
} @Override
public List<T> findAll() {
String sql = "SELECT * FROM " + entityClass.getSimpleName();
RowMapper<T> rowMapper = BeanPropertyRowMapper.newInstance(entityClass);
return jdbcTemplate.query(sql, rowMapper);
} @Override
public Map<String, Object> findOne(String sql, Object... args) {
return jdbcTemplate.queryForMap(sql, args);
} @Override
public List<Map<String, Object>> findListMap(String sql, Object... args) {
return jdbcTemplate.queryForList(sql, args);
} @Override
public void execSQL(String sql) {
jdbcTemplate.execute(sql);
} @Override
public SqlRowSet rowSet(String sql, Object... args) {
return this.jdbcTemplate.queryForRowSet(sql, args);
} @Override
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
} /**
* 组装SQl
*
* @param entityClass
* @param sqlFlag
* @return
*/
public String makeSql(String sqlFlag) {
StringBuffer sql = new StringBuffer();
Field[] fields = entityClass.getDeclaredFields();
if (sqlFlag.equals(SQL_INSERT)) {
sql.append(" INSERT INTO " + entityClass.getSimpleName());
sql.append("(");
for (int i = 0; fields != null && i < fields.length; i++) {
fields[i].setAccessible(true); // 暴力反射
String column = fields[i].getName();
sql.append(column).append(",");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(") VALUES (");
for (int i = 0; fields != null && i < fields.length; i++) {
sql.append("?,");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(")");
} else if (sqlFlag.equals(SQL_UPDATE)) {
sql.append(" UPDATE " + entityClass.getSimpleName() + " SET ");
for (int i = 0; fields != null && i < fields.length; i++) {
fields[i].setAccessible(true); // 暴力反射
String column = fields[i].getName();
if (column.equals("id")) { // id 代表主键
continue;
}
sql.append(column).append("=").append("?,");
}
sql = sql.deleteCharAt(sql.length() - 1);
sql.append(" WHERE id=?");
} else if (sqlFlag.equals(SQL_DELETE)) {
sql.append(" DELETE FROM " + entityClass.getSimpleName() + " WHERE id=?");
}
System.out.println("SQL=" + sql);
return sql.toString();
} /**
* 设置参数
*
* @param entity
* @param sqlFlag
* @param entityClass
* @return
*/
public Object[] setArgs(T entity, String sqlFlag) {
Field[] fields = entityClass.getDeclaredFields();
if (sqlFlag.equals(SQL_INSERT)) {
Object[] args = new Object[fields.length];
for (int i = 0; args != null && i < args.length; i++) {
try {
fields[i].setAccessible(true); // 暴力反射
args[i] = fields[i].get(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
return args;
} else if (sqlFlag.equals(SQL_UPDATE)) {
Object[] tempArr = new Object[fields.length];
for (int i = 0; tempArr != null && i < tempArr.length; i++) {
try {
fields[i].setAccessible(true); // 暴力反射
tempArr[i] = fields[i].get(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
Object[] args = new Object[fields.length];
System.arraycopy(tempArr, 1, args, 0, tempArr.length - 1); // 数组拷贝
args[args.length - 1] = tempArr[0];
return args;
} else if (sqlFlag.equals(SQL_DELETE)) {
Object[] args = new Object[1]; // 长度是1
fields[0].setAccessible(true); // 暴力反射
try {
args[0] = fields[0].get(entity);
} catch (Exception e) {
e.printStackTrace();
}
return args;
}
return null;
} /**
* 设置参数类型(写的不全,只是一些常用的)
*
* @param entity
* @param sqlFlag
* @param entityClass
* @return
*/
public int[] setArgTypes(T entity, String sqlFlag) {
Field[] fields = entityClass.getDeclaredFields();
if (sqlFlag.equals(SQL_INSERT)) {
int[] argTypes = new int[fields.length];
try {
for (int i = 0; argTypes != null && i < argTypes.length; i++) {
fields[i].setAccessible(true); // 暴力反射
if (fields[i].get(entity).getClass().getName().equals("java.lang.String")) {
argTypes[i] = Types.VARCHAR;
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Double")) {
argTypes[i] = Types.DECIMAL;
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Integer")) {
argTypes[i] = Types.INTEGER;
} else if (fields[i].get(entity).getClass().getName().equals("java.util.Date")) {
argTypes[i] = Types.DATE;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return argTypes;
} else if (sqlFlag.equals(SQL_UPDATE)) {
int[] tempArgTypes = new int[fields.length];
int[] argTypes = new int[fields.length];
try {
for (int i = 0; tempArgTypes != null && i < tempArgTypes.length; i++) {
fields[i].setAccessible(true); // 暴力反射
if (fields[i].get(entity).getClass().getName().equals("java.lang.String")) {
tempArgTypes[i] = Types.VARCHAR;
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Double")) {
tempArgTypes[i] = Types.DECIMAL;
} else if (fields[i].get(entity).getClass().getName().equals("java.lang.Integer")) {
tempArgTypes[i] = Types.INTEGER;
} else if (fields[i].get(entity).getClass().getName().equals("java.util.Date")) {
tempArgTypes[i] = Types.DATE;
}
}
System.arraycopy(tempArgTypes, 1, argTypes, 0, tempArgTypes.length - 1); // 数组拷贝
argTypes[argTypes.length - 1] = tempArgTypes[0]; } catch (Exception e) {
e.printStackTrace();
}
return argTypes; } else if (sqlFlag.equals(SQL_DELETE)) {
int[] argTypes = new int[1]; // 长度是1
try {
fields[0].setAccessible(true); // 暴力反射
if (fields[0].get(entity).getClass().getName().equals("java.lang.String")) {
argTypes[0] = Types.VARCHAR;
} else if (fields[0].get(entity).getClass().getName().equals("java.lang.Integer")) {
argTypes[0] = Types.INTEGER;
} } catch (Exception e) {
e.printStackTrace();
}
return argTypes;
}
return null;
} @Override
public void batchDelete(Serializable[] ids) {
String idStr="";
for (int i = 0; i < ids.length; i++) {
idStr+=",'"+ids[i]+"'";
}
String sql = " DELETE FROM " + entityClass.getSimpleName() + " WHERE id in (?)";
jdbcTemplate.update(sql, idStr.charAt(1));
} }
通用的JdbcBaseService
package com.sun4j.core.jdbc.service; import java.io.Serializable;
import java.util.List;
import java.util.Map; public interface JdbcBaseService<T> { void save(T entity); void update(T entity); void delete(T entity); void delete(Serializable id); void deleteAll(); T findById(Serializable id); List<T> findAll(); void batchDelete(Serializable[] ids); void batchUpdate(List<T> list); void batchSave(List<T> list); Map<String, Object> findOne(Object... args); List<Map<String, Object>> findListMap(Object... args);
}
通用的JdbcBaseService实现
package com.sun4j.core.jdbc.service.impl; import java.io.Serializable;
import java.util.List;
import java.util.Map; import com.sun4j.core.jdbc.dao.JdbcBaseDao;
import com.sun4j.core.jdbc.service.JdbcBaseService; public abstract class JdbcBaseServiceImpl<T> implements JdbcBaseService<T> {
protected abstract JdbcBaseDao<T> jdbcDao(); @Override
public void save(T entity) {
jdbcDao().save(entity);
} @Override
public void update(T entity) {
jdbcDao().update(entity);
} @Override
public void delete(T entity) {
jdbcDao().delete(entity);
} @Override
public void delete(Serializable id) {
jdbcDao().delete(id);
} @Override
public void deleteAll() {
jdbcDao().deleteAll();
} @Override
public T findById(Serializable id) {
return jdbcDao().findById(id);
} @Override
public List<T> findAll() {
return jdbcDao().findAll();
} @Override
public void batchDelete(Serializable[] ids) {
jdbcDao().batchDelete(ids);
} @Override
public void batchUpdate(List<T> list) {
jdbcDao().batchUpdate(list);
} @Override
public void batchSave(List<T> list) {
jdbcDao().batchSave(list);
} @Override
public abstract Map<String, Object> findOne(Object... args); @Override
public abstract List<Map<String, Object>> findListMap(Object... args);
}
JDBC通用DAO的更多相关文章
- Java反射结合JDBC写的一个通用DAO
以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x
Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x ============================== 蕃薯耀 2018年 ...
- spring基于通用Dao的多数据源配置
有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断.这样的方式和资源文件冲突:扫描映射文件的话,Sql ...
- 关于mysql,需要掌握的基础(二):JDBC和DAO层
目录 关于mysql,需要掌握的基础(二):JDBC和DAO层 1.了解jdbc是什么? 2.加载注册驱动:为什么Class.forName("com.mysql.jdbc.Driver ...
- 使用mybatis完成通用dao和通用service
使用mybatis完成通用dao和通用service 概述: 使用通用dao和通用service可以减少代码的开发.可以将常用的增删改查放到通用dao中.对不同的or框架,基本上都有自己的实现如Spr ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
- 十六、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法
@NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.da ...
随机推荐
- Java Persistence with MyBatis 小结2
MyBatis 最关键的组成部分是 SqlSessionFactory,我们可以从中获取 SqlSession,并执行映射的 SQL 语句.SqlSessionFactory 对象可以通过基于 XML ...
- How To run OAI eNB (No S1) with USRP X310(1)
How To run OAI eNB (No S1) with USRP X310 1.Things need to be done 1.1 Install Ubuntu 14.04 1.1.1 In ...
- C语言的工具集
1. lint可以对c程序进行更加广泛的错误分析,lint不是缩写,它的命名是因为它像在程序中“吹毛求疵”,现在许多linux发行版都包括了它的增强版splint(Secure Programming ...
- OGNL表达式的基本语法和用法
首先我们一起来看一下OGNL中的#.%和$符号. 关于OGNL各种用法总结参看:http://blog.163.com/seara520@126/blog/static/720693042010320 ...
- js prototype 理解
简单理解:prototype对象是实现面向对象的一个重要机制.每个函数也是一个对象,它们对应的类就是 function,每个函数对象都具有一个子对象prototype.Prototype 表示了该函数 ...
- python模块之codecs: 自然语言编码转换
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理. 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部 ...
- groupBox和panel
private void Form1_Load(object sender, EventArgs e) { groupBox1.Text = "信息表"; panel1.Borde ...
- JVM调优浅谈(转)
1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...
- svn:ignore 的用处
用svn管理代码,一直以来都受到一件不爽事情的困扰: 1)有些文件或文件夹不想在commit的时候看到,虽然他们是non-versioned,比如*.bak.*.class,*.scc(vss文件), ...
- mui区域滚动条
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...