update 方法

首先来看update 方法

    1.  sql的生成:

这个方法有三个实现,每一个方法都包含一个sql 和另外的一个参数

我们就拿第一个方法为例子: 第一个sql 应该怎么写

比如插入:insert into table_name(column1,column2) values(?,?)

更新:update table_name set column1=?,column2=? where column3=? and ..

其实我们可以看出来的是第一个参数sql 和我们平时编写的语句并无差异,就是里面的值我们先用? 进行代替 下面是我写的一个生成insert  语句的方法,传入的是对象的class

/*** 生成insert sql * @param clazz* @return*/public static String generateInsertSql(Class<?> clazz) {Table annotation = clazz.getAnnotation(Table.class);if (annotation == null || StrUtil.isStrBlank(annotation.name())) {throw new RuntimeErrorException(new Error(), MESS.EntityAnnotationIsNull);}String tablename = annotation.name();// 获取相关的,属性String sql_prex="insert into "+tablename+"(";String sql_suffix="values(";Field[] fs = clazz.getDeclaredFields();if(fs==null || fs.length==0) {throw new RuntimeErrorException(new Error(), MESS.EntityPropertiesIsNull);}for (int i = 0; i < fs.length; i++) {Field f=fs[i];sql_prex=sql_prex+f.getName()+",";sql_suffix=sql_suffix+"?,";}sql_prex=sql_prex.substring(0, sql_prex.lastIndexOf(","))+")";sql_suffix=sql_suffix.substring(0, sql_suffix.lastIndexOf(","))+")";return sql_prex+" "+sql_suffix;}

需要注意的是:实体需要有注释 ,比如:name的值是对应的表名

    2. 参数PreparedStatementSetter是一个待实现的接口,作用是给上面我们生成的语句里面的?进行赋值,并且需要按照顺序进行赋值,比如我们按照上面的方法生成了sql 下面我们需要对立面的? 进行赋值

 public <T> void addEntity(T entity) {Connection conn=null;Savepoint point=null;try {logger.info("****添加实体类addEntity*******");conn=jdbcTemplate.getDataSource().getConnection();conn.setAutoCommit(false);if (entity == null) {throw new RuntimeErrorException(new Error(), MESS.EntityCanNotNull);}logger.info("生成插入sql");point = conn.setSavepoint();String sql = generateInsertSql(entity.getClass());Field[] fields = entity.getClass().getDeclaredFields();PreparedStatementSetter setter = new PreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps) throws SQLException {for (int j = 0; j < fields.length; j++) {// 获取方法PropertyDescriptor pd = null;try {pd = new PropertyDescriptor(fields[j].getName(), entity.getClass());} catch (IntrospectionException e1) {e1.printStackTrace();}Method getMethod = pd.getReadMethod();try {ps.setObject(j + 1, getMethod.invoke(entity));} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}};jdbcTemplate.update(sql, setter);conn.commit();} catch (Exception e) {try {conn.rollback(point);} catch (SQLException e1) {e1.printStackTrace();}logger.error("****添加实体失败{}*****", e.getMessage());throw new RuntimeErrorException(new Error(), e.getMessage());}logger.info("****结束实体类addEntity*******");}

我们实现的其实是这个接口的setValue 方法

注意:的是赋值的时候是从 下标 1开始的

batchUpdate 方法

这个方法和update 很类似,update 是单条语句的更新,但是batchupdate是多条语句的批量操作

比如,还是使用上面的生成sql的方法:

 /*** V1.1*********** 批量更新 *** date 2021-03-15*/@Overridepublic <T> void batchAddObjectList(List<T> list) {logger.info("*************开始执行批量增加**************");if (list == null || list.size() == 0) {throw new RuntimeErrorException(new Error(), MESS.ListIsEmpty);}T obj_1 = list.get(0);String sql = generateInsertSql(obj_1.getClass());try {BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {T obj=list.get(i);Field[] fields = obj.getClass().getDeclaredFields();for (int j = 0; j < fields.length; j++) {// 获取方法PropertyDescriptor pd = null;try {pd = new PropertyDescriptor(fields[j].getName(), obj.getClass());} catch (IntrospectionException e1) {e1.printStackTrace();}Method getMethod = pd.getReadMethod();try {ps.setObject(j + 1, getMethod.invoke(obj));} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}@Overridepublic int getBatchSize() {return list.size();}};jdbcTemplate.batchUpdate(sql, setter);logger.info("****************结束调用批量更新****************");} catch (Exception e) {e.printStackTrace();throw new RuntimeErrorException(new Error(), e.getMessage());}}

这个的参数是 BatchPreparedStatementSetter  这个也是一个需要实现的接口,我们需要实现里面的setValues和getBatchSize ()   其实就是返回批量更新的条数

上面是对jdbcTemplate中的两个方法的介绍,以及自己实现的通用的方法

其实之前用jdbcTemplate主要是自己拼接sql语句,一个完整的SQL语句 然后调用jdbctemplate的execute这个方法,遇到需要自己实现的接口总是在逃避

所以自己的水平总是在一个阶段

这次通过介绍这样的一个实现,也是对自己的一个提高,算是一次记录笔记

希望对你有所帮助!

jdbcTemplate 的update 和batchUpdate 方法的使用相关推荐

  1. ubuntu sudo apt-get update 失败 解决方法

    ubuntu sudo apt-get update 失败 解决方法 参考文章: (1)ubuntu sudo apt-get update 失败 解决方法 (2)https://www.cnblog ...

  2. win10 update 关闭计算机,Win10关闭Windows Update服务的方法

    Windows Update是Windows操作系统自带有的一种自动更新工具,但有的用户并不想使用Win10自动驱动安装功能,如何关闭呢?下面小编就给大家带来Win10关闭Windows Update ...

  3. Django REST Framework笔记(六)重写序列化器的update和create方法

    序列化器中update.create和视图中的update.create 在序列化器中和视图中,都可以重写update和create方法,但两者有什么区别呢? 说实话,我还未搞懂,看不懂源码.这里我可 ...

  4. 【Unity3D】Unity 游戏画面帧更新 ( 游戏帧相关概念 | MonoBehaviour#Update() 帧更新方法 | 帧更新时间统计 | 设置游戏更新帧率 )

    文章目录 一. 游戏帧相关概念 二. MonoBehaviour#Update() 帧更新方法 三. 帧更新时间统计 四. 设置游戏更新帧率 一. 游戏帧相关概念 游戏画面由 连续的 帧 Frame ...

  5. JdbcTemplate类中的execute方法

    使用execute方法建一张用户表,execute()方法里可以执行SQL语句. JdbcTemplateTest.java: package com.liu.jdbc;import org.spri ...

  6. python 示例_带有示例的Python字典update()方法

    python 示例 字典update()方法 (Dictionary update() Method) update() method is used to update the dictionary ...

  7. rosdep init 和rosdep update的解决方法,亲测有效

    问题描述 安装ros时,在到最后一步 rosdep 初始化时,多半会抛出异常.这是因为境外资源被屏蔽. 百度或google搜索,解决方式有多,可惜墙加高了,现在集体失效.所以我特地来总结下ros大神推 ...

  8. medoo update mysql_更新方法:Update API-Medoo使用指南

    上一篇<插入方法:Insert API-Medoo使用指南>中介绍了如何使用Medoo的Insert方法来保存数据,本篇将告诉你如何使用Update方法来修改数据库已有的数据. 更新方法: ...

  9. MongoDB的update更新使用方法

    Update操作只作用于集合中存在的文档.MongoDB提供了如下方法来更新集合中的文档: db.collection.update() db.collection.updateOne() New i ...

最新文章

  1. 独家 | Tableau小技巧之分离Box plot和Unit Histogram(附链接)
  2. 7.第一次使用java连接mongodb遇到的问题
  3. WebRTC内置debug工具,详细参数解读
  4. 解开一个困扰自己多时的小问题
  5. Shell脚本[运算表达式,条件控制语句]
  6. Pwntools的context设置与shellcode
  7. domdocument php 扩展_php使用自带dom扩展进行元素匹配的原理解析
  8. 正确地启动hadoop
  9. 屏幕的宽度_交互规范:响应式让屏幕利用更高,用户体验更佳
  10. 仿腾讯图文轮播.html
  11. android局部翻转动画,android 围绕中心旋转动画
  12. MAC下go语言的安装和配置
  13. dism 如备份服务器系统,还在用 Ghost?系统备份还原 DISM 超详细使用方法
  14. 瑞友天翼建文件服务器,瑞友天翼简明使用手册
  15. android db 代码查看工具,Android 真机调试查看db数据库文件
  16. Oracle VS SAP
  17. Springboot整合JdbcTemplate实现分页查询
  18. 主流大数据调度工具对比(DolphinScheduler特点)
  19. java判断南北纬度的分界线_中国地理之南北分界线标志园,就在江苏淮安,是南是北一看便知...
  20. html怎么转换成ftl模板,FreeMarker入门+模板静态化+模板字符串静态化

热门文章

  1. go package学习——os
  2. 转载 - 10个基于jQuery实现的漂亮网站赏析
  3. 直面问题,咱谈焦虑、谈烦恼、谈如何成长
  4. 【腾讯二面】5s内建立多少个mysql连接?
  5. 重大事故!线上系统频繁卡死,凶手竟然是 Full GC ?
  6. 管理95后员工,管理者必知的4条底层逻辑
  7. 企业管理难题:团队协作
  8. html5摒弃的标记,5 HTML5的列表标记
  9. 恭喜,五年时间再造一家赴美上市公司
  10. 通过COLA看应用架构