java实现从实体到SQL语句的转换(二)
前面写过一篇生成insert语句的博客,今天把CRUD的都完善了一下,需要的上次写的获取实体信息的类,这里就不贴出来了【点击打开查看】
下面是完整的代码:
package tan.code.utils; import java.util.List;
import java.util.Map; /**
* 简单的SQL语句拼装类 ;要求数据库表名及列命和实体保持一致;
*
* @author Mr_Tank_
*
* @param <T>
*/
public class SQLStringHelper<T> { private EntityHelper entityHelper = new EntityHelper(); /**
* 根据传入的实体生成Insert SQL語句
*
* @param entity
* @return 拼接好的sql语句
*/
@SuppressWarnings("unchecked")
public String createInsert(T entity) {
String sql = "Insert into ";
String column = ""; // 列
String c_values = ""; // 列值
List<Map<String, Object>> list = entityHelper.getFiledsInfo(entity);
sql += list.get(0).get("obj_name").toString() + " ";
for (int i = 0; i < list.size(); i++) { // 約定id在數據庫自動生成-20130807 if (String.valueOf(list.get(i).get("f_name")).equals("id")) {
i++;
} else if (list.get(i).get("f_value") != null) {
column += list.get(i).get("f_name") + ",";
c_values += "'" + list.get(i).get("f_value") + "',";
} }
sql += "(" + column.substring(0, column.length() - 1) + ") values ("
+ c_values.substring(0, c_values.length() - 1) + ");"; return sql; } /**
* 拼裝Delete SQL語句
*
* @param entity
* @param id
* 实体id
* @return
*/
@SuppressWarnings("unchecked")
public String createDelete(T entity, int id) {
String sql = "delete from ";
List<Map<String, Object>> list = entityHelper.getFiledsInfo(entity);
sql += list.get(0).get("obj_name").toString() + " where id=" + id + ";";
return sql;
} /**
* 查找
*
* @param entity
* @return
*/
@SuppressWarnings("unchecked")
public String createSelect(T entity) {
String sql = "select * from ";
String column = ""; // 列
List<Map<String, Object>> list = entityHelper.getFiledsInfo(entity);
sql += list.get(0).get("obj_name").toString() + " where ";
for (int i = 0; i < list.size(); i++) { // 約定id在數據庫自動生成-20130807 // id計數不能從0開始
// 如果知道id直接根据id生成sql语句就可以了
if (String.valueOf(list.get(i).get("f_name")).equals("id")
&& !String.valueOf(list.get(i).get("f_value")).equals("0")) {
sql += "id=" + list.get(i).get("f_value");
return sql;
} else if (list.get(i).get("f_value") != null) { column += list.get(i).get("f_name") + " like %"
+ list.get(i).get("f_value") + "% or ";
}
}
return sql += column.substring(0, column.length() - 4) + ";"; } /**
* 根据id更新实体数据
*
* @param entity
* @param id
* 实体id
* @return 拼装好的 Update SQL语句
*/
@SuppressWarnings("unchecked")
public String createUpdate(T entity, int id) {
String sql = "update ";
String column = ""; // 列
List<Map<String, Object>> list = entityHelper.getFiledsInfo(entity);
sql += list.get(0).get("obj_name").toString() + " set ";
for (int i = 0; i < list.size(); i++) { // id不能修改
if (String.valueOf(list.get(i).get("f_name")).equals("id")) {
i++;
} else if (list.get(i).get("f_value") != null) {
column += list.get(i).get("f_name") + "='"
+ list.get(i).get("f_value")+"',";
} }
return sql +=column.substring(0, column.length()-1) + " where id='" + id+"'"; }
}
测试【其中可以使用任意实体类替代测试代码里面的的Tutor类】:
@Test
public void test() {
// fail("Not yet implemented");
Tutor tutor = new Tutor();
tutor.setId(3);
//tutor.setTitle("寻找一個初三物理長期家教");
tutor.setProvince("广西壮族自治区");
tutor.setCity("桂林");
tutor.setRegion("朝阳区");
//tutor.setPatriarch("王先生");
tutor.setPhone("139772109981");
tutor.setGrade("初三");
tutor.setSubject("物理");
tutor.setPay(50); SQLStringHelper<Tutor> sqlStringHelper = new SQLStringHelper<Tutor>();
System.out.println(sqlStringHelper.createInsert(tutor));
System.out.println(sqlStringHelper.createDelete(tutor, 1));
System.out.println(sqlStringHelper.createSelect(tutor));
System.out.println(sqlStringHelper.createUpdate(tutor, 2));
}
测试结果:
Insert into Tutor (subject,grade,pay,phone,browse,province,city,region,wb_num) values ('物理','初三','50.0','139772109981','0','广西壮族自治区','桂林','朝阳区','0');
delete from Tutor where id=1;
select * from Tutor where id=3
update Tutor set subject='物理',grade='初三',pay='50.0',phone='139772109981',browse='0',province='广西壮族自治区',city='桂林',region='朝阳区',wb_num='0' where id='2'
以上只是本人的一些尝试,如有不足之处,请指出。
java实现从实体到SQL语句的转换(二)的更多相关文章
- java实现从实体到SQL语句的转换
使用过Hibernate,EF之类的ORM框架都知道一般的CRUD之类的简单操作,只要调用框架封装好了的方法,框架就自动生成相应的SQL语句了,参照实习公司给的代码,那个是C#版的,今天弄了一下jav ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- SqlServer数据库表生成C# Model实体类SQL语句——补充
在sql语句最前边加上 use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html --[SQL骚操作]SqlServer数据库表生成C ...
- 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)
常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...
- Java下拼接运行动态SQL语句
mod=viewthread&tid=3039" target="_blank">Java拼接动态SQL的一般做法有 1.使用动态语句 非常多数 ...
- Java下拼接执行动态SQL语句(转)
在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...
- SQL语句汇总(二)——数据修改、数据查询
SQL语句第二篇,不说废话直接开始吧. 首先创建一张表如下,创建表的方法在上篇介绍过了,这里就不再赘述. 添加新数据: INSERT INTO <表名> (<列名列表>) VA ...
- SQL语句学习(二)
为一张表添加外键: 这里我们希望再建一张订单的表为t_order,包含order_id,customer_id和price: ) NOT NULL auto_increment PRIMARY KEY ...
- java for循环里面执行sql语句操作,有效结果只有一次,只执行了一次sql mybatis 循环执行update生效一次 实际只执行一次
java后台controller中,for循环执行数据库操作,但是发现实际仅仅执行了一次,或者说提交成功了一次,并没有实际的个数循环 有可能是同一个对象导致的 可以仔细看一下下面两段代码有什么区别 p ...
随机推荐
- Mac 让 iTerm2 记住用户名密码 expect 脚本
刚刚用iTerm2的时候,总是要一遍遍的敲用户名.密码. 我在想, 能不能像Windows的软件一样,可以直接让软件记住.然后只要点击一下,就直接ssh到远程服务器上面去了. 之后经过搜索,可以用ex ...
- [HDU 4666]Hyperspace[最远曼哈顿距离][STL]
题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...
- js 获取前天、昨天、今天、明天、后天的时间
js 获取前天.昨天.今天.明天.后天的时间 2011-05-19 21:03 <html><head><meta http-equiv="Content- ...
- spring注解controller示例
依赖库 spring 3.0 配置web.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <w ...
- Bug驱动开发(Bug-driven development)
说实话,作为一个Domino开发者,像測试驱动开发(Test-driven development).功能驱动开发(Feature-driven development)之类软件开发的高大上的方法论( ...
- 令人作呕的OpenSSL
在OpenSSL心脏出血之后,我相信非常多人都出了血,而且流了泪...网上瞬间出现了大量吐嘈OpenSSL的文章或段子,仿佛内心的窝火一瞬间被释放了出来,跟着这场疯闹,我也吐一下嘈,以雪这些年被Ope ...
- 感觉挺有意思的SQL题目
1.有如下数据,要求查询每个班最低分和最高分,并将最高分与最低分显示为同一列 ID Student CourseName Score1 张三 English 802 张三 Math 703 张三 Ch ...
- ajax不执行success回调而是执行了error回调
最近在看jQuery的API文档,在使用到jQuery的ajax时,如果指定了dataType为json,老是不执行success回调,而是执行了error回调函数. 附上代码如下: JScrip ...
- 对面向对象的理解—— SAP电面(1)
对于C++面向对象的理解 面向对象是在结构化设计方法出现很多问题的情况下应运而生的.结构化设计方法求解问题的基本策略是从功能的角度审视问题域.它将应用程序看成实现某些特定任务的功能模块,其中子过程是实 ...
- Properties的使用
Properties的各种相对路径,绝对路径的用法 所在包: package com.test.javaAPI.collections; import java.io.File; import jav ...