使用MyBatis时,只需要在XML中添加一个select元素,写一个SQL,再做一些简单的配置就可以实现映射
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文件,输入如下代码:
namespace是根标签mapper的属性,当Mapper接口和XML文件关联的时候,命名空间namespace的值就需要配置成接口的全限定名称,MyBatis内部就是通过这个值将接口和XML关联起来的
还需要在mybatis-config.xml配置文件中的mappers元素中配置所有的mapper,部分配置代码如下:
...
上述方法较复杂,也可采用如下方法循环查找接口并解析:
使用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 selectAll(); *这里要返回多个SysUser类型的元素,所以用数组来实现*
}
然后要在对应的UserMapper.xml中添加如下resultMapper和select部分的代码
type="import后面的内容"
...
等价于
<!--其他配置-->
*这是自动将下划线方式命名的数据库列映射到Java对象的驼峰式命名属性中,在mybatis-config.xml文件中添加如上设置,设置为true,下面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()
...
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 userList =userMapper.selectAll();
//结果不为空
Assert.assertNotNull(UserList);
//用户数量大于0个
Assert.assertTrue(userList.size()>0);
}finally{
sqlSession.close();
}
}
}
首先将方法添加到UserMapper中
public ~~class~~ interface UserMapper{
@param id
@return
SysUser selectById(Long id); *通过主键id查询,最多只有1条记录,所以返回值是SysUser*
List selectAll(); *这里要返回多个SysUser类型的元素,所以用数组来实现*
List selectRoleByUserId(Long userId);
}
接着在UserMapper.xml中添加如下代码:
假设不仅要获取sys_role的信息,还要获取用户的其他部分信息,该怎么解决呢? 下面提供一个较简便的方法
在SysRole实体类中增加一个对象,后修改XML中的selectRolesByUserId方法
public ~~class~~ interface UserMapper{
@param id
@return
SysUser selectById(Long id); *通过主键id查询,最多只有1条记录,所以返回值是SysUser*
List selectAll(); *这里要返回多个SysUser类型的元素,所以用数组来实现*
List selectRoleByUserId(Long userId);
//增加一个对象
private SysUser user;
}
在UserMapperTest中执行如下测试代码:
@Test
public void testSelectRolesByUserId(){
sqlSession SqlSession = getSqlSession();
try{
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
//调用selectRolesByUserId方法查询用户的角色
List roleList =userMapper.selectRolesByUserId(1L);
Assert.assertNotNull(roleList);
//角色数量大于0个
Assert.assertTrue(roleList.size()>0);
}finally{
sqlSession.close();
}
}
可以看到角色的用户名、邮箱等