Spring boot集成Mybatis教程
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
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面试题和架构师相关题目和视频。