@mapper注解的使用_MyBatis多表联查,注解和工作原理

  • resultMap
  • ResultMap用于自定义映射关系, 可以由程序员自主制定
  • 列名和属性名的映射关系. 一旦使用 resultMap, 表示不再采用自动映射机制.
  • 使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。
  • 但是需要声明一个resultMap,来对列名和属性名进行映射。
  • resultType和resultMap的区别
  • resultType表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配,列名和映射的属性名必须一致。
  • ResultMap表示不再采用自动映射机制,不需要查询的列名和映射的属性名必须一致。
  • MyBatis实现多表关联查询方式:
  1. 业务装配
  2. 单个对象N+1
  3. 关联方式多对一
  4. 集合对象N+1
  5. 集合对象关联方式
  6. Auto-Mapping自动映射

业务装配

  • mapper 层:
  • 只做单表查询操作, 在 service 层进行手动装配,
  • 实现关联查询的结果.
  • 实体类:
  • 创建班级类(Clazz)和学生类(Student), 并在 Student 中添
  • 加一个 Clazz 类型的属性, 用于表示学生的班级信息.
  • Mapper层:
  • 提供StudentMapper和ClazzMapper, StudentMapper查询所
  • 有学生信息, ClazzMapper 根据编号查询班级信息.
  • Service层:
  • 调用 mapper 层, 先查询所有学生, 再根据每个学生的班级
  • 编号查询班级信息, 手动进行组装, 称之为业务装配.
  • 代码示例:

Mapper层:

v2-0759cb301742dce446fa2eb8fae91ce8_b.jpg

v2-e6479a8d451a530171d308bcfcf1e580_b.jpg

业务层

v2-902419e53f1daba5dbc62326f26211e6_b.jpg

测试类

v2-9c20533bfbed9c6efe1a27baeaf0cf47_b.jpg

单个对象N+1:

  • 实体类
  • 创建班级类(Clazz)和学生类(Student), 并在 Student 中添
  • 加一个 Clazz 类型的属性, 用于表示学生的班级信息.
  • mapper 层
  • 提供StudentMapper和ClazzMapper,
  • StudentMapper查询所有学生信息, ClazzMapper 根据编号查询班级信息.
  • 在StudentMapper 中使用<association>设置装配.
  • service 层
  • 由于装配已经完成, service 层只需要调用 mapper 即可, 不
  • 需要再进行装配了.

Mapper层:

v2-606bec211e0127d532a8d183cc4e9706_b.jpg

v2-84a5d7543d3c95185b7e6748eb40aae4_b.jpg

业务层:

v2-d4e293405372915062c9c54679dee01a_b.jpg

测试类:

v2-23b6d923198c7a49d8c7c87d24a00746_b.jpg

关联方式多对一

mapper 层

  • 在ClaszMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.通过<resultMap>定义映射关系, 并通过<association>指定对象属性的映射关系. 可以把<association>看成一个<resultMap>使用.
  • 代码示例:

mapper 层

v2-2cd612aebeabc51d9de67e58c8c4f046_b.jpg

业务层:

v2-2e6696a52246a7a692f85a01a8851cb9_b.jpg

测试类:

v2-f9ffb6b0ef6669555030533926ea162a_b.jpg
  • 也可以用左外连接查询 在StudentMapper.xml 中定义多表连接查询 SQL 语句, 一
  • 次性查到需要的所有数据, 包括对应班级的信息.

v2-055f1daa4c8446ab8d872e01ea6d4b16_b.jpg

集合对象N+1

mapper 层

  • 提供ClazzMapper和StudentMapper, ClazzMapper查询所有班级信息,
  • StudentMapper 根据班级编号查询学生信息.
  • 在 ClazzMapper 中使用<collection>设置装配.

mapper 层

v2-7eebf33a5f3e14f61e80ff21170440f0_b.jpg

v2-986538d14f5262fdb9f3f21a56c14f97_b.jpg

业务层:

v2-c8570c627aa2d8bf7408096464da539f_b.jpg

测试类:

v2-1304ff1854379150293bbebde69ee563_b.jpg

集合对象关联方式

mapper层:

  • 在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.
  • 通过<resultMap>定义映射关系, 并通过<collection>指定集合属性泛型的映射关系. 可以把<collection>看成一个<resultMap>使用.

mapper层

v2-dd147bc2c0c03e496ebf08c73d562e3a_b.jpg

v2-a1632ff71b259d015826c0d4343fc1e1_b.jpg

service层:

v2-2bf1bb41fca7272222e95a4dbd852cf8_b.jpg

测试类:

v2-aee20bb76fcdb62291273da5f215283b_b.jpg

Auto-Mapping自动映射

Mapper层:

  • 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.
  • SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号, Oracle 可以使用("")符号.

代码示例:

Mapper层:

v2-33dcfb92bcd0b4fc242fe693553a9248_b.jpg

业务层:

v2-3792087f85a48a62f8683afe3df90bb0_b.jpg

测试类:

v2-0922cced7124031f83f86f1116756856_b.jpg

注解开发

  • 注解是用于描述代码的代码. 例如: @Test(用于描述方法进行 junit 测试), @Override(用于描述方法的重写),@Param(用于描述属性的名称)
  • 注解的使用风格: @xxx(属性), 使用前必须先导包
  • 使用注解一般用于简化配置文件. 但是, 注解有时候也不是很友好(有时候反而更麻烦), 例如动态 SQL.
  • 注解和配置文件可以配合使用

注解的属性

  • 属性的设定方式是: 属性名=属性值
  • 基本类型和 String, 可以直接使用双引号的形式
  • 数组类型, name={值 1, 值 2, ...}; 如果数组元素只有一个, 可以省略大括号
  • 对象类型, name=@对象名(属性)
  • 如果属性是该注解的默认属性, 而且该注解只配置这一个属性, 可以将属性名省略

MyBatis 中常用的注解

CRUD 注解

  • @Select: 类似于<select>
  • @Insert: 类似于<insert>
  • @Update: 类似于<update>
  • @Delete: 类似于<delete>

v2-5efe6a20a341e7061f991d9cd4228bdd_b.jpg

其他注解

  • @Results: 类似于<resultMap>
  • @Result: 类似于<resultMap>的子标签
  • @One: 类似于<association>
  • @Many: 类似于<collection>

v2-98831f9e893409ba5457d97d6f59cc27_b.jpg

v2-c2cdcb29eb6dac149b21451fca7a6f7b_b.jpg

MyBatis 运行原理

运行过程中涉及到的类或接口

  • Resources(C)
  • 用于加载 MyBatis 核心配置文件
  • XMLConfigBuilder(C)
  • 用于解析 xml 文件(核心配置文件)
  • Configuration(C)
  • 用于存放 xml 文件解析后的结果
  • DefaultSqlSessionFactory(C)
  • 是 SqlSessionFactory(I)的 实 现 类 , 创 建 时 需 要 使 用Configuration 对象
  • SqlSession(I)
  • 是 MyBatis 操作的核心
  • DefaultSqlSession(C)
  • 是 SqlSession 接口的实现类
  • TransactionFactory(I)
  • 用于生产 Transaction 对象
  • Transaction(I)
  • 用于表示操作数据库的事务对象
  • Executor(I)
  • 是 MyBatis 的核心执行器, 类似于 jdbc 中的 Statement, 常用的实现类是 SimpleExecutor
  • 当 MyBatis 运行开始时, 先要通过 Resources 加载核心 配置文件,
  • 之后使用 XMLConfigBuilder 对配置文件进行解析,将解析结果封
  • 装为Configuration对象, 接着, 使用Configuration对象构建一个DefaultSqlSessionFactory对象, 至此,SqlSession工厂构建完成.
  • 接下来, 通过工厂对象调用openSession方法创建SqlSession对象.
  • 在这个过程中,需 要 通 过TransactionFactory 生成 Transaction 对象,
  • 并且, 还需要创建核心执行器Executor对象, 之后, 通过这些对象来创
  • 建DefaultSqlSession对象, 至此, SqlSession对象创建成
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,@Mapper注解Mybatis框架中用于标识数据访问层接口的注解,用于告诉Spring容器将该接口实例化并注入到其他Bean中。其使用步骤如下: 1. 在Spring Boot项目中引入MybatisMybatis-Spring的依赖 2. 在配置文件中配置数据源和Mybatis的相关属性 3. 创建一个数据访问层接口,使用@Mapper注解标识该接口 4. 在该数据访问层接口中定义需要操作的数据库方法 5. 在Service或Controller中注入该数据访问层接口的实例,并调用其中的方法 下面是一个示例: 1. 在pom.xml中添加MybatisMybatis-Spring的依赖: ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> ``` 2. 在application.properties中配置数据源和Mybatis的相关属性: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 mybatis.type-aliases-package=com.example.demo.entity mybatis.mapper-locations=classpath:mapper/*.xml ``` 3. 创建一个数据访问层接口UserMapper使用@Mapper注解标识该接口: ```java @Mapper public interface UserMapper { User selectByPrimaryKey(Integer id); int insert(User record); int updateByPrimaryKey(User record); int deleteByPrimaryKey(Integer id); } ``` 4. 在mapper目录下创建UserMapper.xml,定义需要操作的数据库方法: ```xml <mapper namespace="com.example.demo.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.example.demo.entity.User"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="username" property="username" jdbcType="VARCHAR"/> <result column="password" property="password" jdbcType="VARCHAR"/> </resultMap> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer"> select * from user where id = #{id,jdbcType=INTEGER} </select> <insert id="insert" parameterType="com.example.demo.entity.User" useGeneratedKeys="true" keyProperty="id"> insert into user (username, password) values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}) </insert> <update id="updateByPrimaryKey" parameterType="com.example.demo.entity.User"> update user set username = #{username,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} </update> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> delete from user where id = #{id,jdbcType=INTEGER} </delete> </mapper> ``` 5. 在Service或Controller中注入UserMapper的实例,并调用其中的方法: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User selectByPrimaryKey(Integer id) { return userMapper.selectByPrimaryKey(id); } @Override public int insert(User user) { return userMapper.insert(user); } @Override public int updateByPrimaryKey(User user) { return userMapper.updateByPrimaryKey(user); } @Override public int deleteByPrimaryKey(Integer id) { return userMapper.deleteByPrimaryKey(id); } } ``` 这就是使用@Mapper注解的基本步骤,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值