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对象的更多相关文章

  1. JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中

    处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...

  2. 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类

    字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入  a');up ...

  3. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  4. ADO.NET(完整修改和查询、实体类,数据访问类)

    一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...

  5. ADO.NET 【实体类】【数据访问类】

    认识分层结构,分层式结构是最常见,也是最重要的一种结构. 三层架构(3-tier architecture) 界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回, ...

  6. C# 通用数据访问类(SqlHelper)

    [转]C# 通用数据访问类(SqlHelper) 注:本文转自http://www.tzwhx.com/newOperate/html/3/31/312/13080.htmlVisual C# 动态操 ...

  7. ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)

    ADO.NET(一) 空间   ADO.NET结构 命名空间(车延禄)System.Data—— 所有的一般数据访问类System.Data.Common—— 各个数据提供程序共享(或重写)的类Sys ...

  8. 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

    开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...

  9. C#-ade.net-实体类、数据访问类

    实体类.数据访问类 是由封装演变而来,使对数据的访问更便捷,使用时只需要调用即可,无需再次编写代码 实体类是按照数据库表的结构封装起来的一个类 首先,新建文件夹 App_Code ,用于存放数据库类等 ...

随机推荐

  1. ExtJS组件的xtype属性列表

    ExtJS的应用界面是由很多小部件组合而成的,这些小部件被称作“组件(Component)”,所有组件都是Ext.Component的子类,Ext.Component提供了生命周期管理包括初始化.渲染 ...

  2. 学习Logistic Regression的笔记与理解(转)

    学习Logistic Regression的笔记与理解 1.首先从结果往前来看下how logistic regression make predictions. 设我们某个测试数据为X(x0,x1, ...

  3. DNS-解析、劫持、污染

    DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工 ...

  4. #你好Unity3D#Hierarchy视图监听gameObject点击事件

    今天无意间又找到了个好方法     1 2 3 4 5 6 7 8 9 10 [InitializeOnLoadMethod] static void Start () {   Selection.s ...

  5. 拆分ABBYY FineReader 12文档的方法

    处理大量多页文档时,通常都会首先扫描所有文档,然后才进行分析和识别.但是,要正确保留每个纸质文档的原始格式,ABBYY FineReader 12必须将每个文档作为单独 FineReader 文档进行 ...

  6. request.getParameter与request.getAttribute()

    这里就request为例,不去考虑session. request对象是javax.servlet.http.HttpServletRequest接口的一个实例,request表示调用JSP页面的请求 ...

  7. OpenJudge计算概论-整数奇偶排序

    /*===================================== 整数奇偶排序 总时间限制: 1000ms 内存限制: 65536kB 描述 输入10个整数,彼此以空格分隔 重新排序以后 ...

  8. HTTP接口功能自动化测试入门

    无论是浏览器上运行的Web应用还是移动端的H5应用,都离不开HTTP接口.Web应用通常是分为前后台开发的,后台提供接口调用返回Json对象,前台使用JS框架去加载后台返回的Json.而H5页面动态获 ...

  9. SQL集合运算参考及案例(二):树形节点数量逐级累计汇总

    问题描述: 我们经常遇到这样一个问题,类似于面对一个树形结构的物料数据,需要将库存中每一种物料数量汇总到物料上展示出来:或者说组织机构是一棵树,我们需要统计每一个节点上的人员数量(含下级节点的累计数量 ...

  10. hadoop(四):配置参数

    hadoop参数配置,主要是配置 core-site.xml,hdfs-site.xml,mapred-site.xml 三个配置文件,core-site.xml是全局配置,hdfs-site.xml ...