mybatis获取参数的情况?
mybatis3.5之后#和$获取参数一致
#{username}参数可以任意值
<select id="selectById" resultType="User">
select * from t_user where username = #{username}
</select>
${username}需要用单引号
select * from t_user where username = '${username}'
mybatis传两个参数的时候
若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以 param1,param2…为键,以参数为值;因此只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以 param1,param2…为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,
注意${}需要手动加单引号
mybatis可以手动放入map集合中
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//6.调用mapper接口中的方法,实现添加用户信息的功能
HashMap<String, Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
User user = mapper.selectLogin(map);
System.out.println(user);
mybatis加注解自动放入集合中·
User selectLogin1(@Param("username") String username, @Param("password") String password);
查询功能
查询一条数据返回map,如果查询的字段为空的话不会显示。
Map<String,Object> selectMap(Integer id);
select * from t_user where id =#{id}
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = mapper.selectMap(1);
System.out.println(map);
查询多条数据可以用List存储map
//第一种方式
List<Map<String,Object>> listMap();
//第二种方式
@MapKey("id")
Map<String,Object> selectMap(Integer id);
特殊sql查询
模糊查询
select * from t_user where username like '%${mohu}%'
select * from t_user where username like concat ('%',#{mohu},'%')
select * from t_user where username like "%"#{mohu}"%"
批量删除
int deleteMore(@Param(“ids”) String ids);
只能用$
符号
delete from t_user where id in (${ids})
动态设置表名
动态设置表明只能用${}
List<User> getAllUser(@Param("tableName") String tableName);
select * from ${tableName}
添加功能获取自增主键
useGeneratedKeys:设置使用自增的主键
keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参 数user对象的某个属性中
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
</insert>
自定义映射resultMap
将下划线映射为驼峰
<!-- 将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
resultMap自定义映射
<!--自定义映射-->
<resultMap id="empResultMap" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
</resultMap>
<select id="selectById" resultMap="empResultMap">
select * from t_emp where emp_id =#{empId}
</select>
多对一的映射关系
使用级联处理多对一映射关系
<resultMap id="EmpAndDeptById" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<result column="dept_id" property="dept.deptId"/>
<result column="dept_name" property="dept.deptName"/>
</resultMap>
<select id="selectAndDeptById" resultMap="EmpAndDeptById">
select *
from t_emp
left join t_dept on t_emp.dept_id = t_dept.dept_id
where emp_id = #{empId}
</select>
使用association处理映射关系
<resultMap id="EmpAndDeptById" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<association property="dept" javaType="dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
</association>
</resultMap>
使用分布查询多对一映射关系
<resultMap id="distributionEmpAndDeptById" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<association property="dept"
select="com.wyk.mapper.DeptMapper.selectSecondById"
column="dept_id"
>
</association>
</resultMap>
<select id="selectFirstById" resultMap="distributionEmpAndDeptById">
select *
from t_emp
where emp_id = #{empId}
</select>
<select id="selectSecondById" resultType="Dept">
select * from t_dept where dept_id =#{deptId}
</select>
分布查询延迟加载
lazyLoadingEnabled
:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading
当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属 性会按需加载
<settings>
<!-- 将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--按需延迟加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
添加fetchType="lazy(延迟加 载)|eager(立即加载)"
<resultMap id="distributionEmpAndDeptById" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<association property="dept" fetchType="lazy"
select="com.wyk.mapper.DeptMapper.selectSecondById"
column="dept_id"
>
</association>
</resultMap>
一对多映射关系
collection处理
private List<Emp> emps;
<resultMap id="DeptAndEmp" type="Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
<collection property="emps" ofType="Emp" javaType="java.util.List">
<id property="empId" column="emp_id"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="gender" column="gender"></result>
</collection>
</resultMap>
<select id="selectFirstById" resultMap="DeptAndEmp">
select *
from t_dept
left join t_emp on t_dept.dept_id = t_emp.dept_id
where t_dept.dept_id = #{deptId}
</select>
分布查询
<!-- 分布查询-->
<resultMap id="DeptDistributionEmp" type="Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
<collection property="emps" fetchType="lazy"
select="com.wyk.mapper.EmpMapper.selectDistributionDeptById"
column="dept_id"
>
</collection>
</resultMap>
<select id="selectFirstDistribution" resultMap="DeptDistributionEmp">
select * from t_dept where dept_id =#{deptId}
</select>
Emp selectDistributionDeptById(@Param("deptId") Integer deptId);
<select id="selectDistributionDeptById" resultType="com.wyk.pojo.Emp">
select *
from t_emp
where dept_id = #{deptId}
</select>
mybatis缓存
一级缓存是同一个sqlSession,运行同一个sql语句只查询一次,第二次从缓存里面取
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.selectById("admin");
System.out.println(user1);
User user2 = mapper.selectById("admin");
System.out.println(user2);
一级缓存失效的情况
1,任何一次增删改都会使得一级缓存失效
2,清楚sqlSession: sqlSession.clearCache();
MyBatis的二级缓存
二级缓存是SqlSessionFactory级别
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
二级缓存开启的条件:
在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置
在映射文件中设置标签
二级缓存必须在SqlSession关闭或提交之后有效
查询的数据所转换的实体类类型必须实现序列化的接口
二级缓存失效的情况,任何一次增删改都会使得二级缓存失效
@Test
/*
二级缓存是SqlSessionFactory级别
*/
public void test6() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.selectById("admin");
System.out.println(user1);
sqlSession1.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
UserMapper mapper2 = sqlSession1.getMapper(UserMapper.class);
User user2 = mapper1.selectById("admin");
System.out.println(user2);
sqlSession2.close();
}
二级缓存的相关配置了解即可
MyBatis缓存查询的顺序
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存
如果一级缓存也没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
Mybatis整合第三方缓存EHCache
主要是替代二级缓存
分页功能
依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
分页计算
最后一页计算
count:总页数
totalPage:总页数
totalPage = count / pageSize
如果不能整除
if(count % pageSize!=0){
totalPage +=1
}
分页插件
//objects输出部分分页数据
Page<Object> objects = PageHelper.startPage(1, 4);
//输出:
Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=0, pages=0, reasonable=null, pageSizeZero=null}
//分页的详细信息
//navigatePages 导航分页的页码数
PageInfo<Emp> empPageInfo = new PageInfo(users,5);
//输出
PageInfo{pageNum=1, pageSize=4, size=4, startRow=1, endRow=4, total=30, pages=8, list=Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=30, pages=8, reasonable=false, pageSizeZero=false}, prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=5, navigatepageNums=[1, 2, 3, 4, 5]}
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页 hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
pages=8, reasonable=false, pageSizeZero=false}, prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=5, navigatepageNums=[1, 2, 3, 4, 5]}
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页 hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]