阿里P8耗时3天梳理的MyBatis笔记,GitHub上线仅1天获10w 浏览量

222 阅读8分钟

Hello,今天给各位童鞋们分享MyBatis总结,赶紧拿出小本子记下来吧!

image.png

一、框架概述

1.1软件开发常用结构

三层架构包含的三层:

界面层、业务逻辑层、数据访问层

三层的职责

1.界面层(表示层,视图层):主要功能是接受用户的数据,显示请求的处理结果。使用web页面和用户交互,手机app也就是表示层的,用户在app中操作,业务逻辑在服务器端处理。

2.业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。

3.数据访问层: 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。

三层对应的包:

界面层:controller包(servlet类)

业务逻辑层:service包(各种xxxservice类)

数据访问层:dao包(xxDao类)

三层中类的交互

用户使用界面层—>业务逻辑层---->数据访问层(持久层)—>MySQL

三层对应的框架

界面层:servlet---->SpringMVC

业务逻辑层:service类----->Spring

数据访问层:Dao----->MyBatis

1.2框架概念

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。

简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架一个舞台, 你在舞台上做表演。在框架基础上加入你要完成的功能。

框架安全的,可复用的,不断升级的软件。

框架是一个舞台,是一个模版

模版:

已经事先规定好了一些条款和内容

加入自己的东西

框架是一个模版

框架中定义好了一些功能,这些功能是可用的。

可以加入自己项目的功能,这些功能可以利用框架中写好的功能。

框架是一个半成品软件,定义好了一些基础的功能,需要加入你的功能就是完整的。

基础功能是公用的,可重复使用的,可升级的。

框架特点:

框架一般不是全能的,不可以做所有的事情。

框架一般针对于某一个领域,特长在某一个方面,比如MyBatis做数据库操作强,但是它不可以做其他的。

框架是一个软件。

1.3JDBC编程

代码比较多,开发效率低

需要关注Connection,Statement,ResultSet创建对象和销毁

对ResultSet查询结果,需要自己封装为List

重复的代码比较多

业务代码和数据库的操作混在一起

1.4MyBatis框架概述

MyBatis框架:

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013 年11月迁移到Github。

iBATIS 一词来源于“internet" 和“abatis"的组合,是一个基于Java 的持久层框架。

iBATIS提供的持久层框架包括SQL Maps和Data Access Objects ( DAOs)。当前,最新版本是MyBatis3.5.1,其发布时间是2019年4月8日。

mybatis框架

一个框架,早期叫做ibatis, 代码在github。

mybatis是MyBatis SQL Mapper Framework for Java( sql映射框架)

sql mapper : sql映射

可以把数据库表中的一行数据映射为一个 java对象。行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据

Data Access Objects (dAOs) :数据访问,对数据库执行增删改查。

MyBatis解决的主要问题

提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了。

提供了执行sql语句的能力,不用你执行sql。

提供了循环sql,把sql的结果转换为java对象,List集合的能力。

提供了关闭资源的能力

开发人员需要做的:提供sql语句。

最后:开发人员提供sql语句----MyBatis处理sql语句----开发人员得到List集合或者Java对象

总结:mybatis是一个sql映射框架,提供数据库的操作能力,增强的jdbc,使用mybatis让我们的开发人员集中精神写sql语句就可以了,不必关心connection,statement,resultset的创建、销毁、sql语句的执行。

二、MyBatis框架快速入门

2.1入门案例

2.1.1使用MyBatis的准备

到github上下载对应zip包

2.1.2搭建MyBatis开发环境

实现步骤:

1.新建的students表。

2.加入maven的mybatis坐标、mysql驱动的坐标。

3.创建实体类,Student----用来保存表中的一行数据的。

4.创建持久层的DAO接口,定义操作数据库的方法。

5.创建一个MyBatis使用的配置文件,叫做sql映射文件:写sql语句的,一般是一个表一个sql映射文件。这个文件是xml类型文件

6.创建一个mybatis的主配置文件:一个项目就一个主配置文件。主配置文件提供了数据库的连接信息和sql映射文件的位置信息。

7.创建使用mybatis类,通过mybatis去访问数据库

image.png 创建studentDao.xml

image.png mybatis连接数据库

<!--环境配置:数据库连接信息-->

<environments default="mydev">

   <!--environment:一个数据库信息配置,环境

       id:一个唯一值,自定义,表示环境名称

   -->

    <environment id="mydev">

        <!--

        transactionManager:mybatis的事务类型

        type:jdbc(表示jdbc事务处理)

        -->

        <transactionManager type="JDBC"/>

        <!-- 数据源的配置,URL,用户名 密码 数据库 -->

        <!--

        dataSource表示数据源

        type:表示数据源的类型,POOLED表示使用连接数据池

        -->

        <dataSource type="POOLED">

            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

            <property name="url" value="jdbc:mysql://localhost:3306/mybatisTest?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT"/>

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

            <property name="password" value="131138"/>

        </dataSource>

    </environment>

    <!--在线数据库-->

    <environment id="online">

        <transactionManager type="JDBC"/>

        <dataSource type="POOLED">

            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

            <property name="url" value="jdbc:mysql://localhost:3306/mybatisTest?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT"/>

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

            <property name="password" value="131138"/>

        </dataSource>

    </environment>

</environments>

<!--sql mapper(sql映射文件)的位置-->

<mappers>

    <!--

    一个mapper标签指定一个文件的位置

    从类路径开始的路径信息。target/class

    -->

    <mapper resource="cqutlc\dao\studentDao.xml"/>

</mappers>

输出:

image.png

2.1.3insert操作

image.png

2.2MyBatis对象分析

主要类的介绍

1.Resources:mybatis中的一个类,负责读取主配置文件

InputStream in= Resources.getResourceAsStream(config);

2.SqlSessionFactoryBuilder:创建SqlSessionFactory对象

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); SqlSessionFactory factory=builder.build(in);

3.SqlSessionFactory:重量级对象,程序创建一个这样的对象耗时较长,使用资源较多。在整个项目中,有一个就够了。

SqlSessionFactory作用:获取SqlSession对象,SqlSession sqlSession=factory.openSession();

4.SqlSession

SqlSession接口:定义了操作数据的方法,delete(),commit(),update()等

使用要求:SqlSession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,使用openSession获取SqlSession

在执行完sql语句之后,需要关闭它,执行SqlSession.close(),这样才可以保证它的使用是安全的。

三、MyBatis框架Dao代理

3.1Dao代理实现数据库操作

传统Dao实现select操作

studentDao.xml

<select id="selectStudents" resultType="cqutlc.domain.Student">

select id,name,email,age from school.students order by id

</select>

studentDao:

package cqutlc.dao;

import cqutlc.domain.Student;

import java.util.List;

public interface studentDao {

List<Student> selectStudents();

}

studentDaoImpl:

image.png 测试类

image.png 利用动态代理实现(重点)

mybatis根据dao的方法调用,获取执行sql语句的信息。mybatis根据你的dao接口,创建出一个dao接口的实现类,并创建这个类的对象,完成sqlSession调用方法,访问数据库。

image.png

3.2深入理解传入参数

传入参数:从Java代码中把数据传入到mapper文件的sql语句中。

​ parameterType:写在mapper文件中的一个属性,它是表示dao接口中方法的参数的数据类型。(不是强制要写,因为mybatis通过反射机制能够发现接口参数的数据类型)

​ ps:#{}=?(没有sql注入风险)

多个参数

1.@Param

语法:

xxx(@Param("myname") String name,Integer age)

mapper文件对应写法

select * from student where name=#{myname}

2.传入的参数是一个对象类型

语法:#{属性名,javaType=类型名称,jdbcType=数据类型}

简化方式 #{属性名}

3.按位置

语法:#{arg位置}

#和$的区别

#:占位符,告诉mybatis使用实际的参数值代替。(不会存在注入问题,用?替代了)

: 字 符 串 替 换 , 告 诉 m y b a t i s 使 用 :字符串替换,告诉mybatis使用:字符串替换,告诉mybatis使用包含的“字符串”替换所在位置。(存在注入风险,因为直接填入了,没有用?代替)

一般用于替换列名orderby一般用于替换列名 order by {xxx}

3.3封装MyBatis输出结果

resultType

结果类型,指sql语句执行完后,数据转为的Java对象(类型任意)。

处理方式:

1.mybatis执行sql语句,然后mybatis调用类的无参构造方法,创建对象

2.mybatis把ResultSet指定列值付给同名的属性。

当然也可以返回简单类型,如:int。(全限定名称或者别名都可以,最好用全限定名称:java.lang.Integer)

定义自定义类型的别名

方法一:

1.在mybatis主配置文件中定义,使用 。

2.可以在resultType中使用自定义别名。

方法二:

name是包名,这个包中的所有类,类名就是别名(类名不区分大小写)

模糊like

<select id="selectLikeOne" resultType="cqutlc.domain.Student">

    select id,name,email,age from school.students where name like  #{name}

</select>

@Test

public void testSelectLikeOne(){

    SqlSession sqlSession=MyBatisUtils.getSqlSession();

    studentDao dao=sqlSession.getMapper(studentDao.class);

    String name="%李%";

    List<Student> students=dao.selectLikeOne(name);

    students.forEach(student -> System.out.println());

    sqlSession.close();

}

四、MyBatis框架动态SQL

动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where的部分发生变化。

动态sql的实现使用的是mybatis提供的各种标签。

4.1动态SQL之

语法:

部分sql语句

对于该标签的执行,当test的值为true时,会将其包含的SQL片断拼接到其所在的sql语句中。

image.png

image.png

4.2动态SQL之 <where.>

用来包含多个 的,当多个if有一个成立的,会自动增加一个where关键字,并去掉if中多余的and ,or等。

image.png

image.png

4.3动态SQL之 <foreach .>

循环Java中的数组,list集合的,主要用在sql的in语句中

image.png

image.png

4.4动态SQL之 代码片段

sql代码片段,就是复用一些语句

步骤:

1.先使用sql自定义名称 sql语句,表名,字段

2.再使用,

<sql id="studentSql">

    select  id,name,email,age from school.students

</sql>

<select id="selectForeachOne" resultType="cqutlc.domain.Student">

    <include refid="studentSql"/>

     where id in

    <foreach collection="list" item="id" open="(" close=")" separator=",">

        #{id}

    </foreach>

</select>

好啦,今天的文章就到这里,希望能帮助到屏幕前迷茫的你们