MyBatis-07MyBatis注解方式之@Select
生活随笔
收集整理的這篇文章主要介紹了
MyBatis-07MyBatis注解方式之@Select
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
- 概述
- @Select注解
- 通過數(shù)據(jù)庫字段別名方式映射到實體類屬性
- 1. RoleMapper接口增加接口方法,同時標(biāo)注注解
- 2.單元測試
- 通過mapUnderscoreToCamelCase完成數(shù)據(jù)庫字段到實體類屬性的映射
- 1.MyBatis全局文件settings節(jié)點增加如下配置
- 2. RoleMapper接口增加接口方法,同時標(biāo)注注解
- 3.單元測試
- 通過@Results / @ReusltMap注解完成數(shù)據(jù)庫字段到實體類屬性的映射
- 1. RoleMapper接口增加接口方法,同時標(biāo)注注解
- 2.單元測試
- @Results的復(fù)用
- 通過數(shù)據(jù)庫字段別名方式映射到實體類屬性
- 小結(jié)
概述
MyBatis注解方式是將SQL直接注解寫在接口上 。 這種方式的優(yōu)點是對于需求比較簡單的系統(tǒng),效率較高。 缺點是:當(dāng)SQL有變化時都需要重新編譯代碼。
一般情況下不建議使用注解的方式。這里僅僅演示下簡單的用法,不深究。
@Select注解
使用注解的方式同樣需要考慮表字段和Java屬性字段映射的問題。我們現(xiàn)在看下通過注解如何完成這項工作
我們以通過Id查詢所屬的角色為例
通過數(shù)據(jù)庫字段別名方式映射到實體類屬性
1. RoleMapper接口增加接口方法,同時標(biāo)注注解
/*** * * @Title: selectSysRoleById* * @Description: 采用數(shù)據(jù)庫字段別名和實體類屬性同名的方式映射* * @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.單元測試
@Testpublic void selectSysRoleByIdTest() {logger.info("selectSysRoleByIdTest");try {// 獲取SqlSessionsqlSession = getSqlSession();// 獲取接口RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);// 調(diào)用接口方法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完成數(shù)據(jù)庫字段到實體類屬性的映射
1.MyBatis全局文件settings節(jié)點增加如下配置
<!-- 通過配置這個屬性為true可以自動將下畫線方式命名的數(shù)據(jù)庫列映射到j(luò)ava對象駝峰式命名屬性中 --> <setting name="mapUnderscoreToCamelCase" value="true"/>2. RoleMapper接口增加接口方法,同時標(biāo)注注解
/*** * * @Title: selectSysRoleById2* * @Description: 采用 MyBatis全局配置文件設(shè)置 mapUnderscoreToCamelCase 映射* 通過配置這個屬性為true可以自動將下畫線方式命名的數(shù)據(jù)庫列映射到j(luò)ava對象駝峰式命名屬性中* * @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*/@Testpublic void selectSysRoleByIdTest2() {logger.info("selectSysRoleByIdTest2");try {// 獲取SqlSessionsqlSession = getSqlSession();// 獲取接口RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);// 調(diào)用接口方法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注解完成數(shù)據(jù)庫字段到實體類屬性的映射
XML中的resultMap元素有一個對應(yīng)的JavaBean注解@Results,使用這個注解來實現(xiàn)屬性映射。
1. RoleMapper接口增加接口方法,同時標(biāo)注注解
/*** * * @Title: selectSysRoleById3* * @Description: 通過ResultMap的方式實現(xiàn)數(shù)據(jù)庫列到j(luò)ava對象的映射* * @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注解對應(yīng)著xml文件中的<result>元素,而參數(shù)中協(xié)商id = true 時就對應(yīng) <id>元素
2.單元測試
@Testpublic void selectSysRoleByIdTest3() {logger.info("selectSysRoleByIdTest3");try {// 獲取SqlSessionsqlSession = getSqlSession();// 獲取接口RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);// 調(diào)用接口方法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的復(fù)用
MyBatis 3.3.0及以前版本中,注解定義的@Results不能共用,使用起來很不方便,需要再每個方法上都寫一遍。
從MyBatis3.3.1版本開始,@Results注解增加了一個id屬性,設(shè)置了i屬性后,就可以通過id屬性引用同一個@Reuslts配置了。
調(diào)整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應(yīng)用帶有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();單元測試
@Testpublic void selectAllSysTest() {logger.info("selectAllSysTest");try {// 獲取SqlSessionsqlSession = getSqlSession();// 獲取接口RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);// 調(diào)用接口方法List<SysRole> sysRoleList = roleMapper.selectAllSysRole();// 期待不為空Assert.assertNotNull(sysRoleList);// 期望為sysRoleList > 0Assert.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]小結(jié)
@Select基本的用法我們就說到這里, 接下來看@insert注解
總結(jié)
以上是生活随笔為你收集整理的MyBatis-07MyBatis注解方式之@Select的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-06 MyBatis X
- 下一篇: MyBatis-08MyBatis注解方