美文网首页java面试
Spring boot集成Mybatis教程

Spring boot集成Mybatis教程

作者: AKyS佐毅 | 来源:发表于2018-01-06 17:52 被阅读108次

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

Github SpringbootDemo 地址链接

1、 pom.xml文件配置

2、application.yml文件的配置

  • 配置数据源

首先我们需要在配置文件中配置我们的数据源。我们采用mysql作为我们的数据库。这里我们采用yaml作为我们配置文件的格式。我们在resources目录下新建application.yml文件:

spring:
  profiles:
    active: dev
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/service_db?useSSL=false&autoreconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
    username: root
    password: 123456
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

由于Spring Boot拥有自动配置的特性,我们不用新建一个DataSource的配置类,Sping Boot会自动加载配置文件并且根据配置文件的信息建立数据库的连接池,十分便捷。

3、generatorConfig.xml文件的配置

4、生成数据库映射文件

5、运行结果

Mapper.xml参数传入问题处理

  • Mybatis在使用Mapper接口进行编程时,底层采用了动态代理机制,表面上是调用的Mapper接口,而实际上是通过动态代理调用的SqlSession的对应方法,其最终会获得一个代理了Mapper接口的MapperProxy对象。 MapperProxy对象在调用Mapper接口方法时会把传递的参数做一个转换,然后把转换后的参数作为入参传递给SqlSession对应的操作方法(如selectOne、insert等)。转换过程可以参考MapperMethod的execute()方法实现。

  • 简单来说是以下规则:

    • 1、单个参数:可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
    • 2、多个参数:任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
    • 3、命名参数:为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字。
    • 4、POJO:当这些参数属于我们业务POJO时,我们直接传递POJO。
    • 5、Map:我们也可以封装多个参数为map,直接传递。
    • 6、其实MyBatis在处理多个参数的时候,MyBatis会做特殊处理,多个参数会被封装成一个map,map中是这么存值的。
    map.put("param1","传入的参数值1");
    map.put("param2","传入的参数值2");
    map.put("param3","传入的参数值3");
                  .
    map.put("paramN","传入的参数值N");

{}就是从map中获取指定的key值。

这个时候我们要将UserMapper.xml中查询方法做如下修改:

User 
selectUser(@param(“userName”) String name, @param(“userArea”) String area);可以采用这种方式声明传入的参数,这样就可以在SQL语句中直接使用 
<select id="findUserByIdAndUserName" resultType="com.kenvin.mybatis.bean.User">
    select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName}
</select>

6、相关问题

  • 字符串对比

    • 在Mybatis的if test语句中如果需要对比字符串,可以组合使用单引号和双引号,比如<if test='name=="Ted" '></if>
  • 空指针报警

    • 在运行Druid时可能出现Cannot resolve com.mysq.jdbc.Connection.ping method. Will use 'SELECT 1' instead.java.lang.NullPointerException报警

    • 使用5.1.x版本的mysql-connector-java可以解决

  • Spring和Mybatis整合时无法读取properties

    • 因为MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,所以导致把表达式当作字符串复制了。

    • 把org.mybatis.spring.SqlSessionFactoryBean的id修改为’sqlSessionFactoryBean’,使得该值不是’sqlSessionFactory’,不然会造成提前初始化。

总结

  • 总的来说,现在大家都比较喜欢使用Mybatis.所以为了普适性而言,使用Mybatis会更好。两者基本上没什么区别,一旦牵涉到自定义的属性查询或者关联表查询,都需要写SQL 语句,这是无法避免的。

微信扫码关注java架构,获取Java面试题和架构师相关题目和视频。

相关文章

网友评论

    本文标题:Spring boot集成Mybatis教程

    本文链接:https://www.haomeiwen.com/subject/dlnynxtx.html