Mybatis

Leaning about Mybatis

Basic info

工作原理
中文官方文档:入门
中文官方文档mybatis-spring:入门

最后实际用的应该是 mybatis-spring-boot-starter
example for spring-boot-starter
Mybatis generator

上面三篇读完基本就可以动手了。

JDBC有四个核心对象:

  • (1)DriverManager,用于注册数据库连接
  • (2)Connection,与数据库连接对象
  • (3)Statement/PrepareStatement,操作数据库SQL语句的对象
  • (4)ResultSet,结果集或一张虚拟表

MyBatis四大核心对象:

  • (1)SqlSession对象,该对象中包含了执行SQL语句的所有方法。类似于JDBC里面的Connection。
  • (2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
  • (3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
  • (4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。

java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

依赖中同时包含以下两个包的时候会出现这个错误——

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.2</version>
</dependency>

# and 
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.3.1.tmp</version>
</dependency>

myybatis generator practice

quick start默认使用generatorConfig.xml文件定义如何generate。
With Maven:

  • 添加plugin
<plugin>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-maven-plugin</artifactId>
  <version>1.4.0</version>
</plugin>
  • 执行mvn 命令 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate

  • 配置文件内容属性详情xml config

使用低版本的MySQL Connector(5.x, 6.x版本),可能出现 mybatis generator “Column name pattern can not be NULL or empty”错误

  • 使用高版本(8.0.x)即可,
  • 或在连接属性里增加 ?nullNamePatternMatchesAll=true内容

Mybatis spring boot starter practice

official guides
guide: accessing mysql data
mybatis spring boot config

overwrite existed xml files: 参考 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate not work.

The overwrite property is only used for generated Java files. It should not affect XML files at all. XML files should always be merged.

Have you configured a comment generator with suppressAllComment=true? If so, that would be the cause of this behavior. The XML merge won't delete old elements if the comments are removed.

overwrite 配置只是为了覆盖 java 类, xml 文件是不受这个控制的

mvn deploy 提示401: 确保mvn settings中的 servers下的server字段的id名称与distributionManagement下repository字段下的id名称相同(大小写敏感)

<servers>
    ...
    <server>
        <id>snapshots</id>
        <username>username</username>
        <password>password</password>
    </server>
</servers>


<distributionManagement>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://nexus.mynexus.service.com:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

insert return primary key

MyBatis insert操作返回主键——

手动封装到bean中,不推荐
官方使用:sqlmap-xml
深入浅出mybatis之返回主键ID

在mapper接口楼中对insert操作进行声明,类似 @Options(useGeneratedKeys = true, keyProperty = "id")

或者使用下面的方式——

  <insert id="create" useGeneratedKeys="true" keyProperty="id">
        <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO SIN_Manager (Account,Password,Name,Phone,Deleted)
        VALUES (#{account}, #{password},#{name},#{phone},0)
    </insert>
  • updateByPrimaryKey 将为空的字段在数据库中置为NULL
  • updateByPrimaryKeySelective 更新新的model中不为空的字段。

后者可以在对应的mapper.xml文件中看到,类似——

<update id="updateByPrimaryKeySelective" parameterType="com.xxx.yyy.test.platform.entity.SUResult" >
    update su_result
    <set >
      <if test="groupName != null" >
        group_name = #{groupName,jdbcType=VARCHAR},
      </if>
      <if test="projectName != null" >
        project_name = #{projectName,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
 
comments powered by Disqus