马上年底了.收到一个任务,是同事升级jdk版本的时候hibernate包出现了一些问题.为了填这个坑.想把hibernate下掉.因为我比较闲.所以让我改造.可耻的是,当我下载下代码的时候.项目二三十各类报错.还带这样子的啊.代码报错竟然还提交;不过身在江湖身不由己,我只改我需要改的地方算了.
项目中用啊哦了hibernate.jdbctemplate.ibatis,mybatis.看了下代码.发现来一个人用一种框架.这个项目能跑起来真的难为以前的同事了,因为用hibernate就是做单表操作了,所以我需要修改单表的操作.
首先,这时候我要是再引入tkmybatis或者mybatisplus或者sping-data-jpa是可以很容易处理问题.不过我想了想还是算了.我加入新的框架.然后后面用的时候同事也能不用,毕竟要用早用了.我就自己改吧, 不过技术原因,并且自己是第一次接触jdbctemplate,所以我只封装了单表的增删改,对于查询,由于以前的同事又用了mybatis进行查询.所以我也没有深入查看
因为hibernate上的实体都有@Id @Column @Table这些注解.那么我就在这些注解的基础上改造<由于原代码是注解在get方法上,如果在成员变量上.下面的代码需要对应修改>
1.先封装了几个公用的类.用于获取表名字,字段的值
/**
* 获取实体类对应的表名
* @param t
* @param <T>
* @return
*/
public static <T> String getTableName(T t){
Table annotation = t.getClass().getAnnotation(Table.class);
if (annotation == null) {
return null;
}
return annotation.name();
}
/**
* 默认不获取id
* @param t
* @param <T>
*/
public static <T> List<NameValuePair> getFieldMap(T t) {
return getFieldMap(t, false);
}
/**
* 将实体类中按照数据库的 字段 : 值 返回
* @param t
* @param containId 是否将id也放进去
* @param <T>
* @return
*/
public static <T> List<NameValuePair> getFieldMap(T t, Boolean containId){
List<NameValuePair> result = new ArrayList<NameValuePair>();
Method[] methods = t.getClass().getMethods();
for (Method method : methods) {
String name = method.getName();
if (!name.startsWith("get")) {
continue;
}
if(!containId){
Id idAnnotation = method.getAnnotation(Id.class);
if (idAnnotation != null) {
continue;
}
}
Column columnAnnotation = method.getAnnotation(Column.class);
if (columnAnnotation != null) {
try {
NameValuePair pair = new NameValuePair(columnAnnotation.name(),method.invoke(t));
result.add(pair);
} catch (Exception e) {
continue;
}
}
}
return result;
}
public static <T> NameValuePair getIdField(T t){
NameValuePair pair = new NameValuePair();
Method[] methods = t.getClass().getMethods();
for (Method method : methods) {
String name = method.getName();
if (!name.startsWith("get")) {
continue;
}
Id idAnnotation = method.getAnnotation(Id.class);
if (idAnnotation == null) {
continue;
}
Column columnAnnotation = method.getAnnotation(Column.class);
try {
pair.setKey(columnAnnotation.name());
pair.setValue(method.invoke(t));
} catch (Exception e) {
throw new IllegalArgumentException("实体中id对应的注解");
}
break;
}
return pair;
}
/**
* key : value
*/
public static class NameValuePair{
private String key;
private Object value;
public NameValuePair(){}
public NameValuePair(String id,Object value){
this.key = id;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
2.新增的公共方法
String tableName = JdbcTemplateUtils.getTableName(t);
if (tableName == null) {
return ;
}
List<JdbcTemplateUtils.NameValuePair> pairList = JdbcTemplateUtils.getFieldMap(t, false);
if (CollectionUtils.isEmpty(pairList)) {
return;
}
JdbcTemplateUtils.NameValuePair id = JdbcTemplateUtils.getIdField(t);
String value = "(select case when max("+id.getKey()+") is null then 1 else max("+id.getKey()+")+1 end from "+tableName+")";
List<String> keys = new ArrayList<String>();
List<Object> values = new ArrayList<Object>();
keys.add(id.getKey());
values.add(value);
for (JdbcTemplateUtils.NameValuePair pair : pairList) {
if(pair.getValue() != null &&!"".equals(String.valueOf(pair.getValue()))){
keys.add(pair.getKey());
values.add("'" + pair.getValue()+"'");
}
}
StringBuilder sql = new StringBuilder();
sql.append(" INSERT INTO ")
.append(JdbcTemplateUtils.getTableName(t))
.append(" (")
.append(StringUtils.join(keys, ","))
.append(" )")
.append("VALUES")
.append(" (")
.append(StringUtils.join(values, ",") )
.append(" )");
jdbcTemplate.execute(sql.toString());
3.根据主键进行修改
@Override
public <T> void updateObjectById(T t) {
String tableName = JdbcTemplateUtils.getTableName(t);
if (StringUtils.isEmpty(tableName)) {
return;
}
List<JdbcTemplateUtils.NameValuePair> pairList = JdbcTemplateUtils.getFieldMap(t);
if (CollectionUtils.isEmpty(pairList)) {
return;
}
JdbcTemplateUtils.NameValuePair idPair = JdbcTemplateUtils.getIdField(t);
StringBuilder sql = new StringBuilder();
sql.append(" UPDATE ")
.append(JdbcTemplateUtils.getTableName(t))
.append(" SET ")
;
for (JdbcTemplateUtils.NameValuePair pair : pairList) {
sql.append(pair.getKey())
.append(" = ")
.append("'" + pair.getValue() + "'")
.append(" and ");
}
String sqlString = sql.substring(0, sql.length() - 4);
sqlString = sqlString + " where " + idPair.getKey() + " = " + idPair.getValue();
System.out.println(sqlString);
jdbcTemplate.update(sql.toString());
}
3.根据实体进行删除
@Override
public <T> void delete(T t) {
String tableName = JdbcTemplateUtils.getTableName(t);
if (StringUtils.isEmpty(tableName)) {
return;
}
StringBuilder sql = new StringBuilder();
sql.append(" DELETE FROM ").append(tableName).append("WHERE");
List<JdbcTemplateUtils.NameValuePair> pairList = JdbcTemplateUtils.getFieldMap(t, true);
for (JdbcTemplateUtils.NameValuePair pair : pairList) {
if(pair.getValue() != null &&!"".equals(String.valueOf(pair.getValue()))){
sql.append(pair.getKey() + " = ").append("'"+pair.getValue()+"'").append(" and ");
}
}
String sqlString = sql.substring(0, sql.length() - 4);
jdbcTemplate.execute(sqlString);
}
由于我无意参与这个项目.所以我只修改了下hibernate相关代码.没多研究.因为我还是觉得要么tkmybatis要么spring-data-jpa.不需要这么复杂