工作这几年接触的项目从sssm单maven项目到springcloud的聚合maven项目,和dubbo框架的spring聚合maven项目。发现同事有些在操作mybatis上的盲点,或许你也曾经中招过。现在使用的是springboot项目整合的mybatis,就根据这个说吧。有些都是通用的。
这里主要集中在dao层和mapper文件上,配置上。
1.1首先是springboot引入mybatis和数据库驱动的依赖有这两个
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.0
mysql
mysql-connector-java
runtime
1.2 yml文件中的mybatis和mysql数据库链接配置
首先看下项目结构,结合位置来看配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/catolog?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mybatis/*.xml # 配置xml的扫描包的位置。
type-aliases-package: com.jd.mee.catalog.entity # 配置xml中的实体类存放位置,在resultType存放查询结果时,就不用写全路径,只要写实体类名就可以了。
1.3 关于配置的详解:type-aliases-package: com.jd.mee.catalog.entity
如果不配置上面这个配置,在写resultType时就要用resultMap中的那种形式,如果配置了,就可以用图中圈住的这种形式:写实体类名就行了
2.1 如果是批量插入,传递的是个list集合,何时出现传递入参为空的情况,如何解决?
Dao层的mapper文件中的批量插入传递的入参为List<…> list,这个list在xml文件中的foreach循环的collection中也是用的list.此时,没有问题。传参数正常。但是如果前面用的是List<…> quizPaperItems,xml中的foreach中的list不该或者改为quizPaperItems,这时就会有问题:传参获取不到,参数为空,或者不是别的参数类型。
主要原因时mybatis对list的识别,默认认为时集合,如果不加上强声明参数@Param(“quizPaperItems”)就改为quizPaperItems,则会异常。这里如果想不受限制,自由命名,就看第三张第四张图demo中声明即可。另外需要强调的一点:@Param注解的参数,xml中无需在写入参的类型,完全可以省略掉。
2.2 单条插入实现返回生成的主键id
需要在sql上加上useGeneratedKeys="true"
和 keyProperty="id"
dao层的接口方法:
int insert(Attach record);
对应的xml中的sql
insert into catalog_attach ( name, type,
size, uri, attribute,
creator, create_time, update_time,
status)
values ( #{name,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR},
#{size,jdbcType=BIGINT}, #{uri,jdbcType=VARCHAR}, #{attribute,jdbcType=VARCHAR},
#{creator,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP},
#{status,jdbcType=TINYINT})
2.3 数据类型转化问题
2.3.1 jdbcType=“TIMESTAMP”,java实体类中对应类型为java.Util.Date.当实体转json时,出现日期值变为了时间戳的问题
解决办法有两种:
a.实体类就别用Date类型了,用Sring类型。然后在get方法里添加日期格式化的方法,返回想要的日期格式数据。转json也没问题。
b.为该属性值加上注解: @JSONField(format="yyyy-MM-dd HH:mm:ss")
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date createTime;
2.3.2 jdbcType=“TINYINT”,对应实体类的类型为byte,导致赋值不方便操作。
解决办法:直接把属性类型byte换成Integer即可。
2.3.3 数据库为text类型,jdbcType="LONGVARCHAR"
,对应的java数据类型为啥?
解决办法:java数据类型为String足够。
2.4 查询条件
2.4.1 时间范围sql
= concat( #{createTime},' 00:00:00')
and create_time <= concat( #{createTime},' 23:59:59')
]]>
2.4.2 模糊查询传参
and name like concat('%',#{name,jdbcType=VARCHAR},'%')