MyBatis中select用法

使用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文件,输入如下代码:





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

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


     
      
      ...
    

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


     

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  selectAll();  *这里要返回多个SysUser类型的元素,所以用数组来实现*
}

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

  • resultMapper部分:
  type="import后面的内容"



...



  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部分:

      

等价于


  <!--其他配置-->
  
  
  *这是自动将下划线方式命名的数据库列映射到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()
...

尝试编写一个简单的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 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  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();
      }
   }
  

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

你可能感兴趣的:(MyBatis,select入门用法)