Mybatis(上)——简介、入门案例、主配置文件、映射配置文件、基于接口操作数据库、模糊查询、参数传递、粗简执行原理

本文详细介绍了MyBatis框架的基本概念、配置文件结构及其组成部分,包括properties、settings、typeAliases等标签的使用方法,以及映射配置文件的详细解析。

Ⅰ、Mybatis简介 0

mybatis——持久层(javaWeb dao层)、轻量级、操作数据库的框架,将数据库中的表与javaBean一 一 映射起来,查询结果自动封装起来不需要处理结果集。JDBC中自动提交sql语句,完成持久化;但是mybatis默认关闭自动提交,所以需要手动提交,完成持久化。

持久化——就是将瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。

引用百度百科——
在这里插入图片描述
         MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。Mybatis是一个半自动的ORM(object relation mapping对象关系映射)框架,指的是mybatis支持自定义sql语句,并且可以将数据库中的表和java中的bean对象做一一映射

框架——框架的本质就是一系列的工具类,能够实现部分功能,使用框架做开发,可以大量的简化开发。

把Mybatis的功能架构分为三层:
在这里插入图片描述

Ⅱ、入门案例

👉点击👈https://blog.youkuaiyun.com/Today_He/article/details/109313654

Ⅲ、主配置文件

链接:https://www.w3cschool.cn/mybatis/7zy61ilv.html

主配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>

一、properties标签 0

1、在properties标签中使用propertie子标签进行赋值,例如:

<properties resource="">
  <property name="username" value="root"/>
</properties>

2、常用,获取配置文件的值,完成属性赋值
配置文件db.properties

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/school?characterEncoding=utf-8&serverTimezone=UTC
db.username=root
db.password=123456

在这里插入图片描述

3、在通过方法参数传递处赋值,例如:

<dataSource type="POOLED">
  <property name="username" value="root"/>
</dataSource>

通过方法参数传递的属性具有最高优先级(最后读取),resource / url属性中指定的配置文件次之(中间读取),最低优先级的是properties属性中指定的属性(最先读取)。 name同名时,后读取的value会覆盖先读取的value

二、settings标签

一些特殊设置,比如延迟加载、开启缓存、开启懒加载等
【待补充】

三、typeAliases标签

类型别名——类型别名是为Java类型设置一个短的名字(注意是为bean包下的实体类取别名) 。它只和XML配置有关,存在的意义仅在于减少类别完全限定名的冗余。
1、单一取别名

<!--取别名-->
<typeAliases>
  	<typeAlias type="com.hbw.bean.Student" alias="ss"></typeAlias>
</typeAliases>
<!--比如需要使用com.hbw.bean.Student全类名,那么我就可是使用ss(随便取的)来代替它-->

2、常用,批量取别名

<!--那么当使用com.hbw.bean下面的其他实体类时,使用首字母小写的实体类名即可-->
<!--例如:student就代表com.hbw.bean.Student-->
<!--当然这是没有注解的情况,当有注解时,注解的值优先。@Alias("stu")-->
<typeAliases>
  <package name="com.hbw.bean"/>
</typeAliases>

3、jdk常见数据类型
基本数据类型,在其前面加下划线(_int)
引用类型,使用首字母小写(integer)
在这里插入图片描述

四、plugins标签

插件。
MyBatis允许您在已映射语句执行过程中的某些点进行拦截调用。有时情况下,MyBatis允许使用插件来拦截的方法调用包括:

  • 执行程序(更新,查询,flushStatements,提交,回滚,getTransaction,关闭,isClosed)
  • ParameterHandler(getParameterObject,setParameters)
  • ResultSetHandler(handleResultSets,handleOutputParameters)
  • StatementHandler(准备,参数化,批处理,更新,查询)

以分页插件举例:
1、导入分页插件的jar包

 <dependency>
    <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>5.1.3</version>
 </dependency>

2、在mybatis主配置文件中引入插件

通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。
在这里插入图片描述
3、使用插件

  @Test
    public void testStu() throws IOException {
        //读取核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatiesConfig.xml");
        //构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //构建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //从1开始,查询5条
        PageHelper.startPage(1,5);
        //将查询结果集封装在list集合中
        List<Student> list = sqlSession.selectList("com.hbw.dao.StudentDao.selectStudent");
        for(Student stu : list){
            System.out.println(stu);
        }
        //统计总条数
        PageInfo<Student> pageCount = new PageInfo<>(list);
        System.out.println(pageCount.getTotal());
        sqlSession.commit();
        sqlSession.close();

    }

五、environments标签 0

必备,配置环境。

MyBatis可以配置成适应多种环境,这种机制有助于将SQL映射到多种数据库之中,现实情况下有多种理由需要这样做。例如,开发,测试和生产环境需要有不同的配置;或者共享相同Schema的多个生产数据库,想使用相同的SQL映射。许多类似的用例。

不过,如果你想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:

每个数据库对应一个SqlSessionFactory实例

<!--用于配置数据库操作环境,通过default属性指定要使用的具体数据库环境,其值对应的是数据库环境id-->
<environments default="development">
    <!--定义某个数据库环境-->
    <environment id="development">
        <!--数据库事务管理,type取值:
        JDBC:表示使用jdbc的方式来管理事务
        MANAGED:表示使用其他容器例如spring提供的事务管理-->
        <transactionManager type="JDBC"/>
        <!--数据源配置,属性type表示获取连接的方式:
        POOLED:表示从mybatis默认的数据库连接池中获取连接;
        UNPOOLED:表示每次获取连接都会去新建一个连接;
        JNDI:java naming directory interface表示java命名注册接口,将数据源提取出来配置到tomcat容器中,通过固定API获取连接,
        目的:让数据源彻底和项目解耦-->
        <dataSource type="POOLED">
            <property name="driver" value="${db.driver}"/>
            <property name="url" value="${db.url}"/>
            <property name="username" value="${db.username}"/>
            <property name="password" value="${db.password}"/>
        </dataSource>
    </environment>
</environments>

六、mappers标签 0

必备,映射器——Java在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis到哪里去找映射文件

这里的resource、url、class都是指的主程序配置文件夹Resouces,所以需要注意路径问题。比如,我需要使用StudentMapper.xml那么直接填写resource、url、class=“StudentMapper.xml”
在这里插入图片描述
1、最常用的映入方式 0

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

2、通过文件名称引入,基本不用

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

3、这种使用方式要求映射配置文件和接口同名且在同一个包下

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

Ⅳ、映射配置文件 0

主配置文件与映射配置文件的关系:主配置文件通过映射器mappers,找到映射配置文件

映射配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace命名空间,xml映射配置文件的唯一标识-->
<mapper namespace="com.hbw.dao.StudentDao">
    <select id="selectStudent" resultType="ss">
    select sid,sname,sage,ssex,semail from student
  </select>
</mapper>

1、cache标签
映射配置文件中的缓存标签,用于设置二级缓存配置;
cache-ref标签
用于缓存配置,应用其他映射配置文件中的缓存配置;

2、resultMap标签 0
结果集映射标签,通常用于定义结果集映射。-

 <resultMap id="studentResult" type="student">
     <!--
     标签:
	     id标签通常用于主键字段映射
	 属性:
	     column:指的是数据库表中字段名称;
	     jdbcType:指的是数据库表中字段数据类型;
	     property:指的是返回数据类型中的属性名称;
	     javaType:指的是返回数据类型中的属性名称对应的数据类型(查询才需要)
     -->
     <id column="sid" jdbcType="BIGINT" property="sid" javaType="_int"></id>
     <!--result标签表示普通字段映射,属性同id标签相同-->
     <result column="sname" property="sname"></result>
     <result column="sage" property="sage"></result>
     <result column="ssex" property="ssex"></result>
 </resultMap>
 
 <!--
 所有查询语句必须指定返回数据类型,返回数据类型指定属性:
 resultType:当查询数据库字段名称和返回数据类型属性名称一致时,使用resultType指定返回数据类型
 resultMap:当查询数据库字段名称和返回数据类型属性名称不一致时,和当做多表查询时,需要使用resultMap指定返回数据类型
 -->
 <select id="selectStudent" resultMap="studentResult">
 	select sid,sname,sage,ssex from student where sid = #{id}
 </select>

3、sql标签
当需要使用重复的sql语句时,给这个sql语句片段取个别名,需要使用时,引入即可(封装)

<!--用于定义sql片段-->
<sql id="StudentSql">
     select sid,sname,sage,ssex from student
</sql>
<!--在需要的地方引用sql片段:-->
<include refid="StudentSql"></include>

4、insert标签(update标签、delete标签)

1)新增返回主键值
常用属性:useGeneratedKeys指定是否返回新增主键值,keyProperty指定新增返回属性值的具体位置(指的是返回到传入参数中的位置)

<insert id="insertStudent" useGeneratedKeys="true" keyProperty="sid">
    insert into student(sid,sname,sage,ssex)value (#{sid},#{sname},#{sage},#{ssex})
</insert>

2)新增返回主键值
使用mysql自带函数last_lnsert_id()
【好丑,待修改】
在这里插入图片描述

5、select标签 0
用于定义查询sql语句,必须指定返回数据类型,返回数据类型指定:resultType和resultMap
resultType的值指的是返回数据类型的全限定名称或者别名;
resultMap的值指的是自定义结果集映射的id;
见(2、resultMap标签👆)

Ⅴ、基于接口代理的方式操作数据库 0

什么意思?
即,代码访问dao层接口的某个方法,dao层接口中的该方法访问mapper.xml。然后依次返回…

举例:
一、新建dao层StudentDao接口

public interface StudentDao {
    public Student getStudentById(int sid);
}

二、新建映射配置文件StudentMapperDao.xml 0

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
接口方法与sql语句如何一一对应的?
1)接口全限定名称(全类名)和映射配置文件命名空间(namespace)的值一致;
2)接口方法名称和sql语句的id值一致
-->
<mapper namespace="com.hbw.dao.StudentDao">
    <select id="getStudentById" resultType="ss">
        select sid,sname,sage,ssex,semail from student where sid = #{id}
    </select>
</mapper>

三、在主配置文件中添加映射
注意,是在mappers标签中新增mapper子标签

<mapper resource="StudentMapperDao.xml"/>

四、测试

注意,有许多赘余的代码,可以将其提取出来,生成工具类,这里省略…

  @Test
    public void testStuById() throws IOException {
        //读取核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatiesConfig.xml");
        //构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //构建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //类似接口的实现(自动生成代理类接口实例)
        StudentDao sd = sqlSession.getMapper(StudentDao.class);
        //传入实参sid=17
        Student stu = sd.getStudentById(17);
        System.out.println(stu);
        //默认关闭自动提交事务,所以这里需要手动提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

Ⅵ、模糊查询 0

1、常用,使用#{}传参实现模糊搜索:

select sid,sname,sage,ssesx from student where sname like concat('%',#{sname},'%')

2、使用${}传参实现模糊搜索(必须在传入参数名称处加上注解@param,且注解名称和传入参数名称一致):

@param注解处于Dao层,是为了传递多个参数,解决可读性和直观性。有点像取别名,给形参取个别名,mapper.xml文件再根据注解取的别名获取值

select sid,sname,sage,ssesx from student where sname like '%${sname}%'

#{}和${}的区别:0
#{}相当于jdbc中的占位符(?),做了sql校验,可以防止sql注入;
${}就是字符串,仅仅相当于字符串的拼接,不做任何校验,无法防止sql注入;

Ⅶ、单、多参数传递

1、单个参数传递时,mybatis默认根据参数类型获取参数值,参数名称随意取;
2、多参数传递时,传参方式有以下四种:

*将多个参数封装到对象中传递,保证获取参数名称和对象属性名称一致;(最常用方式)
 直接将多个参数传入到方法中,只能通过索引来获取参数设置到sql语句中(argo,arg1或者0,1等等):
 直接将多个参数传入方法中,通过在方法参数上添加注解@param来获取多个参数,获取参数名称必须和@Param注解名称一致;
 将多个参数封装到map集合中进行传递,根据map集合中的key值来获取参数;

Ⅷ、补充 0

maybatis的常用API

1、Resources:读取主配置文件到输入流;
2、SqlSessionFactroyBuilder:用于构建SqlSessionFactory工厂对象,将配置文件中的所有信息解析后封装到Configuration对象中,并将configuration对象封装到工厂对象中;
3、SqlSession:通过工厂对象SqlSessionFactory可以构建SqlSession,sqlSession中初始化好了Configuration所有配置信息、Excutor执行器、默认开启事务;提供了一系列操作数据库的方法。

mybatis的执行原理 0

1、读取主配置文件以及主配置文件中的映射配置文件;
2、解析配置文件构建工厂对象SqlSessionFactory;
3、根据工厂对象构建SqlSession对象
4、获取接口代理类实例
5、调用接口方法执行数据库操作
6、提交事务(持久化),关闭连接,释放资源





PS:
仅用于学习记录与交流
如有错误,还望指正!!

👉mybatis(中)——操作多表(一对一、一对多、多对多)
👉mybatis(下)——<![CDATA[…]]>、动态sql语句详解、懒加载、缓存、逆向工程、纯注解操作数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值