工作这几年接触的项目从sssm单maven项目到springcloud的聚合maven项目,和dubbo框架的spring聚合maven项目。发现同事有些在操作mybatis上的盲点,或许你也曾经中招过。现在使用的是springboot项目整合的mybatis,就根据这个说吧。有些都是通用的。
这里主要集中在dao层和mapper文件上,配置上。
1.配置部分
1.1首先是springboot引入mybatis和数据库驱动的依赖有这两个
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
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.有关代码的传参问题
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 id="insert" parameterType="com.jd.mee.catalog.entity.Attach" useGeneratedKeys="true" keyProperty="id">
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})
</insert>
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
<if test="createTime!=null and createTime!='' ">
<![CDATA[
and create_time >= concat( #{createTime},' 00:00:00')
and create_time <= concat( #{createTime},' 23:59:59')
]]>
</if>
2.4.2 模糊查询传参
<if test="name != null and name != ''">
and name like concat('%',#{name,jdbcType=VARCHAR},'%')
</if>