1.如何实现一条单一条件查询?
如果仅仅是传入一个简单数据类型的查询条件,如一个基本数据类型或其他包装类型,或一个String类型等等,Mybatis框架的处理方式也非常的简单。以实现根据用户的真实姓名模糊匹配来查询用户信息为例子。
(1)在SysUserMapper 接口中添加员工查询方法
/**
* 根据用户的真实姓名模糊匹配查询用户,参数realName 为需要传递给SQL语句的查询条件
*/
public List<SysUser> getUserByRealName(String realName);
(2)在SysUserMapper.xml 中添加SQL映射:
<select id="getUserByRealName" resultType="sysuser" parameterType="java.lang.String">
select * from sys_user where realName like concat('%',#{param},'%')
</select>
(3)在测试类中添加测试方法
// 省略创建SqlSession的代码
List(SysUser) userList=sqlSession.getMapper(SysUserMapper.class).getUserByRealName("李");
2.Mybatis 框架内建的部分别名与java数据类型的映射关系,类型别名只是 Java 类型的较短名称。它仅与 XML 配置相关,并且只是为了减少完全限定类名的冗余类型而存在。例如:
<typeAliases>
<!-- <typeAlias type="真实路径" alias="别名"></typeAlias> -->
<typeAlias type="com.ffyc.mybatisPro.model.Grade" alias="Grade"></typeAlias>
<typeAlias type="com.ffyc.mybatisPro.model.Student" alias="Student"></typeAlias>
</typeAliases>
3.实现多条件查询
(1)将查条件封装成java对象作为入参,在SysUserMapper接口中添加查询方法,使用SysUser类作为参数,使用属性realName和roleId封装两个查询代码
/**
*查询用户表
*@Param SysUser
*/
public List<SysUser> getUserListByPojo (SysUser sysuser);
(2)在SysUserMapper.xml 中添加SQL语句映射,使用SysUser作为参数,绑定realName和roleId属性获取查询条件。
<select id="getUserListByPojo" resultType="sysuser" parameterType="sysuser">
select * from t_sys_suer where realName like concat('%',#{realName},'%') and roleId=#
{roleId}
</select>
(3)测试使用SysUser类型提供查询条件
//省略创建SqlSession的代码
SysUser sysuser=new SysUser();
user.setRealName("李");
user.setRoleId(3);
List<SysUser> userList=sqlsession.getMapper(sysUserMapper.class).getUserListByPojo(user);
4.将查询条件封装成Map对象作为入参
(1)在SysUserMapper接口中添加查询方法,使用SysUser类作为参数
/**
*查询用户列表
*@param Map
*/
public List<SysUser> getUserLimit(Map map);
(2)在SysUserMapper.xml 中添加SQL语句映射,使用Map作为参数,绑定key为rName和rId的键值对(key-value)获取查询条件
<select id="getUserLimit" resultType="pojo.SysUser" parameterType="java.util.Map">
select * from t_sys_user where realName like concat('%',#{realName },'%')
and roleId=#{roleId}
</select>
(3)测试使用SysUser类型提供查询条件
//省略s、SqlSession的代码
Map map=new HashMap();
map.put("realName","赵");
map.put("rId",3);
val userLimit = sqlSession.getMapper(SysUserMapper.class).getUserLimit2(0,3);
System.out.println(userLimit.toString());
5.使用@Param注解实现分页查询
(1)在SysUserMapper接口中添加查询方法,使用@Param注解为参数命名
//分页查询 注解版
public List<SysUser> getUserLimit2(@Param("pageIndex")Integer pageIndex,@Param("pageSize") Integer pageSize);
(2)在SysUserMapper.xml 中添加SQL语句映射,使用@Param注解指定的名称绑定查询条件
<select id="getUserLimit2" resultType="pojo.SysUser" parameterType="java.util.Map">
select
<include refid="base_column"></include>
from
t_sysuser limit #{pageIndex},#{pageSize}
</select>
(3)测试使用SysUser类型提供查询条件
//省略SqlSession
val userLimit = sqlSession.getMapper(SysUserMapper.class).getUserLimit2(0,3);
System.out.println(userLimit.toString());
5.什么是Mybatis的结果映射?
Mybatis框架的结果映射是指将数据库查询结果映射到Java对象的过程。当使用Mybatis进行数据库查询操作时,查询结果通常是一组记录,每条记录包含多个字段。为了方便数据操作和处理,Mybatis提供了结果映射的功能,将查询结果转化为Java对象,使得我们可以通过面向对象的方式来处理数据。
结果映射可以将数据库查询结果的列与Java对象的属性进行对应,将每个字段的值赋给相应的属性。这样,在查询结果中的每一行都会被映射成一个Java对象,并且对象的属性值会与查询结果的列值保持一致。通过结果映射,我们可以方便地使用Java对象来表示和操作查询结果,而无需直接处理底层的ResultSet。
Mybatis支持多种类型的结果映射,包括基本类型映射、简单对象映射、关联对象映射、集合映射以及枚举映射等。通过配置文件或注解,我们可以指定如何进行结果映射,定义查询结果与Java对象之间的映射规则。
总结来说,Mybatis框架的结果映射是将数据库查询结果映射到Java对象的过程,使得我们可以通过Java对象来方便地处理和操作查询结果。这种结果映射的方式使得数据操作更加灵活和便捷。
怎么使用?
在SysUserMapper.xml 中,添加sql标签,id属性是名字,里面存放要查询的字段
<sql id="base_column">
`id`, `account`, `realName`, `password`,
`sex`, `birthday`, `phone`, `address`, `roleId`,
`createdUserId`, `createdTime`, `updatedUserId`, `updatedTime`,
`idPicPath`, `workPicPath`, `islock`
</sql>
写查询语句的时候将*变成 <include refid="base_column"></include> ,refid是sql标签的id
<select id="getUserByName" parameterType="java.lang.String" resultType="pojo.SysUser">
select
<include refid="base_column"></include>
from
t_sysuser
where
realName=#{realName}
</select>
6.使用resultMap元素实现嵌套结果映射,实现两表联查
(1)association
(2)collection
(3)Mybatis自动映射
自动映射的前提:属性名与字段名一致。在mybatis-config.xml中添加
(4)在SysUserMapper接口中添加查询方法
//两表连查询
public List<SysUser> getUserRoleMap(Map map);
(5)在SysUserMapper.xml 中添加SQL语句映射
<!--两表查询-->
<!--resultMap id属性随便命名不需要在接口定义方法-->
<resultMap id="getUserRole" type="pojo.SysUser">
<id property="id" column="id"></id>
<!-- 一对多的映射 -->
<collection property="sysRole" ofType="pojo.SysRole">
<id property="id" column="id"></id>
</collection>
</resultMap>
<select id="getUserRoleMap" resultMap="getUserRole" parameterType="java.util.Map">
select
account,realName,password,sex,birthday,phone,roleName
from
t_sysuser,t_sysrole
where
t_sysuser.roleId=t_sysrole.id LIMIT #{pageIndex},#{pageSize}
</select>
(6)在SysUserMapper.xml 中添加SQL语句映射
List<SysUser> userList=null;
Map map=new HashMap();
map.put("pageIndex",0);
map.put("pageSize",3);
SqlSession sqlSession=MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(SysUserMapper.class).getUserRoleMap(map);
if (userList!=null){
for (SysUser sysUser:userList){
String sex="";
if (sysUser.getSex()==1){
sex="男";
}else {
sex="女";
}
System.out.println("账号:"+sysUser.getAccount()+" 姓名:"+sysUser.getRealName()+" 角色:"+sysUser.getRoleName()+" 性别:"+sex+" 年龄:"+sysUser.getAge1(sysUser.getBirthday())+" 密码:"+sysUser.getPhone());
}
}
7.Mybatis的缓存
在MyBatis中,缓存是一种提高性能的机制,它存储了已经查询过的结果,以便下次查询相同的数据时可以直接从缓存中获取,而不需要再访问数据库。
MyBatis的缓存分为两级:一级缓存和二级缓存。
-
一级缓存:
- 一级缓存是MyBatis默认开启的缓存机制,它位于SqlSession的内部。
- 当通过SqlSession执行查询语句时,查询的结果会被缓存在SqlSession的内部缓存中。
- 在同一个SqlSession中连续执行相同的查询语句时,如果查询条件相同,则会直接从缓存中获取结果,而不会再次发送SQL到数据库。
- 一级缓存的生命周期与SqlSession的生命周期相同,即在同一个SqlSession中进行操作时有效,当SqlSession关闭后,缓存也会被清空。
- 局部,仅限于单个SqlSession里面
-
二级缓存:
- 二级缓存是全局的缓存机制,它可以跨多个SqlSession共享缓存。
- 开启二级缓存需要在MyBatis的配置文件中进行配置,并且需要在相应的映射文件中设置缓存策略。
- 当SqlSession执行查询语句时,查询的结果会被缓存在二级缓存中。
- 在不同的SqlSession中执行相同的查询语句时,如果查询条件相同并且命中了二级缓存,则会直接从缓存中获取结果。
- 二级缓存的生命周期与整个应用程序的生命周期相同,在应用程序关闭之前都有效。
- 注意,二级缓存是基于namespace级别的,即同一个namespace下的映射语句共享同一个缓存。
- 全局
需要注意的是,缓存虽然可以提高查询性能,但也有可能导致数据不一致的问题。因此,在使用MyBatis的缓存机制时,需要根据实际情况合理配置缓存策略,并在更新、插入、删除等操作后及时清空或刷新缓存,以保证数据的一致性。
(1) 如何设置二级缓存?
(1)建立一个线程![](https://i-blog.csdnimg.cn/blog_migrate/25d8f0da2ba4de4e1fac0c21f107a1d0.png)
(2)MyBatis的全局cache配置,在SQL映射文件中设置缓存,默认情况下是没有开启缓存的,在SQL映射文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置
<setting name="cacheEnabled" value="true" />
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
<select id="selectAll" resultType="SysUser" useCache="true">