JdbcTemplate单表操作

      马上年底了.收到一个任务,是同事升级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.不需要这么复杂

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值