Experience 数据库inser,update,select注意问题
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 select4 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就会再次去查找数据进行更新
方法二
不加字段用表的更新时间字段
每次更新的时候也可以按照上面的写法来操作。
也可以把更新时间查找出来,与第一次查出来的更新时间进行对比一下
如果相等就更新,如果不等就不能更新。当然这得保留第一次查询出来的更新时间