jdbcTemplate 的update 和batchUpdate 方法的使用
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 方法的使用相关推荐
- ubuntu sudo apt-get update 失败 解决方法
ubuntu sudo apt-get update 失败 解决方法 参考文章: (1)ubuntu sudo apt-get update 失败 解决方法 (2)https://www.cnblog ...
- win10 update 关闭计算机,Win10关闭Windows Update服务的方法
Windows Update是Windows操作系统自带有的一种自动更新工具,但有的用户并不想使用Win10自动驱动安装功能,如何关闭呢?下面小编就给大家带来Win10关闭Windows Update ...
- Django REST Framework笔记(六)重写序列化器的update和create方法
序列化器中update.create和视图中的update.create 在序列化器中和视图中,都可以重写update和create方法,但两者有什么区别呢? 说实话,我还未搞懂,看不懂源码.这里我可 ...
- 【Unity3D】Unity 游戏画面帧更新 ( 游戏帧相关概念 | MonoBehaviour#Update() 帧更新方法 | 帧更新时间统计 | 设置游戏更新帧率 )
文章目录 一. 游戏帧相关概念 二. MonoBehaviour#Update() 帧更新方法 三. 帧更新时间统计 四. 设置游戏更新帧率 一. 游戏帧相关概念 游戏画面由 连续的 帧 Frame ...
- JdbcTemplate类中的execute方法
使用execute方法建一张用户表,execute()方法里可以执行SQL语句. JdbcTemplateTest.java: package com.liu.jdbc;import org.spri ...
- python 示例_带有示例的Python字典update()方法
python 示例 字典update()方法 (Dictionary update() Method) update() method is used to update the dictionary ...
- rosdep init 和rosdep update的解决方法,亲测有效
问题描述 安装ros时,在到最后一步 rosdep 初始化时,多半会抛出异常.这是因为境外资源被屏蔽. 百度或google搜索,解决方式有多,可惜墙加高了,现在集体失效.所以我特地来总结下ros大神推 ...
- medoo update mysql_更新方法:Update API-Medoo使用指南
上一篇<插入方法:Insert API-Medoo使用指南>中介绍了如何使用Medoo的Insert方法来保存数据,本篇将告诉你如何使用Update方法来修改数据库已有的数据. 更新方法: ...
- MongoDB的update更新使用方法
Update操作只作用于集合中存在的文档.MongoDB提供了如下方法来更新集合中的文档: db.collection.update() db.collection.updateOne() New i ...
最新文章
- 独家 | Tableau小技巧之分离Box plot和Unit Histogram(附链接)
- 7.第一次使用java连接mongodb遇到的问题
- WebRTC内置debug工具,详细参数解读
- 解开一个困扰自己多时的小问题
- Shell脚本[运算表达式,条件控制语句]
- Pwntools的context设置与shellcode
- domdocument php 扩展_php使用自带dom扩展进行元素匹配的原理解析
- 正确地启动hadoop
- 屏幕的宽度_交互规范:响应式让屏幕利用更高,用户体验更佳
- 仿腾讯图文轮播.html
- android局部翻转动画,android 围绕中心旋转动画
- MAC下go语言的安装和配置
- dism 如备份服务器系统,还在用 Ghost?系统备份还原 DISM 超详细使用方法
- 瑞友天翼建文件服务器,瑞友天翼简明使用手册
- android db 代码查看工具,Android 真机调试查看db数据库文件
- Oracle VS SAP
- Springboot整合JdbcTemplate实现分页查询
- 主流大数据调度工具对比(DolphinScheduler特点)
- java判断南北纬度的分界线_中国地理之南北分界线标志园,就在江苏淮安,是南是北一看便知...
- html怎么转换成ftl模板,FreeMarker入门+模板静态化+模板字符串静态化