4.Spring_Jdbctemplate

本文深入探讨了Spring的JdbcTemplate,首先介绍了JdbcTemplate的基本概念,然后详细阐述了其在实际应用中的使用方法,帮助读者掌握数据库操作的简便之道。
1. 浅谈JdbcTemplate
0.JdbcTemplate是一个用来操作数据库的spring子框架,是对JDBC的封装,实现增删改查,
没有缓存机制。相对于Mybatis来说,适用于小项目的开发。
  
  JdbcTemplate交给spring容器管理,需要依赖于连接池。

1.spring提供的几种简单框架
  操作关系型数据库使用-->Jdbctemplate 
  操作非关系型数据库使用-->Redistemplate
  操作消息队列使用-->Jmstemplate
  
2.四种连接池spring的xml文件配置:导入连接池类的bean
 c3p0-->ComboPooledDataSource  spring--> DriverManagerDataSource spring内置连接池
 druid-->DruidDataSource       dbcp -->  BasicDataSource
 
3.当查询数据库,常常使用别名查询,此时BeanPropertyRowMapper<>(实体类.class)无法完成
封装,这个时候,需要自定义MyBeanPropertyRowMapper实现类,重写方法RowMap实现实体类的封装。
   
4.面试题
  JdbcTemplate 在dao层的注入方法有几种?
  set方法注入,有参构造注入。
  特殊的一种方式:
  dao层实现类继承JdbcDaoSupport,getJdbcTemplate()可以获取Jdbctempate对象
  缺点:无法使用注解。
2.JdbcTemplate使用
这是什么错误?如何解决 ===================================== total ellipse time: 310.510803 s ------------------------------------- Total Read Tables Count: 9 Total Failure Tables Count: 1 Total Read Record Size: 598.58 MB Total Writer Duration: 310.355 s Table Detail Information Follows: app.raa_result_item --> app.raa_result_item [read: 12426, write:12416] app.daily_report --> app.daily_report [read: 528, write:528] app.execution_result_item --> app.execution_result_item [read: 251207, write:201200] app.unique_execution_result_item --> app.unique_execution_result_item [read: 202454, write:165312] app.execution_result --> app.execution_result [read: 72675, write:57675] app.daily_report_otm_execution_result --> app.daily_report_otm_execution_result [read: 901, write:882] app.daily_report_detail --> app.daily_report_detail [read: 7950, write:5051] app.daily_report_special_result --> app.daily_report_special_result [read: 412, write:412] app.raa_result --> app.raa_result [read: 553, write:553] Exception Detail Information Follows: [1]app.unique_execution_result_item --> app.unique_execution_result_item Write Stack Information : org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [UPDATE `app`.`unique_execution_result_item` SET `execution_result_item_id`=? , `is_active`=? , `created_at`=? , `updated_at`=? WHERE `id`=?]; Duplicate entry '4032499' for key 'unique_execution_result_item.unique_execution_result_item_UN'; nested exception is java.sql.BatchUpdateException: Duplicate entry '4032499' for key 'unique_execution_result_item.unique_execution_result_item_UN' at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:247) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:647) at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:936) at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:990) at com.gitee.dbswitch.provider.sync.DefaultTableDataSynchronizeProvider.executeUpdate(DefaultTableDataSynchronizeProvider.java:162) at com.gitee.dbswitch.provider.sync.AutoCastTableDataSynchronizeProvider.executeUpdate(AutoCastTableDataSynchronizeProvider.java:31) at com.gitee.dbswitch.data.handler.ReaderTaskThread$1.lambda$doUpdate$1(ReaderTaskThread.java:656) at com.gitee.dbswitch.data.handler.WriterTaskThread.doProcess(WriterTaskThread.java:55) at com.gitee.dbswitch.data.handler.WriterTaskThread.doProcess(WriterTaskThread.java:27) at com.gitee.dbswitch.core.task.TaskProcessor.get(TaskProcessor.java:60) at com.gitee.dbswitch.core.task.TaskProcessor.get(TaskProcessor.java:15) at com.gitee.dbswitch.common.entity.LoggingSupplier.get(LoggingSupplier.java:31) at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) Caused by: java.sql.BatchUpdateException: Duplicate entry '4032499' for key 'unique_execution_result_item.unique_execution_result_item_UN' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.cj.util.Util.handleNewInstance(Util.java:192) at com.mysql.cj.util.Util.getInstance(Util.java:167) at com.mysql.cj.util.Util.getInstance(Util.java:174) at com.mysql.cj.jdbc.exceptions.SQLError.createBatchUpdateException(SQLError.java:224) at com.mysql.cj.jd=====================================
最新发布
08-14
这是一个**数据库写入错误**,具体是 **唯一约束冲突(DuplicateKeyException)**。错误发生在数据同步过程中,尝试对表 `app.unique_execution_result_item` 进行 `UPDATE` 操作时,违反了该表的唯一索引约束,导致写入失败。 --- ### ✅ 错误原因分析: ```java Duplicate entry '4032499' for key 'unique_execution_result_item.unique_execution_result_item_UN' ``` 这说明: - 表 `unique_execution_result_item` 有一个**唯一索引**(unique index)`unique_execution_result_item_UN`。 - 正在尝试更新某条记录时,导致某个字段或字段组合的值**违反了这个唯一性约束**。 - 具体来说,插入或更新的记录中,某个唯一字段(或多个字段组合)的值为 `'4032499'`,而这个值在表中已经存在了。 --- ### 🧠 可能的场景: 1. **主键或唯一索引冲突**: - 你正在更新的记录,其唯一字段(如 `id`、`code`、`execution_result_item_id` 等)已经存在于表中。 - 例如:`execution_result_item_id` 是唯一索引字段,但你要更新的记录的这个字段值已存在。 2. **数据同步逻辑问题**: - 数据同步工具(如 dbswitch)在做表数据迁移时,可能在并发写入时出现了重复写入。 - 或者源数据中存在重复数据,而目标表有唯一约束。 3. **数据源问题**: - 源数据库中存在不符合目标表唯一约束的数据。 --- ### ✅ 解决方法: #### ✅ 方法 1:检查目标表的唯一索引 查看 `unique_execution_result_item` 表的定义,找到哪个字段或字段组合设置了唯一索引: ```sql SHOW CREATE TABLE app.unique_execution_result_item; ``` 查看输出结果中的 `UNIQUE KEY` 部分。 --- #### ✅ 方法 2:检查冲突数据 查看目标表中是否已经存在冲突的记录: ```sql SELECT * FROM app.unique_execution_result_item WHERE id = 4032499; -- 或者根据唯一索引字段查询 -- 例如: -- SELECT * FROM app.unique_execution_result_item -- WHERE execution_result_item_id = '4032499'; ``` --- #### ✅ 方法 3:修复数据同步逻辑 根据你的数据同步逻辑,可以选择以下方式: 1. **跳过冲突记录**: - 在写入时忽略唯一冲突错误(适用于数据重复但内容一致的情况)。 2. **先删除后插入**: - 如果是全量同步,可以先清空目标表,再写入新数据。 3. **使用 `ON DUPLICATE KEY UPDATE`**(MySQL 特有语法): - 在插入数据时,如果发现唯一冲突,就执行更新操作,而不是报错。 示例: ```sql INSERT INTO app.unique_execution_result_item (id, execution_result_item_id, is_active, created_at, updated_at) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE is_active = VALUES(is_active), updated_at = VALUES(updated_at); ``` --- #### ✅ 方法 4:调整唯一索引 如果确认这个唯一索引不是必须的,或者设置不合理,可以考虑修改或删除该索引: ```sql ALTER TABLE app.unique_execution_result_item DROP INDEX unique_execution_result_item_UN; ``` > ⚠️ 注意:删除索引前务必确认影响,可能影响其他业务逻辑。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值