美文网首页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