工作這幾年接觸的項目從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>