SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis
SpringBoot整合Mybatis
- 简介
- SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis
- 1.先用idea创建一个添加mybatis需要的相关依赖的工程。
- 2.准备数据库和表
- 3.创建表映射类
- 4.创建mapper代理接口
- 5.创建Service层和Service的实现层
- 6.创建控制层(也就是web层)
- 7.添加配置信息
- 7.1添加数据库链接信息和设置mybatis中的别名信息
- 7.2在应用程序入口类上配置@MapperScan扫描mapper接口文件所在包!
- 8.运行
- 扩展1(增删改查)
- 扩展2(注解方式一对一 @One)
- 补充1:xml的方式组装映射字段与数据库字段
- 补充2:javaType与ofType的区别
- 扩展3(注解方式一对多查询 @Many)
简介
在 Spring+SpringMVC 中整合 MyBatis 步骤需要在配置文件里配置多个 Bean,比如MapperScannerConfigurer,SqlSessionFactoryBean 等,步骤还是比较复杂的,Spring Boot 中对此做了进一步的简化,使 MyBatis 基本上可以做到开箱即用,也就是搭建SSM环境 。
Spring Boot中整合mybatis,主要有两种方式:①xml文件;②注解方式
SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis
方式2和方式1相比,主要是mapper文件的区别,所以除了第4和第7步有点不一样以外,其它步骤相同。
1.先用idea创建一个添加mybatis需要的相关依赖的工程。
创建出来的项目结构如下:
2.准备数据库和表
3.创建表映射类
之前创建表映射类时,我们是手动添加set,get,toString方法和构造方法等,比如像这样
现在,我们可以添加一个Lombok 依赖来简化这些代码
添加需要的注解,通过注解来实现自动帮我们加入get,set,构造方法等。
4.创建mapper代理接口
注意:不需要创建UsersMapper.xml文件,只需要创建UsersMapper接口就可以,将之前xml文件中的sql语句通过注解的方式写到接口中。
5.创建Service层和Service的实现层
6.创建控制层(也就是web层)
7.添加配置信息
7.1添加数据库链接信息和设置mybatis中的别名信息
数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/boot?characterEncoding=utf8&serverTimezone=GMT%2B8
mybatis配置
mybatis.type-aliases-package=com.test.ssm.pojo ```
7.2在应用程序入口类上配置@MapperScan扫描mapper接口文件所在包!
8.运行
扩展1(增删改查)
(可以删去UserMapper.xml)
扩展2(注解方式一对一 @One)
一个人拥有一张金卡或银卡
表一:id uname pwd card_id
表二:id category(1 金卡、2 银卡)
表一的card_id与表二的id对应,card定义为对象 (private Card card)
当我们创建的表映射类中的映射字段与数据库中的字段不一致时(如映射字段为uname,数据库字段为u_name),需要我们自己组装。(xml方式中通过resultMap,注解方式中通过@Result)
如果不进行组装,那么进行反射的时候,无法通过u_name找到对应的名字。
@Result({
@Result(property = "id",column = "id " , id = true),
@Result(property = "uname",column = "u_name " ), // 可以使用javaType=""后可以转换一下数据类型
@Result(property = "pwd",column = "pwd " )
@Result(property = "card",column = "card_id " ,one=@one(select=com.tst.ssm.mapper.CardMapper.selectCardById))
})
UserMapper.java
CardMapper.java
视图层(user.card.category )
补充1:xml的方式组装映射字段与数据库字段
// association表示单个对象(一对一、多对一)
// association中属性一定要设置javaType,用来指定对象类型
<resultMap type="Userinfo" id="userinfoMap">
<id property="uid" column="uid">
<result property="uname" column="u_name">
<result property="pwd" column="pwd">
// 代表一个学生有一个班级
<association property="Grade" javaType="Grade">
<id property="cid" column="cid" />
<result property="cname" column="cname" />
</association>
</resultMap>
// collection表示集合(一对多)
<resultMap type="Grade" id="gradeMap">
<id property="uid" column="uid">
<result property="uname" column="u_name">
<result property="pwd" column="pwd">
<collection property="userlist" ofType="Userinfo">
<id property="cid" column="cid" />
<result property="cname" column="cname" />
<result property="cage" column="cage" />
</collection>
</resultMap>
补充2:javaType与ofType的区别
共同点:JavaType和ofType都是用来指定对象类型的。
不同点:JavaType是用来指定pojo中属性的类型,而ofType指定的是映射到list集合属性中pojo的类型。
javaType是< association >(一对一/多对一)中的属性,用于指定从表方的引用实体类。
ofType 是< collection > (用于建立一对多中集合属性的对应关系)的属性,用于指定集合元素的数据类型。
扩展3(注解方式一对多查询 @Many)
一个用户对应多个地址
表一:id uname pwd card_id addressList
表二:id detail(1 肥东、2 肥西、3 长丰、4 瑶海) userid(1 1 1 2)
表一的id与表二的userid对应,addressList定义为集合 (private List
addressList;)
User.class(地址不止一个,使用集合)
AddressMap.java
UsersMapper.java
视图层
还没有评论,来说两句吧...