使用MyBatis时,只需要在XML中添加一个select元素,写一个SQL,再做一些简单的配置就可以实现映射

使用XML方式

MyBatis支持用接口来调用方法,通过参数注解@param设置参数名字省去手动构造Map参数的过程
先创建五个表各自对应的xml文件,分别为UserMapper.xml RoleMapper.xml PrivilegeMapper.xml UserRoleMapper.xml RolePrivilegeMapper.xml ,接着在src/main/java下面创建包tk.mybatis.simple.mapper,再在该包下创建XML文件对应的接口类,分别为:UserMapper.java RoleMapper.java PrivilegeMapper.java UserRoleMapper.java RolePrivilegeMapper.java

接着添加接口方法,打开UserMapper.xml文件,输入如下代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="tk.mybatis.simple.UserMapper">
</mapper>

namespace是根标签mapper的属性,当Mapper接口和XML文件关联的时候,命名空间namespace的值就需要配置成接口的全限定名称,MyBatis内部就是通过这个值将接口和XML关联起来的

还需要在mybatis-config.xml配置文件中的mappers元素中配置所有的mapper,部分配置代码如下:

<mappers><mapper resource="tk/mybatis/simple/mapper/CountryMapper.xml"/><mapper resource="tk/mybatis/simple/mapper/UserMapper.xml"/>...</mappers>

上述方法较复杂,也可采用如下方法循环查找接口并解析:

<mappers><package name ="tk.mybatis.simple.mapper"/>
</mappers>

select用法 —通过id查找

使用MyBatis时,只需要在XML中添加一个select元素,写一个SQL(结构化查询语言),做一些简单配置即可将查询结果映射到对象上

在userMapper接口中添加一个selectById方法

package ...
import tk.mybatis.simple.model.SysUser  *等价于tk/mybatis/simple/mapper/UserMapper.xml*
public ~~class~~ interface UserMapper{
@param id
@return
SysUser selectById(Long id);  *通过主键id查询,最多只有1条记录,所以返回值是SysUser*
List <SysUser> selectAll();  *这里要返回多个SysUser类型的元素,所以用数组来实现*
}

然后要在对应的UserMapper.xml中添加如下resultMapper和select部分的代码

  • resultMapper部分:
<resultMap id ="UserMap">  type="import后面的内容"
<id property ="id" column="id"/>
<result property ="userName"  column ="user_name"/>
<result property ="userPasword"  column ="user_password"/>
...
</resultMap><select id="selectById" resultMap="userMap">select * from sys_user where id =# {id}</select>
  1. 这里面<>打头的id、result等都是标签名,而后面的property、column是属性
  2. 最后一段select是映射查询语句使用的标签
  3. id:命名空间中唯一的标识符,可用来代表这一句
  4. resultMap:用于设置返回值类型和映射关系,是上面resultMap中的id的属性值是一种很重要的配置结果映射的方法
  5. select * from sys_user where id =# {id} 是查询语句
  6. type:对应查询列所映射到的Java对象类型,此例中映射到实体类SysUser
  7. column:从数据库(SysUser)中的得到的列名,或是取的别名
  8. property:映射到列结果的属性,本例中有username这样的简单映射,也可以有"country.city.people"这样的属性嵌套赋值
  9. jdbcType:列对应的数据库类型,仅仅需要对插入、更新、删除操作可能为空的列进行处理
  • select部分:
<select id ="selectAll" resultType="tk.mybatis.simple.model.SysUser">select id ,user_name userName,user_password userPassword,user_email userEmail,...from sys_user
</select>

等价于

<settings><!--其他配置--><setting name="mapUnderscoreToCameCase" value="true"/></settings>*这是自动将下划线方式命名的数据库列映射到Java对象的驼峰式命名属性中,在mybatis-config.xml文件中添加如上设置,设置为true,下面select方法就不用取别名*
<select id ="selectAll" resultType="tk.mybatis.simple.model.SysUser">select id ,user_name ,user_password ,user_email ,...from sys_user
</select>

selectById 和selectAll的区别:

前者通过resultMap来设置结果映射,后者通过resultType直接指定返回结果的类型,需要在SQL中为所有列名和属性名不一致的列设置别名,使最终的查询结果列和resultType指定对象的属性名(property)保持一致

另:Sysuser是用户表对应的实体类,要最先创建,包含声明和封装。代码节选:

public class Sysuser{
private Long id;
private String userName;
private String userPassword;
private String userEmail;
...
setter()
getter()
...

尝试编写一个简单的UserMapperTest测试类

public class UserMapperTest extends BaseMapperTest{
@Test
public void testSelectById(){
//获取sqlSession
SqlSession sqlSession = getSqlSession();
try{
//获取UserMapper接口
UserMapper UserMapper =sqlSession.getMapper(UserMapper.class);
//调用selectById方法,查询id=5的用户
SysUser user =userMapper.selectById(5L);
//User不为空
Assert.assertEquals("admin",user.getUserName());
}finally{
//不要忘记关闭sqlSession
sqlSession.close();}
}@Test
public void testSelectAll() {
SqlSession sqlSession= getSqlsession();
try{
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
//调用selectAll方法查询所有用户
List<SysUser> userList =userMapper.selectAll();
//结果不为空
Assert.assertNotNull(UserList);
//用户数量大于0个
Assert.assertTrue(userList.size()>0);
}finally{
sqlSession.close();}}
}

编写一个简单的UserMapperTest测试类获取用户拥有的所有角色

首先将方法添加到UserMapper中

public ~~class~~ interface UserMapper{
@param id
@return
SysUser selectById(Long id);  *通过主键id查询,最多只有1条记录,所以返回值是SysUser*
List <SysUser> selectAll();  *这里要返回多个SysUser类型的元素,所以用数组来实现*
List <SysRole> selectRoleByUserId(Long userId);
}

接着在UserMapper.xml中添加如下代码:

<select id ="selectRolesByUserId" resultType ="tk.mybatis.simple.model.SysRole">
select r.id,r.role_name roleName,r.enabled,r.create_by createBy,r.create_time createTimefrom sy_user uinner join sys_user_role ur on u.id =ur.user_idinner join sys_role r on ur.role_id =r.idwhere u.id =#{userId}</select>

假设不仅要获取sys_role的信息,还要获取用户的其他部分信息,该怎么解决呢? 下面提供一个较简便的方法
在SysRole实体类中增加一个对象,后修改XML中的selectRolesByUserId方法

public ~~class~~ interface UserMapper{
@param id
@return
SysUser selectById(Long id);  *通过主键id查询,最多只有1条记录,所以返回值是SysUser*
List <SysUser> selectAll();  *这里要返回多个SysUser类型的元素,所以用数组来实现*
List <SysRole> selectRoleByUserId(Long userId);//增加一个对象
private SysUser user;
}
<select id ="selectRolesByUserId" resultType ="tk.mybatis.simple.model.SysRole">
select r.id,r.role_name roleName,r.enabled,r.create_by createBy,r.create_time createTime*u.user_name(别名) as "user(属性).userName"*  **u.user_email as "user.userEmail"**from sy_user uinner join sys_user_role ur on u.id =ur.user_idinner join sys_role r on ur.role_id =r.idwhere u.id =#{userId}</select>

在UserMapperTest中执行如下测试代码:

@Test
public void testSelectRolesByUserId(){sqlSession SqlSession = getSqlSession();try{UserMapper userMapper =sqlSession.getMapper(UserMapper.class);//调用selectRolesByUserId方法查询用户的角色List<SysRole> roleList =userMapper.selectRolesByUserId(1L);Assert.assertNotNull(roleList);
//角色数量大于0个
Assert.assertTrue(roleList.size()>0);
}finally{
sqlSession.close();}}

可以看到角色的用户名、邮箱等

MyBatis中select用法相关推荐

  1. Mybatis中limit用法与分页查询

    数据库使用的是mysql 要想在Mybatis中使用分页查询,首先要清楚mysql中limit的用法. limit a,b a是从第a+1条数据开始,b是指读取几条数据 例如:select * fro ...

  2. java中select的用法_mybaties中select用法,以及常用增删改查

    查询语句是使用 MyBatis 时最常用的元素之一 select元素配置细节如下 属性 描述 取值 默认 id 在这个模式下唯一的标识符,可被其它语句引用 parameterType 传给此语句的参数 ...

  3. 后端技术:mybatis中resultMap用法示例笔记

    1.概念 resultMap属于mybatis返回操作结果的一个标签,可以用来映射select查询出来结果的集合,主要作用是将实体类中的字段与数据库表中的字段进行关联映射.并且支持复杂的返回结果类型. ...

  4. MyBatis中exists用法

    MyBatis框架中的exists用法 exists用法 使用示例 总结 exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内 ...

  5. MyBatis中foreach用法

    foreach用法 SQL语句中有时会使用in关键字,如id in {1,2,3},我们可以使用${ids}方式直接获取值,但是这种方法不能防止SQL注入,想避免SQL注入的话就需要使用#{id}的方 ...

  6. mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录    在项目中经常需要获 ...

  7. python中select用法_Python select及selectors模块概念用法详解

    1. select模块 针对select,要先理解其他几个概念: 文件描述符: 文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开 ...

  8. Mybatis中column用法

    简单记录在开发中使用mybatis遇到的一个问题,也是纠正一下自己的观点: 在学习mybatis的时候,一直理解的是column字段对应的就是数据库中的字段,但是经过开发的一个小插曲得知,column ...

  9. go中select用法详解

    1.主要作用于channel之上 package mainimport ("fmt""time" )//dead_lock产生的一些场景 func main() ...

最新文章

  1. python哪本好-最好的Python入门教材是哪本?
  2. cmake交叉编译android,CMake Android 交叉编译
  3. java设计模式:简单工厂模式
  4. Python 执行SQL带参数
  5. Libevent初探
  6. MyEclipse10的正确破解方法
  7. 完美解决wordpress邮件链接无效的问题
  8. 揭秘 IPython 的 5 种最佳调试方法
  9. png文件头_Golang GinWeb框架7静态文件/模板渲染
  10. C++的类型转换操作符
  11. 地址栏js的写法(转载)
  12. windows安装syslog日志转发客户端nxlog
  13. “冯唐易老,李广难封”的启示
  14. AK acm/oj.aabb
  15. python数据分布统计_Python 数据可视化:数据分布统计图和热图
  16. 简单粗暴理解【阿姆达尔定律】
  17. Android反编译锁机文件
  18. PDF文件怎么翻译成中文
  19. 二次元究竟意味着什么?(修改版)
  20. 国内网友设计诺基亚Lumia 930概念机

热门文章

  1. 分享:2013中国开发者大会(移动和游戏)
  2. 2012年05月29号这一天,2345浏览器的V1.5版本,是进行改进还是丝毫未变!
  3. 从996.icu来谈一谈如何高效支配时间
  4. Linux搭建ElasticSearch(ES)集群并设置密码登录
  5. 这个低代码平台让企业管理效率翻倍!
  6. 中国气象年鉴(1986-2021)
  7. AE脚本:像素破损撕拉花屏效果Datamosh
  8. hdu(3940)The Angry Birds
  9. socket的fd是什么?fd是啥的缩写?
  10. RS485接口中英文液晶语音收银专用密码键盘HX552通讯命令