经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
Mybatis如何使用@Mapper和@MapperScan注解实现映射关系
来源:jb51  时间:2021/10/8 13:06:11  对本文有异议

使用@Mapper和@MapperScan注解实现映射关系

MyBatis与Spring整合后需要实现实体和数据表的映射关系。

实现实体和数据表的映射关系可以在Mapper类上添加@Mapper注解,如下代码:

  1. /**
  2. * 用户信息Mapper动态代理接口
  3. * @author pan_junbiao
  4. **/
  5. @Mapper
  6. @Repository
  7. public interface UserMapper
  8. {
  9. /**
  10. * 新增用户,并获取自增主键
  11. */
  12. @Insert("INSERT INTO tb_user(user_account,user_password,blog_url,blog_remark) VALUES(#{userAccount},#{userPassword},#{blogUrl},#{blogRemark})")
  13. @Options(useGeneratedKeys = true, keyColumn = "user_id", keyProperty = "userId")
  14. //或者:@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyColumn = "user_id", keyProperty = "userId",before = false, resultType = Integer.class)
  15. public int insertUser(UserInfo userInfo);
  16. /**
  17. * 修改用户
  18. */
  19. @Update("UPDATE tb_user SET user_account = #{userAccount} ,user_password = #{userPassword} ,blog_url=#{blogUrl} ,blog_remark=#{blogRemark} WHERE user_id = #{userId}")
  20. public int updateUser(UserInfo userInfo);
  21. /**
  22. * 删除用户
  23. */
  24. @Delete("DELETE FROM tb_user WHERE user_id = #{userId}")
  25. public int deleteUser(int userId);
  26. /**
  27. * 根据用户ID,获取用户信息
  28. */
  29. @Select("SELECT * FROM tb_user WHERE user_id = #{userId}")
  30. public UserInfo getUserById(int userId);
  31. }

但是建议以后直接在SpringBoot启动类中加 @MapperScan("com.pjb.mapper") 注解,这样会比较方便,不需要对每个Mapper都添加@Mapper注解。

  1. package com.pjb;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. /**
  6. * SpringBoot启动类
  7. * @author pan_junbiao
  8. **/
  9. @MapperScan("com.pjb.mapper")
  10. @SpringBootApplication
  11. public class SpringbootMybatisDemoApplication
  12. {
  13. public static void main(String[] args)
  14. {
  15. SpringApplication.run(SpringbootMybatisDemoApplication.class, args);
  16. }
  17. }

Mybatis-@MapperScan和mybatis:scan分析

MyBatis-Spring-1.2.0 新增了两种新的扫描映射器 Mapper 接口的方法:

  • 使用<mybatis:scan/>元素
  • 使用@MapperScan 注解(需要 Spring3.1+版本)

<mybatis:scan>

<mybatis:scan>元素将在特定的以逗号分隔的包名列表中搜索映射器 Mapper 接口。 使用这个新的 MyBatis-Spring 名空间你需要添加以下的 schema 声明:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://mybatis.org/schema/mybatis-spring
  7. http://mybatis.org/schema/mybatis-spring.xsd">
  8. <mybatis:scan base-package="com.mybatis.x.mappers" />
  9. </beans>

<mybatis:scan> 元素提供了下列的属性来自定义扫描过程:

  • annotation:扫描器将注册所有的在 base-package 包内并且匹配指定注解的映射器 Mapper 接口。
  • factory - ref:当 Spring 上下文中有多个SqlSessionFactory实例时,需要指定某一特定的SqlSessionFactory 来创建映射器 Mapper 接口。正常情况下,只有应用程序中有一个以上的数据源才会使用。
  • marker - interface:扫描器将注册在 base-package 包中的并且继承了特定的接口类的映射器 Mapper 接口
  • template - ref:当 Spring 上下文中有多个 SqlSessionTemplate 实例时,需要指定某一特定的SqlSessionTemplate 来创建映射器 Mapper 接口。 正常情况下,只有应用程序中有一个以上的数据源才会使用。
  • name-generator:BeannameGenerator 类的完全限定类名,用来命名检测到的组件。

MapperScan

Spring 3.x+版本支持使用@Configuration 和@Bean 注解来提供基于 Java 的配置。如果使用基于java的配置,可以使用@MapperScan 注解来扫描映射器 Mapper 接口。 @MapperScan 和<mybatis:scan/>工作方式

相同,并且也提供了对应的自定义选项。

  1. @Configuration
  2. @MapperScan("com.mybatis.x.mappers")
  3. public class AppConfig
  4. {
  5. @Bean
  6. public DataSource dataSource()
  7. {
  8. return new PooledDataSource("com.mysql.jdbc.Driver",
  9. "jdbc:mysql://localhost:3306/test", "root", "root");
  10. }
  11. @Bean
  12. public SqlSessionFactory sqlSessionFactory() throws Exception
  13. {
  14. SqlSessionFactoryBeansessionFactory = new
  15. SqlSessionFactoryBean();
  16. sessionFactory.setDataSource(dataSource());
  17. return sessionFactory.getObject();
  18. }
  19. }

@MapperScan 注解有以下属性供自定义扫描过程使用:

  • annotationClass:扫描器将注册所有的在 base-package 包内并且匹配指定注解的映射器 Mapper 接口。
  • markerInterface:扫描器将注册在 base-package 包中的并且继承了特定的接口类的映射器 Mapper 接口
  • sqlSessionFactoryRef:当Spring上下文中有一个以上的 SqlSesssionFactory时,用来指定特 SqlSessionFactory
  • sqlSessionTemplateRef:当Spring上下文中有一个以上的 sqlSessionTemplate时,用来指定特定sqlSessionTemplate
  • nameGenerator:BeanNameGenerator 类用来命名在 Spring 容器内检测到的组件。
  • basePackageClasses:basePackages() 的类型安全的替代品。包内的每一个类都会被扫描。
  • basePackages:扫描器扫描的基包,扫描器会扫描内部的 Mapper 接口。注意包内的至少有一个方法声明的才会被注册。具体类将会被忽略。

当然还可以在 applicationContext.xml 配置如下

  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="basePackage" value="com.mybatis3.mappers" />
  3. </bean>

使用 MapperScannerConfigurer 来扫描包 package ("com.mybatis3.mappers")下的所有 映射器 Mapper 接口,并自动地注册

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号