Experience 数据库增删改注意问题
1 insert
2 delete
根据什么删除就传什么参数,不想想着同一条sql,不同条件搞定,如果删除仅仅是置删除标志位1的话,那么传String最好不过了,如果除了置删除状态为1的话还要置其他的状态,那么最好用DTO了
Service层,业务层的接口定义非常的重要,
不要想着一个sql语句(ibatis)能接受好几个业务层的参数
举个例子:
1 删除
首先第一,updateDeleteDispatcherDeptByCid//删除一个送单员
这个时候突然有个这样的需求,就是不通过主键,通过送单员的名称
由于updateDeleteDispatcherDeptByCid参数带了是String cid
这个时候对于需求,只能再写一个sql,为什么呢,因为传了一个参数
ibatis里写的是一个parameterclass写的是java.lang.String
所以要接受两个参数的话
首先前提条件说了
select 用String,HashMap,DTO
update 用String,DTO,HashMap
这个需求如果采用HashMap的话,就是通过主键删除的话
map里要加两个参数,通过名称删除的话也要加两个参数
但是如果使用DTO的话,就没有那么多的限制
要用哪个参数就set哪个参数
所以对于删除的话,如果那个模块(独立的很小的模块),只有一个删除
通过Cid,那么service层就用String cid
但是涉及到还可以通过其他方式进行删除的话,那么必须考虑用DTO了
或者重写个Update Sql语句,所以必须考虑清楚
我打算重写意个sql语句,因为之前没有考虑清楚给自己的教训!!!
这样也不会 动用之前的代码。
所以以后删除的时候一定要考虑清楚!当然不是通过主键来删除的话
条件也一定要带上C_Del = 0 来进行约束
对于删除还是通过字符串来传参比较好,因为传DTO的话,sql可能做了
空的判断,如果sql条件对应的DTO属性都是空的,就会把数据库所有的数据
都删除掉,造成的随不可估量。
业务层方法名称要明了,参数也要明了.
业务层的参数的问题。
查询的时候要特别明了
其他就可以不是很明了,尽量使用DTO
这样的话扩展性也比较好。
3 select
4 update
更新的时候一般很容易出现脏读的情况。
例如A读出来了数据,B也读出来了数据
这个时候A把数据修改了并提交了
B这个时候看到的数据跟数据库不一致的,属于脏读
这个时候B更新数据的时候应该给出提醒该条数据已经被更新,此次操作失败
并把最新内容显示出来。
这种情况怎么处理呢?
方法一
表加一个锁键 lockKey
数据库这样写
update tb set c_name = '',lockKey = #lockKey# + 1
where c_id = #cid# and lockKey = #lockKey#
如果A更新了数据,那么B更新数据的时候根本查询不到这条记录,所以更新不成功返回0
这个时候B就会再次去查找数据进行更新
方法二
不加字段用表的更新时间字段
每次更新的时候也可以按照上面的写法来操作。
也可以把更新时间查找出来,与第一次查出来的更新时间进行对比一下
如果相等就更新,如果不等就不能更新。当然这得保留第一次查询出来的更新时间
分享到:
相关推荐
数据库insert语句生成器-可生成任何数据库的inser语句 个人珍藏版一般人我可不让他下载哦 大家赶紧下吧
判断是否存在,存在就update,不存在insert,不是用存储过程解决的。
实验中展示了如何创建带有输入参数(如`upd`、`inser`)和输出参数(未在示例中显示)的存储过程。 - **调用存储过程**:实验中演示了如何执行存储过程,如`EXEC getStudentList;`和`EXEC checkgrade '徐梦佳';`,...
6. 其他类似的方法可以扩展用于更新(update)、查询(select)和删除(delete)数据。例如,`update_data`方法可以通过构建`UPDATE`语句并执行来修改数据;`select_data`方法可以使用`SELECT`语句获取数据;`delete...
全国各个省市最新四级联动数据库,sql文件,可直接导入数据库。
Access、SQL Server、Oracle是三种不同的关系型数据库管理系统(RDBMS),它们在功能、性能、安全性、适用场景等方面有着显著的区别。 1. **取当前系统时间** - Access: 使用 `Now()` 函数获取当前日期和时间。 -...
不需要像eclipse那样添加驱动包,在pycharm里面下载一个pymysql包即可。 然后链接自己电脑的mysql并进行访问即可。 源码如下 import pymysql # 建立数据库连接 conn = pymysql.Connect( ...# sql=INSER
ON DUPLICATE KEY UPDATE`相同,但请注意,`REPLACE INTO`可能会导致数据丢失,因为旧行被完全删除。 两种方法各有优缺点。`INSERT INTO ... ON DUPLICATE KEY UPDATE`更适合于只更新已存在数据的场景,而`REPLACE...
java版s源码Flutter 的 SQLCipher 数据库 这是一个捆绑和包装 的插件,它是一个开源扩展,可提供透明的 256 位数据库文件。 特征 实现存储在磁盘或内存中的 ...数据库。...支持布尔值、双精度值、整数、字符串、...执行INSER
首先,`Invalid bound statement (not found)` 错误通常出现在你尝试执行一个Mybatis-Plus的CRUD操作(如insert、update、delete或select)时,但Mybatis-Plus找不到对应的Mapper方法。这可能是由于以下原因: 1. *...
当使用公有云关系存储数据库服务时,经常会对IOPS做限制,导致数据库如果操作频繁,经常会达到限制,特别是inser,update,delete这类需要操作写入磁盘的。本篇讲讲IOPS是什么,为什么会高,以及Mysql的处理方案。 ...
根据提供的文件信息,本文将详细解析如何在Java中调用数据库中的存储过程。这涉及到Java与数据库之间的交互,主要利用了Java的JDBC(Java Database Connectivity)技术来实现这一目标。 ### Java调用存储过程的基本...
- LINQ(Language Integrated Query)在EF中被用于查询数据库,它提供了强大的、类型安全的查询能力,使得数据库操作更加直观。 **WCF(Windows Communication Foundation)**是微软提供的一种服务导向架构,用于...
MySQL中的`REPLACE INTO`语句是一个非常实用的数据库操作命令,它在处理数据时具有独特的功能,尤其是在处理存在唯一性约束的表时。`REPLACE INTO`与`INSERT INTO`相似,但它们在处理已有数据时的行为有所不同。在...
通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我们一个当前时间的毫秒数为名字,有一个问题郁闷了很久,我还是先把insertImage的源码贴出来吧 代码如下:...
要测试应用程序,请在本地创建一个postgres数据库并更改变量数据库在app.py的第11行找到: postgresql:/// [INSER DB NAME] 或创建一个名为test_db的本地postgres数据库以使用当前数据库设置然后在python提示符下...
在编辑模式中,可以编辑文件内容,但是需要注意在 Linux 中,按下这些按键时,在画面的左下方会出现『INSERT 或 REPLACE』的字样,此时才可以进行编辑。 在编辑模式中,可以使用以下命令: * i:当前光标前 * a:...