MyBatis-07MyBatis注解方式之@Select

简介: MyBatis-07MyBatis注解方式之@Select

概述


MyBatis注解方式是将SQL直接注解写在接口上 。 这种方式的优点是对于需求比较简单的系统,效率较高。 缺点是:当SQL有变化时都需要重新编译代码。

一般情况下不建议使用注解的方式。这里仅仅演示下简单的用法,不深究。


@Select注解


使用注解的方式同样需要考虑表字段和Java属性字段映射的问题。我们现在看下通过注解如何完成这项工作


我们以通过Id查询所属的角色为例

通过数据库字段别名方式映射到实体类属性

1. RoleMapper接口增加接口方法,同时标注注解

/**
     * 
     * 
     * @Title: selectSysRoleById
     * 
     * @Description: 采用数据库字段别名和实体类属性同名的方式映射
     * 
     * @param roleId
     * @return
     * 
     * @return: SysRole
     */
    @Select({ "SELECT "
                + " a.id, "
                + " a.role_name roleName, "
                + " a.enabled, "
                + " a.create_by createBy, "
                + " a.create_time createTime "
            + " FROM "
                + " sys_role a "
            + " WHERE "
            + " a.id = #{roleId}" })
    SysRole selectSysRoleById(Long roleId);

2.单元测试

@Test
    public void selectSysRoleByIdTest() {
        logger.info("selectSysRoleByIdTest");
        try {
            // 获取SqlSession
            sqlSession = getSqlSession();
            // 获取接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            // 调用接口方法
            SysRole sysRole = roleMapper.selectSysRoleById((long) 1);
            // 期待不为空
            Assert.assertNotNull(sysRole);
            // 期望为 roleName="管理员"
            Assert.assertEquals("管理员", sysRole.getRoleName());
            logger.info("sysRole Info:" + sysRole);
        } finally {
            sqlSession.close();
        }
    }


日志

2018-04-17 21:37:36,996  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-17 21:37:37,001  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-17 21:37:37,006  INFO [main] (RoleMapperTest.java:19) - selectSysRoleByIdTest
2018-04-17 21:37:37,528 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: SELECT a.id, a.role_name roleName, a.enabled, a.create_by createBy, a.create_time createTime FROM sys_role a WHERE a.id = ? 
2018-04-17 21:37:37,607 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 1(Long)
2018-04-17 21:37:37,627 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, roleName, enabled, createBy, createTime
2018-04-17 21:37:37,627 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 1, 管理员, 1, 1, 2018-04-13 21:12:46.0
2018-04-17 21:37:37,629 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 1
2018-04-17 21:37:37,632  INFO [main] (RoleMapperTest.java:32) - sysRole Info:SysRole [id=1, roleName=管理员, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]


通过mapUnderscoreToCamelCase完成数据库字段到实体类属性的映射

1.MyBatis全局文件settings节点增加如下配置

<!-- 通过配置这个属性为true可以自动将下画线方式命名的数据库列映射到java对象驼峰式命名属性中 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>

2. RoleMapper接口增加接口方法,同时标注注解

/**
     * 
     * 
     * @Title: selectSysRoleById2
     * 
     * @Description: 采用 MyBatis全局配置文件设置 mapUnderscoreToCamelCase 映射
     *               通过配置这个属性为true可以自动将下画线方式命名的数据库列映射到java对象驼峰式命名属性中
     * 
     * @param roleId
     * @return
     * 
     * @return: SysRole
     */
    @Select({ "SELECT "
            + " a.id, "
            + " a.role_name , "
            + " a.enabled, "
            + " a.create_by , "
            + " a.create_time "
        + " FROM "
            + " sys_role a "
        + " WHERE "
        + " a.id = #{roleId}" })
    SysRole selectSysRoleById2(Long roleId);


3.单元测试

/**
     * 
     * 
     * @Title: selectSysRoleByIdTest2
     * 
     * @Description: 测试的时候需要将 <setting name="mapUnderscoreToCamelCase"
     *               value="true"/> 放开
     * 
     * 
     * @return: void
     */
    @Test
    public void selectSysRoleByIdTest2() {
        logger.info("selectSysRoleByIdTest2");
        try {
            // 获取SqlSession
            sqlSession = getSqlSession();
            // 获取接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            // 调用接口方法
            SysRole sysRole = roleMapper.selectSysRoleById2((long) 2);
            // 期待不为空
            Assert.assertNotNull(sysRole);
            // 期望为 roleName="普通用户"
            Assert.assertEquals("普通用户", sysRole.getRoleName());
            logger.info("sysRole Info:" + sysRole);
        } finally {
            sqlSession.close();
        }
    }


2018-04-17 21:38:57,518  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-17 21:38:57,523  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-17 21:38:57,526  INFO [main] (RoleMapperTest.java:51) - selectSysRoleByIdTest2
2018-04-17 21:38:58,057 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: SELECT a.id, a.role_name , a.enabled, a.create_by , a.create_time FROM sys_role a WHERE a.id = ? 
2018-04-17 21:38:58,139 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 2(Long)
2018-04-17 21:38:58,168 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, role_name, enabled, create_by, create_time
2018-04-17 21:38:58,169 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-04-17 21:38:58,172 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 1
2018-04-17 21:38:58,178  INFO [main] (RoleMapperTest.java:64) - sysRole Info:SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]


通过@Results / @ReusltMap注解完成数据库字段到实体类属性的映射


XML中的resultMap元素有一个对应的JavaBean注解@Results,使用这个注解来实现属性映射。


1. RoleMapper接口增加接口方法,同时标注注解

/**
     * 
     * 
     * @Title: selectSysRoleById3
     * 
     * @Description: 通过ResultMap的方式实现数据库列到java对象的映射
     * 
     * @param roleId
     * @return
     * 
     * @return: SysRole
     */
    @Results({ 
        @Result(property = "id", column = "id", id = true),
        @Result(property = "roleName", column = "role_name"),      @Result(property = "enabled", column = "enabled"),
        @Result(property = "createBy", column = "create_by"),  @Result(property = "createTime", column = "create_time")
    })
    @Select({ "SELECT "
            + " a.id, "
            + " a.role_name , "
            + " a.enabled, "
            + " a.create_by , "
            + " a.create_time "
        + " FROM "
            + " sys_role a "
        + " WHERE "
        + " a.id = #{roleId}" })
    SysRole selectSysRoleById3(Long roleId);


这里的@Result注解对应着xml文件中的<result>元素,而参数中协商id = true 时就对应 <id>元素


2.单元测试

@Test
    public void selectSysRoleByIdTest3() {
        logger.info("selectSysRoleByIdTest3");
        try {
            // 获取SqlSession
            sqlSession = getSqlSession();
            // 获取接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            // 调用接口方法
            SysRole sysRole = roleMapper.selectSysRoleById3((long) 2);
            // 期待不为空
            Assert.assertNotNull(sysRole);
            // 期望为 roleName="普通用户"
            Assert.assertEquals("普通用户", sysRole.getRoleName());
            logger.info("sysRole Info:" + sysRole);
        } finally {
            sqlSession.close();
        }
    }


2018-04-17 21:40:09,799  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-17 21:40:09,803  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-17 21:40:09,806  INFO [main] (RoleMapperTest.java:72) - selectSysRoleByIdTest3
2018-04-17 21:40:10,303 DEBUG [main] (BaseJdbcLogger.java:142) - ==>  Preparing: SELECT a.id, a.role_name , a.enabled, a.create_by , a.create_time FROM sys_role a WHERE a.id = ? 
2018-04-17 21:40:10,384 DEBUG [main] (BaseJdbcLogger.java:142) - ==> Parameters: 2(Long)
2018-04-17 21:40:10,412 TRACE [main] (BaseJdbcLogger.java:148) - <==    Columns: id, role_name, enabled, create_by, create_time
2018-04-17 21:40:10,413 TRACE [main] (BaseJdbcLogger.java:148) - <==        Row: 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-04-17 21:40:10,416 DEBUG [main] (BaseJdbcLogger.java:142) - <==      Total: 1
2018-04-17 21:40:10,421  INFO [main] (RoleMapperTest.java:85) - sysRole Info:SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]


@Results的复用


MyBatis 3.3.0及以前版本中,注解定义的@Results不能共用,使用起来很不方便,需要再每个方法上都写一遍。


从MyBatis3.3.1版本开始,@Results注解增加了一个id属性,设置了i属性后,就可以通过id属性引用同一个@Reuslts配置了。

调整Mybatis版本

<mybatis.version>3.4.1</mybatis.version>
@Results(id = "roleResultMap", value = {
  @Result(property = "id", column = "id", id = true), 
  @Result(property = "roleName", column = "role_name"),
  @Result(property = "enabled", column = "enabled"), 
  @Result(property = "createTime", column = "create_time") })

如何引用呢? 通过@ResultMap注解一弄

    /**
     * 
     * 
     * @Title: selectSysRoleById4
     * 
     * @Description: 通过改方法演示在mybatis3.3.1版本及其之后的版本 通过@ResultMap应用带有id的@Results
     * 
     * @param roleId
     * @return
     * 
     * @return: SysRole
     */
    @ResultMap("roleResultMap")
    @Select({
 "SELECT  a.id, a.role_name,  a.enabled, a.create_by ,  a.create_time  FROM  sys_role a " })
    List<SysRole> selectAllSysRole();


单元测试

@Test
    public void selectAllSysTest() {
        logger.info("selectAllSysTest");
        try {
            // 获取SqlSession
            sqlSession = getSqlSession();
            // 获取接口
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            // 调用接口方法
            List<SysRole> sysRoleList = roleMapper.selectAllSysRole();
            // 期待不为空
            Assert.assertNotNull(sysRoleList);
            // 期望为sysRoleList > 0
            Assert.assertTrue(sysRoleList.size() > 0);
            for (SysRole sysRole2 : sysRoleList) {
                logger.info("sysRole Info:" + sysRole2);
            }
        } finally {
            sqlSession.close();
        }
    }



日志

2018-04-17 21:57:03,655  INFO [main] (BaseMapperTest.java:26) - sessionFactory bulit successfully
2018-04-17 21:57:03,659  INFO [main] (BaseMapperTest.java:29) - reader close successfully
2018-04-17 21:57:03,662  INFO [main] (RoleMapperTest.java:95) - selectAllSysTest
2018-04-17 21:57:04,159 DEBUG [main] (BaseJdbcLogger.java:145) - ==>  Preparing: SELECT a.id, a.role_name, a.enabled, a.create_by , a.create_time FROM sys_role a 
2018-04-17 21:57:04,249 DEBUG [main] (BaseJdbcLogger.java:145) - ==> Parameters: 
2018-04-17 21:57:04,295 TRACE [main] (BaseJdbcLogger.java:151) - <==    Columns: id, role_name, enabled, create_by, create_time
2018-04-17 21:57:04,296 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 1, 管理员, 1, 1, 2018-04-13 21:12:46.0
2018-04-17 21:57:04,299 TRACE [main] (BaseJdbcLogger.java:151) - <==        Row: 2, 普通用户, 1, 1, 2018-04-13 21:12:46.0
2018-04-17 21:57:04,300 DEBUG [main] (BaseJdbcLogger.java:145) - <==      Total: 2
2018-04-17 21:57:04,307  INFO [main] (RoleMapperTest.java:109) - sysRole Info:SysRole [id=1, roleName=管理员, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]
2018-04-17 21:57:04,307  INFO [main] (RoleMapperTest.java:109) - sysRole Info:SysRole [id=2, roleName=普通用户, enabled=1, createBy=1, createTime=Fri Apr 13 21:12:46 BOT 2018, user=null, privilegeList=null]


小结


@Select基本的用法我们就说到这里, 接下来看@insert注解

相关文章
|
8月前
|
SQL XML Java
Mybatis基础使用知识(注解)
mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。 最后 mybatis 框架执行sql 并将结果映射为java对象并返回。采用ORM(对象关系映射)思想解决了实体和数据库映射问题,对jdbc进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
538 0
|
11月前
|
SQL XML Java
MyBatis注解的运用于条件搜索实践
通过上述的实践,我们可以看出MyBatis注解不仅能够实现条件搜索的需求,还能够提供灵活而强大的SQL构造能力,极大地简化了代码的复杂度,提高了开发效率。在实际的项目开发中,结合实际的业务需求合理选择MyBatis的配置方式(注解或XML),能够让数据持久层代码变得更加清晰和易维护。
194 11
|
存储 Java 数据库连接
Mybatisplus中的主要使用注解
3.有些注解需要配合其他配置使用。例如,@Version需要配合乐观锁插件使用,@EnumValue需要配合对应的TypeHandler使用。
550 11
|
SQL XML Java
MyBatis——选择混合模式还是全注解模式?
在MyBatis开发中,Mapper接口的实现方式有两种:全注解模式和混合模式。全注解模式直接将SQL嵌入代码,适合小规模、简单逻辑项目,优点是直观简洁,但复杂查询时代码臃肿、扩展性差。混合模式采用接口+XML配置分离的方式,适合大规模、复杂查询场景,具备更高灵活性与可维护性,但学习成本较高且调试不便。根据项目需求与团队协作情况选择合适模式至关重要。
283 4
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
2500 6
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1127 0
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
808 5
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
749 3
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
1436 3
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
1049 1