mybatis的一个小技巧与坑

今天在公司开发一个医院系统时,遇到这样两个问题:数据库

第一个问题:并发

个人一张表主键是自增加,主键字段是病人id,还有一个字段是门诊号,门诊号须要获取主键的值,把值格式化成“00000000”这种八位数的格式。最开始想了一种方式:先把病人的其余信息存入表中,而后再读取id(此时经过比较,读取最大的那个id,也就是最近插入的一个),经过id来格式化门诊号,这样作的弊端有两个,一个是频繁的读取和插入,消耗资源,另外一个是若是遇到并发的状况会出现bug(若是在相差很短的时间内生成两个挂号信息,因为时间相差很短,在取id值的时候有可能两次都取了同一个值,会致使一个门诊号分配给多人)。app

基于两种状况的考虑,放弃了这种方式,后来又找到了另一种简单的 解决方法,如图:blog

文档解释以下:资源

useGeneratedKeys (insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally by the database (e.g.auto increment fields in RDBMS like MySQL or SQL Server). Default: false 
(( 仅 对 insert 和update有 用 ) 这 会 告 诉 MyBatis 使 用 JDBC 的 getGeneratedKeys 方法来取出由数据(好比:像 MySQL 和 SQL Server 这样的数据库管理系统的自动递增字段)内部生成的主键。默认值:false。) 开发

也就是说写了 useGeneratedKeys="true" 等于true即说明插入数据以后 能够立马使用自增的主键rem

keyProperty="patientId"  这个属性意思是把自增的主键赋值到patientId属性上,patientId表明的是实体类的属性,而不是数据库字段。

 

第二个问题:文档

我在数据库表中有有一个category_state字段用于判断挂号的是门诊仍是住院,表中是int类型,因为这种基本的增删查改代码都是直接生成的,在mapper层有这样一个判断get

若是categoryState!='' ,这里的categoryState是int型和空字符比较,个人状态值,一个是1,一个是0,而后在mabatis中0表明空字符,因此当我从前台传0过来时,直接判断这句话不参与添加到数据库,致使数据库中没有值而出错。

修改方案:1.把categoryState!=' '去掉博客

                2.状态传非0的数

               3.  数据库中把字段改成char,而不是用int

今天就写到这里,但愿经过今天写这个博客,记录本身的一些错误,之后不会继续出现这样的问题。