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文件,输入如下代码:
<?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>
- 这里面<>打头的id、result等都是标签名,而后面的property、column是属性
- 最后一段select是映射查询语句使用的标签
- id:命名空间中唯一的标识符,可用来代表这一句
- resultMap:用于设置返回值类型和映射关系,是上面resultMap中的id的属性值是一种很重要的配置结果映射的方法
- select * from sys_user where id =# {id} 是查询语句
- type:对应查询列所映射到的Java对象类型,此例中映射到实体类SysUser
- column:从数据库(SysUser)中的得到的列名,或是取的别名
- property:映射到列结果的属性,本例中有username这样的简单映射,也可以有"country.city.people"这样的属性嵌套赋值
- 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用法相关推荐
- Mybatis中limit用法与分页查询
数据库使用的是mysql 要想在Mybatis中使用分页查询,首先要清楚mysql中limit的用法. limit a,b a是从第a+1条数据开始,b是指读取几条数据 例如:select * fro ...
- java中select的用法_mybaties中select用法,以及常用增删改查
查询语句是使用 MyBatis 时最常用的元素之一 select元素配置细节如下 属性 描述 取值 默认 id 在这个模式下唯一的标识符,可被其它语句引用 parameterType 传给此语句的参数 ...
- 后端技术:mybatis中resultMap用法示例笔记
1.概念 resultMap属于mybatis返回操作结果的一个标签,可以用来映射select查询出来结果的集合,主要作用是将实体类中的字段与数据库表中的字段进行关联映射.并且支持复杂的返回结果类型. ...
- MyBatis中exists用法
MyBatis框架中的exists用法 exists用法 使用示例 总结 exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内 ...
- MyBatis中foreach用法
foreach用法 SQL语句中有时会使用in关键字,如id in {1,2,3},我们可以使用${ids}方式直接获取值,但是这种方法不能防止SQL注入,想避免SQL注入的话就需要使用#{id}的方 ...
- mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获 ...
- python中select用法_Python select及selectors模块概念用法详解
1. select模块 针对select,要先理解其他几个概念: 文件描述符: 文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开 ...
- Mybatis中column用法
简单记录在开发中使用mybatis遇到的一个问题,也是纠正一下自己的观点: 在学习mybatis的时候,一直理解的是column字段对应的就是数据库中的字段,但是经过开发的一个小插曲得知,column ...
- go中select用法详解
1.主要作用于channel之上 package mainimport ("fmt""time" )//dead_lock产生的一些场景 func main() ...
最新文章
- python哪本好-最好的Python入门教材是哪本?
- cmake交叉编译android,CMake Android 交叉编译
- java设计模式:简单工厂模式
- Python 执行SQL带参数
- Libevent初探
- MyEclipse10的正确破解方法
- 完美解决wordpress邮件链接无效的问题
- 揭秘 IPython 的 5 种最佳调试方法
- png文件头_Golang GinWeb框架7静态文件/模板渲染
- C++的类型转换操作符
- 地址栏js的写法(转载)
- windows安装syslog日志转发客户端nxlog
- “冯唐易老,李广难封”的启示
- AK acm/oj.aabb
- python数据分布统计_Python 数据可视化:数据分布统计图和热图
- 简单粗暴理解【阿姆达尔定律】
- Android反编译锁机文件
- PDF文件怎么翻译成中文
- 二次元究竟意味着什么?(修改版)
- 国内网友设计诺基亚Lumia 930概念机
热门文章
- 分享:2013中国开发者大会(移动和游戏)
- 2012年05月29号这一天,2345浏览器的V1.5版本,是进行改进还是丝毫未变!
- 从996.icu来谈一谈如何高效支配时间
- Linux搭建ElasticSearch(ES)集群并设置密码登录
- 这个低代码平台让企业管理效率翻倍!
- 中国气象年鉴(1986-2021)
- AE脚本:像素破损撕拉花屏效果Datamosh
- hdu(3940)The Angry Birds
- socket的fd是什么?fd是啥的缩写?
- RS485接口中英文液晶语音收银专用密码键盘HX552通讯命令