mybatis知识点

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>

分页计算

image-20220917143004863

最后一页计算

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值