把经常访问但是不经常修改的数据存储在缓存内容中,减少与数据库交互,从而达到提高效率的目的
①、一级缓存
默认存在,无法关闭
缓存的数据存储在SQLSession对象中(类似Map集合,键对应的sql语句,值就是语句对应的结果)
不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
②、二级缓存
是把缓存的数据存储在SQLSessionFactory上面(对象内部)
二级缓存的数据,所有的session可以共用
二级缓存默认关闭,使用的需要配置
1、数组分页
先查询出所有数据,再使用subList()方法进行数据分页,不实用,还是会占用大量内存
2、SQL分页
SELECT * FROM table_name LIMIT #{startIndex}, #{pageSize};
3、RowRounds分页
RowBounds 是 MyBatis 提供的一个分页辅助类,它允许你直接在 SQL 映射文件中实现分页
RowBounds rowBounds = new RowBounds((currPage - 1) * pageSize, pageSize);
List<User> list = sqlSession.selectList("com.eric.entity.UserMapper.getAll", null, rowBounds);
4、分页插件
MyBatis 分页插件是另一种实现分页的方式,它通过拦截器拦截 SQL 语句,然后动态地添加 limit 子句来实现分页。
PageHelper.startPage(pageNo, pageSize);
List<User> page = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(page);
5、可以使用limit进行分页,这是数据库自带的分页方式
在某种编程语言或框架中,已经预先定义并且可以直接使用的对象。
内置对象的特点和优势:
1、方便性:内置对象提供了许多常见的功能和操作,可以直接使用,无需自己编写复杂的代码。
2、高效性:内置对象通常经过优化,性能较好,可以提高程序的运行效率。
3、可复用性:内置对象可以被多个程序或模块复用,减少了代码的重复编写。
4、可维护性:内置对象由语言或框架提供,维护和更新由开发者社区或团队负责,可以保证其稳定性和可靠性。
因为mybatis中,dao层的方法时通过动态代理来实现的,方法名会被作为id,id具有唯一性,所以不能进行方法重载
mybatis并不完全自动进行数据访问,需要开发者自己写sql语句
<!-- 模糊查询-->
<select id="" parameterType="String" resultType="Teacher">
-- select * from teacher where tname like '#{v}%';
-- 有问题,''会把#{v}%当成一个字符串,没法传递数据
select * from teacher where tname like #{v}
--1 从view层就接受%,这里就不用改,不推荐
select * from teacher where tname like concat{#{v,'%'}
--2 concat进行字符串拼接
select * from teacher where tname like ${v}%
--3 ${}是纯字符串拼接,不能防止sql注入,不能用啊,用来理解${},#{}的区别
select * from teacher where tname like #{v}"%"
--4 #{v}最后会被翻译成'张',后面是"%",这个是单双引号交替出现,手册上找不到但是好用
<bind name="x" value="_parameter+'%'"/>
select * from teacher where tname like #{x}
--5 bind标签,官方推荐,bind是用来定义变量的
</select>
<!-- 把获取的主键的值放入我们设置的属性 useGeneratedKeys原本是false的,要改为true,keyProperty是-->
<insert id="AddTeacher" parameterType="Teacher" useGeneratedKeys="true" keyProperty="tid">
insert into Teacher(tname,tsex,tbirthday,taddress,temail,tmoney)
values(#{tname},#{tsex},#{tbirthday},#{taddress},#{temail},#{tmoney})
</insert>
<!-- 传多参最好用的javabean-->
<select id="selteacherFenye" resultType="Teacher" parameterType="map">
select * from teacher limit #{curpage},#{sp}
</select>
<!-- 传多参,arg是从0开始,param是从1开始,但是慎用-->
<select id="selteacherarg" resultType="Teacher">
select * from teacher where tsex = #{arg0} and tid = #{arg1}
</select>
<select id="selteacherparam" resultType="Teacher">
select * from teacher where tsex = #{param1} and tid = #{param2}
</select>
硬编码
SQL参数固定(动态sql)
代码重复度高
底层技术
一对多可以通过 <resultMap> 标签中的 <collection> 子标签来完成
<resultMap id="userAccountResultMap" type="User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="email" property="email" />
<!-- 一对多关联查询 -->
<collection property="accounts" ofType="Account" column="id" select="selectAccounts" />
</resultMap>
<select id="selectUser" resultMap="userAccountResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="selectAccounts" resultType="Account">
SELECT * FROM account WHERE user_id = #{id}
</select>
一对一查询可以通过 <resultMap> 标签中的 <association> 子标签来完成。
<resultMap id="userResultMap" type="User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="email" property="email" />
<!-- 一对一关联查询 -->
<association property="address" column="id" select="selectAddress" />
</resultMap>
<select id="selectUser" resultMap="userResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="selectAddress" resultType="Address">
SELECT * FROM address WHERE user_id = #{id}
</select>