springboot整合mybatis操作mysql数据库使用的一些注意点和知识点

版权声明:本文为博主原创文章,转载请注明出处,尊重劳动成果,谢谢~ https://blog.csdn.net/zhanglf02/article/details/89014897

工作这几年接触的项目从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>

猜你喜欢

转载自blog.csdn.net/zhanglf02/article/details/89014897