springboot整合mybatis操作mysql數據庫使用的一些注意點和知識點

工作這幾年接觸的項目從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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章