简单数据访问类,生成简单SQL,自动转换成java对象
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
public class SimpleQuery<T> { private static Logger logger = LoggerFactory.getLogger(SimpleQuery.class); private NamedParameterJdbcTemplate jdbcTemplate = ServiceFactory.getNamedParameterJdbcTemplate(); private SqlTemplate sqlTemplate; private Class<T> clazz; public SimpleQuery(Class<T> clazz) {
this.sqlTemplate = new SqlTemplate(clazz);
this.clazz = clazz;
} /**
* 查询所有
*
* @return
*/
public List<T> findAll() {
return queryForList(null);
} /**
* 使用SQL语句查询
* @param sql
* @param params
* @return
*/
public T queryForObject(String sql, Map<String, Object> params) {
MapSqlParameterSource sps = new MapSqlParameterSource(params);
try {
return jdbcTemplate.queryForObject(sql, sps, new BeanPropertyRowMapper<T>(this.clazz));
} catch (EmptyResultDataAccessException e) {
// 没有数据
logger.info("no result , params is {}", params);
}
return null;
} /**
* 查询数量
* @param params
* @return
*/
public int count(Map<String, Object> params) {
MapSqlParameterSource sps = new MapSqlParameterSource(params);
String sql = sqlTemplate.getCountSQL(params.keySet());
Integer count = jdbcTemplate.queryForObject(sql, sps, Integer.class);
return count;
} /**
* 根据查询条件查询
* @param params
* @return
*/
public T queryForObject(Map<String, Object> params) {
String sql = null;
if (params == null) {
sql = sqlTemplate.getSelectSQL();
} else {
sql = sqlTemplate.getSelectSQL(params.keySet());
}
// 拼接SQL语句
return queryForObject(sql, params);
} /**
* 根据对象ID查询
* @param id
* @return
*/
public T queryForObject(String id) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", id);
return queryForObject(params);
} /**
* 根据一堆参数查询
* @param params
* @return
*/
public List<T> queryForList(Map<String, Object> params) {
String sql = null;
if (params == null) {
sql = sqlTemplate.getSelectSQL();
} else {
sql = sqlTemplate.getSelectSQL(params.keySet());
}
// 拼接SQL语句
return queryForList(sql, params);
} /**
* 根据一堆参数和自定义的SQL语句查询
* @param sql
* @param params
* @return
*/
public List<T> queryForList(String sql, Map<String, Object> params) { try {
if (params != null && !params.isEmpty()) {
MapSqlParameterSource sps = new MapSqlParameterSource(params);
return jdbcTemplate.query(sql, sps, new BeanPropertyRowMapper<T>(this.clazz));
} else {
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(this.clazz));
}
} catch (EmptyResultDataAccessException e) {
// 没有数据
logger.info("no result , params is {}", params);
}
return null;
} /**
* 根据命名SQL ID 查询数据
*
* @param namingSqlID
* @param params
* @return
*/
public List<T> queryByNamingSQL(String namingSqlID, Map<String, Object> params) { String sql = NamingSqlUtil.getNamingSqlById(namingSqlID); if (sql == null) {
logger.info("error to get naming sql , id = {} ", namingSqlID);
}
// 拼接SQL语句
return queryForList(sql, params);
} /**
* 根据ID删除一个元素
*
* @param id
* @return
*/
public int delete(String id) {
String sql = sqlTemplate.getDeleteSQL();
MapSqlParameterSource sps = new MapSqlParameterSource("id", id);
return jdbcTemplate.update(sql, sps);
} /**
* 插入一个元素
*
* @param entity
* @return
*/
private int insert(T entity) {
if (entity instanceof BaseEntity) {
BaseEntity entity1 = (BaseEntity) entity;
entity1.setId(null);
}
String sql = sqlTemplate.getInsertSQL();
SqlParameterSource sps = new BeanPropertySqlParameterSource(entity);
return jdbcTemplate.update(sql, sps);
} /**
* 保存或更新一个元素
*
* @param entity
* @param params
* 确保一条数据的参数
* @return
*/
public int saveOrUpdate(T entity, Map<String, Object> params) {
T object = this.queryForObject(params);
if (object == null) {
return insert(entity);
} else {
if (object instanceof BaseEntity) {
BaseEntity object1 = (BaseEntity) object;
String id = object1.getId();
delete(id);
}
return insert(entity);
}
} }
import java.lang.reflect.Field;
import java.util.Collection; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SqlTemplate { private static Logger logger = LoggerFactory.getLogger(SqlTemplate.class); public final static String TABLE_PREFIX = "t"; private String tableName = ""; /**
* 如果使用多Schema模式可以使用此参数
*/
private String schemaPrefix = ""; /**
* 实体类对应的字段名
*/
private String[] fieldNames; /**
* 数据库表对应的字段名称
*/
private String[] dbFieldNames; /**
* 构造函数,解析类名,字段名,生成对应数据库中的表名和字段名
* @param clazz
*/
public SqlTemplate(Class<?> clazz) { // 获取有get方法的字段
Field[] fields = ObjectUtil.getObjectFields(clazz); int fieldsLength = fields.length; fieldNames = new String[fieldsLength]; dbFieldNames = new String[fieldsLength]; for (int i = 0; i < fieldsLength; i++) {
Field f = fields[i];
String fieldName = f.getName();
fieldNames[i] = fieldName;
dbFieldNames[i] = StringUtil.camelToUnderline(fieldName);
} String clazzName = clazz.getSimpleName(); // 数据库表名
tableName = schemaPrefix + StringUtil.camelToUnderline(TABLE_PREFIX + clazzName); } public String getInsertSQL() {
// 拼SQL语句
StringBuffer sql = new StringBuffer();
sql.append("INSERT INTO ");
sql.append("" + tableName + "");
sql.append(" (");
for (int i = 0; i < dbFieldNames.length; i++) {
sql.append("" + dbFieldNames[i] + "");
if (i < dbFieldNames.length - 1) {
sql.append(",");
}
}
sql.append(") ");
sql.append(" VALUES(");
for (int i = 0; i < fieldNames.length; i++) {
String fieldName = fieldNames[i];
sql.append(":" + fieldName);
if (i < fieldNames.length - 1) {
sql.append(",");
}
}
sql.append(") ");
return sql.toString();
} public String getUpdateSQL() {
// 拼SQL语句
StringBuffer sql = new StringBuffer();
sql.append("UPDATE ");
sql.append("" + tableName + "");
sql.append(" SET ");
for (int i = 1; i < dbFieldNames.length; i++) {
String dbFieldName = dbFieldNames[i];
String fieldName = fieldNames[i]; sql.append(dbFieldName);
sql.append("=:" + fieldName); if (i < dbFieldNames.length - 1) {
sql.append(",");
}
}
sql.append(" WHERE ");
sql.append(" id ");
sql.append("=:id");
return sql.toString();
} public String getCountSQL(Collection<String> where){
String[] whereArray = toStringArray(where);
return getCountSQL(whereArray);
} public String getCountSQL(String[] where){
StringBuffer sql = new StringBuffer();
sql.append("SELECT count(0) FROM ");
sql.append("" + tableName + "");
sql.append(toWhereSQL(where));
return sql.toString();
} public String getSelectSQL() {
// 拼SQL语句
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM ");
sql.append("" + tableName + "");
return sql.toString();
} public String getSelectSQL(Collection<String> where) { if (where != null && !where.isEmpty()) { String[] whereArray = toStringArray(where); return getSelectSQL(whereArray);
} else {
return getSelectSQL();
}
} public String getSelectSQL(String[] where) {
// 拼SQL语句
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM ");
sql.append("" + tableName + ""); // 如果有where条件
sql.append(toWhereSQL(where)); return sql.toString();
} public String getDeleteSQL() {
// 拼SQL语句
StringBuffer sql = new StringBuffer();
sql.append("DELETE FROM ");
sql.append("" + tableName + "");
sql.append(" WHERE ");
sql.append(" id ");
sql.append("=:id");
return sql.toString();
} public String getDeleteSQL(String[] where) {
// 拼SQL语句
StringBuffer sql = new StringBuffer();
sql.append("DELETE FROM ");
sql.append("" + tableName + ""); if (where != null && where.length > 0) {
sql.append(toWhereSQL(where));
} else {
sql.append(" WHERE ");
sql.append(" id ");
sql.append("=:id");
} return sql.toString();
} private String getDbFieldName(String fieldName) {
for (int i = 0; i < fieldNames.length; i++) {
String fName = fieldNames[i];
if (fieldName.equals(fName)) {
return dbFieldNames[i];
}
}
return null;
} public String toWhereSQL(String[] where) { StringBuffer sql = new StringBuffer(); if (where != null && where.length > 0) { sql.append(" WHERE "); for (int i = 0; i < where.length; i++) {
String w = where[i];
String dbFieldName = getDbFieldName(w); if (dbFieldName == null) {
logger.error("can not get the dbFieldName of {}", w);
return null;
} sql.append(" " + dbFieldName + " ");
sql.append("=:" + w); if (i < where.length - 1) {
sql.append(" and ");
}
}
} return sql.toString(); } private String[] toStringArray(Collection<String> where) {
if (where != null && !where.isEmpty()) {
String[] whereArray = new String[where.size()];
int i = 0;
for (String s : where) {
whereArray[i] = s;
i++;
}
return whereArray;
}
return null;
} public void setSchemaPrefix(String schemaPrefix) {
this.schemaPrefix = schemaPrefix;
}
}
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.bind.JAXBException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.springframework.util.StringUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class NamingSqlUtil { private static final Map<String, String> SQL_MAP = new HashMap<String, String>(); private static final List<String> NAMING_SQL_FILES = new ArrayList<String>(); static {
NAMING_SQL_FILES.add("contacts-naming-sql.xml");
} public static String getNamingSqlById(String namingSqlId) {
return SQL_MAP.get(namingSqlId);
} public static void loadNamingSql() {
for (String fileName : NAMING_SQL_FILES) {
loadNamingSql(fileName);
}
} private static void loadNamingSql(String fileName) { Enumeration<URL> urls = null;
try {
urls = NamingSqlUtil.class.getClassLoader().getResources(fileName);
} catch (IOException e1) {
e1.printStackTrace();
} while (urls.hasMoreElements()) {
URL url = urls.nextElement();
try {
loadNamingSql(url);
} catch (JAXBException | ParserConfigurationException | URISyntaxException | SAXException | IOException e) {
e.printStackTrace();
}
} } private static void loadNamingSql(URL url) throws JAXBException, ParserConfigurationException, URISyntaxException, SAXException, IOException { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); File file = new File(url.toURI()); Document document = db.parse(file); NodeList list = document.getElementsByTagName("sql"); for (int i = 0; i < list.getLength(); i++) {
Element element = (Element) list.item(i); String id = element.getAttribute("id"); String sqlContent = element.getFirstChild().getNodeValue(); if (!StringUtils.isEmpty(sqlContent)) {
SQL_MAP.put(id, sqlContent.trim());
}
}
} }
简单数据访问类,生成简单SQL,自动转换成java对象的更多相关文章
- JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中
处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...
- 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类
字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入 a');up ...
- DataAccess通用数据库访问类,简单易用,功能强悍
以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...
- ADO.NET(完整修改和查询、实体类,数据访问类)
一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...
- ADO.NET 【实体类】【数据访问类】
认识分层结构,分层式结构是最常见,也是最重要的一种结构. 三层架构(3-tier architecture) 界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回, ...
- C# 通用数据访问类(SqlHelper)
[转]C# 通用数据访问类(SqlHelper) 注:本文转自http://www.tzwhx.com/newOperate/html/3/31/312/13080.htmlVisual C# 动态操 ...
- ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)
ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄)System.Data—— 所有的一般数据访问类System.Data.Common—— 各个数据提供程序共享(或重写)的类Sys ...
- 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)
开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...
- C#-ade.net-实体类、数据访问类
实体类.数据访问类 是由封装演变而来,使对数据的访问更便捷,使用时只需要调用即可,无需再次编写代码 实体类是按照数据库表的结构封装起来的一个类 首先,新建文件夹 App_Code ,用于存放数据库类等 ...
随机推荐
- JS数组随机排序
var arr=[1,2,3,4,5]; arr.sort(function(a,b){ var v=Math.random()>0.5?1:-1; console.log(a,b,v); re ...
- java多线程:jdk并发包的总结(转载)
转载地址:http://blog.csdn.net/yangbutao/article/details/8479520 1.java 高并发包所采用的几个机制(CAS,volatile,抽象队列同步) ...
- git checkout 和 git checkout --merge <branch_name>使用
一.git checkout //查看当前分支$ git branch master *t2 testing //checkout会覆盖当前工作区文件和覆盖暂存区内容,所以发现分支有未提交的警告,执行 ...
- jquery.ajaxfileupload.js
jquery.ajaxfileupload.js上传插件,利用iframe提交不刷新页面功能完成. /* // jQuery Ajax File Uploader // // @author: Jor ...
- RedHat Linux下利用sersync进行实时同步数据
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linux5588.blog.51cto.com/65280/772054 拓扑图 ...
- unity, 搜索组件
Hierarchy的搜索栏中既可以搜节点名,也可以搜组件名.
- 如何面试程序员 zhuan zai
zhuan zai http://blog.csdn.net/cuibo1123/article/details/41931909aia 面试对于大多数开发人员来说是一项很基本的技能.一次失败的招聘 ...
- hadoop spark学习笔记
http://www.csdn.net/article/2015-06-08/2824889 hive:是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sq ...
- Java OCR 图像智能字符识别技术,可识别中文
http://www.open-open.com/lib/view/open1363156299203.html
- selenium+python自动化之xpath定位
在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. 什么是 ...