Mybatis高级

学习目标:

  • 添加log4j并且学会使用
  • Mybatis数据源的提取
  • 实体类对象别名的设置

Mybatis配置优化:

1.log4j

学习log4j是为了我们能够输出日志方便我们查看过程并改错,尤其是在sql中我们可以将sql语句展示出来方便我们查看sql是否正确

1.1添加依赖

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

1.2配置log4j文件

在resource目录下创建log4j.properties,将下面的配置复制到该文件中

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
### direct messages to file mylog.log ###
### log4j.appender.file=org.apache.log4j.FileAppender
### log4j.appender.file.File=d:mylog.log
### log4j.appender.file.layout=org.apache.log4j.PatternLayout
### log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
### set log levels - for more verbose logging change 'debug?info?warn?error' ###
### log4j.rootLogger=debug,stdout,file
log4j.rootLogger=debug,stdout

2.Mybatis数据源的提取

2.1创建db.properties

在resource的目录下创建db.properties,在其中书写MySQL的配置
注意:如果你的mysql版本是5.x这里的驱动是没有cj的
驱动,地址,用户名,密码

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms
username=root
password=root

2.2 使用db.properties

在mybatis的配置文件里添加这个文件的使用

<!-- 加载数据库配置文件 -->
  <properties resource="db.properties"></properties>

在这里插入图片描述

批量定义类别名

在MyBatis中的配置文件中, parameterType和resultType都需要指定自定义类的全路径。类的全路径一般都很长,所以需要进行优化。也就是给类定义别名。
这里一般name的值是你们实体类的包名

<typeAliases>
        <package name="com.liu.pojo"/>
</typeAliases>

在这里插入图片描述

sql语句中的特殊参数讲解

parameterType/parameterMap

在这里插入图片描述

resultType/ resultMap

在这里插入图片描述

	如果返回的是集合,那么这里必须是集合中的泛型
	<select id="listStudents" resultType="Student">
       select * from t_student;
     </select>
    <!--
       resultMap:
           id: 自定义唯一标识
           type: 此映射关联的类
       id: 主键
           column: 表中查询出来的字段名
           property: 对象中的属性
       result:非主键字段
   -->
   <resultMap id="studentmap" type="Student">
       <id column="s_id" property="id"/>
       <result column="s_name" property="name"/>
       <result column="s_birth" property="birth"/>
       <result column="s_sex" property="sex"/>
   </resultMap>
   <select id="listStudents" resultMap="studentmap">
       select * from student;
   </select>

解决数据库表列名与属性不一样
在这里插入图片描述

mybatis sql语句值传递

引用类型

这里我们就不展示引用类型的传递了,因为我之前写的类容都是引用传递,如果真的需要我写这个的话可以在评论区说出来

基本数据类型/string

1.传入单个参数的时候,在映射文件中需要匹配参数的数据类型即可(同理:一个参数时,也可以使用下面的@Param的方式)
StudentMapper

	public Student getStudentById(int id);
    //public Student getStudentById(@Param("id") int id);

StudentMapper.xml

    <select id="getStudentById" parameterType="int" resultType="Student">
        select * from t_student where id=#{id}
    </select>

在这里插入图片描述2. a) 如果传入的参数是多个参数时,可以通过@Param注解指定传入参数的名称(注意:1.配置映射文件中,可以不使用parameterType来指定数据的类型 2.在select语句中使用的内容,必须和@Param中定义的内容名称一致,而不是和参数名称一致) 使用了
在这里插入图片描述

动态sql

if语句

<if test=””></if>

test中进行条件判断

	<select id="getStudentByName" resultType="Student">
        select * from t_student where 1=1
        <if test="name!=null and name!=''">
            and name = #{name}
        </if>
    </select>

这里我们加 where 1=1 是为了如果我们的条件不成立是,我们将查询所有
在这里插入图片描述

where

  • where标签可以替换 where 1=1
  • where标签会将where后面的第一个and去掉
<select id="getStudentsByNameAndSex" resultType="Student">
       select * from t_student
       <where>
           <if test="name!=null and name!=''">
               and name = #{name}
           </if>
           <if test="sex!=null and sex!=''">
               and sex = #{sex}
           </if>
       </where>
   </select>

在这里插入图片描述

set标签

a) 常用到update修改语句中
b) 使用set标签会省略掉set关键字
<update id="updateStudentById" parameterType="Student">
        update t_student
        <set>
            <if test="name!=null and name!=''">
                name = #{name},
            </if>
            <if test="sex!=null and sex!=''">
                sex = #{sex},
            </if>
        </set>
        <where>
            id = #{id}
        </where>
    </update>

在这里插入图片描述

Foreach标签

a) 需求:查询id=1,2,3,4,5 的学生信息(也就是查询多个学生的id)
<!--
        foreach: 遍历
            collection: 数据源=》传递的参数名
            item: 遍历出的每个对象名
            open: 拼接的开始内容是什么
            close: 拼接完毕之后的结束是什么
            separator: 每个对象之间的分隔符是什么
    -->
    <select id="getStudentsIds" resultType="Student">
        select * from t_student
        <where>
            id in
            <foreach collection="ids" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

在这里插入图片描述

#{} 与 ${}

a) #{} 只是替代了?,可以防止sql的注入
b) ${} 进行字符串的拼接,不能防止sql的注入

模糊查询

	<select id="getStudentLikeName" resultType="Student">
        select * from t_student
        <where>
            <if test="name!=null and name!=''">
                and name like '${name}%'
            </if>
        </where>
    </select>

在这里插入图片描述

缓存

一级缓存

i. 作用域:session,当openSession()之后,执行相同的sql语句时,只查询一次数据库
ii. 清空一级缓存
1. sqlSession.clearCache();
iii. 当执行insert/update/delete的时候session缓存中的内容会被清空

二级缓存

i. Mybatis的二级缓存的作用域是:mapper的namespace(二级缓存作用域mapper.xml映射文件的范围内容)
ii. 开启二级缓存
1. 在对应的mapper映射文件上进行开启

在这里插入图片描述

iii. 案例:

在这里插入图片描述

d) 在mybatis核心的配置文件上,可以开启全局的二级缓存

在这里插入图片描述

高级查询

a) 一对一/一对多/多对多
b) 一对一
i. 一个部门表、一个员工表
ii. T_dept(deptno,dname)
iii. T_emp(id,name,sex,deptno)
<resultMap id="empdept" type="Emp">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <!--
            1. association:一对一关系
                1.1 property:子对象在父对象中的属性名
                    (Dept在Emp对象中的属性名)
                1.2 javaType:子对象的java类型
        -->
        <association property="dept" javaType="com.neuedu.pojo.Dept">
            <id property="deptno" column="deptno"/>
            <result property="deptname" column="deptno"/>
        </association>
    </resultMap>
    <select id="listEmps" resultMap="empdept">
        select e.id,e.name,e.sex,e.age,e.deptno,d.deptname from t_emp e,t_dept d where e.deptno=d.deptno;
    </select>

在这里插入图片描述

c) 一对多
<resultMap id="deptemp" type="Dept">
        <id property="deptno" column="deptno"/>
        <result property="deptname" column="deptname"/>
        <!--
            1. collection:一对多
                1.1 property:子对象在父对象中的属性名
                1.2 javaType:子对象在父对象中的类型
                1.3 ofType:子对象的类型
        -->
        <collection property="emps" javaType="List" ofType="com.neuedu.pojo.Emp">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="age" column="age"/>
            <result property="sex" column="sex"/>
        </collection>
    </resultMap>
   <select id="listDepts" resultMap="deptemp">
       select e.id,e.name,e.sex,e.age,e.deptno,d.deptname from t_emp e,t_dept d where e.deptno=d.deptno;
   </select>

在这里插入图片描述

mybatis 的注解开发

  1. @ Mapper
    在这里插入图片描述

  2. a) 在mybatis核心的配置文件中加载此接口
    

在这里插入图片描述

分页查询

  1. 分页:PageHelper
    a) 依赖引入:
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>6.0.0</version>
    
```

b) 加载到mybatis核心的配置文件中
在这里插入图片描述

c) PageHelper具体使用
在这里插入图片描述

补充内容

Mybatis逆向工程

1.通过配置数据库的信息,使用java代码可以生成对应的pojo、mapper接口、mapper映射文件
2.依赖的引入
3.创建核心的配置文件
4.创建执行类,执行核心配置文件,生成对应的信息

补充:lombok

a) 依赖

<dependency>    
	<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>    
    <version>1.18.30</version>
 </dependency>

2.使用@Data注解,可以不用再写构造器,getter,setter,tostring方法

MyBatis中,高级查询可以使用延迟加载机制来实现。延迟加载是将数据加载时机推迟,例如推迟嵌套查询的执行时机。通过延迟加载,可以先查询主表,按需实时做关联查询,返回关联表结果集,提高效率。 在MyBatis中,实现关联查询有两种不同的方式:嵌套Select查询和嵌套结果映射。嵌套Select查询是通过执行另外一个SQL映射语句来加载期望的复杂类型,而嵌套结果映射则使用嵌套的结果映射来处理连接结果的重复子集。 对于关联结果映射和其他类型的映射,工作方式类似。需要指定目标属性名以及属性的javaType,大多数情况下MyBatis可以推断出来,如果需要的话,还可以设置JDBC类型。如果想要覆盖获取结果值的过程,可以设置类型处理器。 综上所述,通过延迟加载机制和适当的关联查询方式,MyBatis可以实现高级查询功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mybatis高级查询](https://blog.csdn.net/weixin_37650458/article/details/96587906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MyBatis高级查询](https://blog.csdn.net/qq_66991094/article/details/127147576)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值