Mybatis学习笔记

335 阅读4分钟

第一章

1.前置概念

三层架构

  • 界面层:和用户打交道的,接受用户的请求参数,显示处理结果。
  • 业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据。
  • 数据访问层:访问数据库,CRUD

三层对应的包

  • 界面层:Controller
  • 业务逻辑层:service包
  • 数据访问包:dao包

三层中类的交互

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

三层对应的处理框架

  • 界面层:springMVC
  • 业务逻辑层:spring
  • 数据访问层:mybatis

2.JDBC的缺陷

  • 代码比较多,效率低
  • 需要关注Connection,Statement,ResultSet对象创建和销毁
  • 对ResultSet查询的结果,需要自己封装为List
  • 重复的代码比较多
  • 业务代码和数据库的操作混在一起

3.mybatis框架

  1. sql mapper:sql映射

可以把数据库表中的一行数据 映射为一个java对象

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

  1. Data Access Object(DAOS):数据访问,CRUD

4.mybatis提供的功能

  1. 提供了Connection,Statement,ResultSet的能力,不用创建了。
  2. 提供执行sql语句的能力
  3. 提供了循环sql,把sql的结果转化为java对象,集合List的能力。
  4. 提供了关闭资源的能力,不用关闭Connection,Statement,ResultSet。

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

实现步骤:

  1. 新建的student表

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

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

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

  5. 创建一个mybatis使用的配置文件

    叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。文件是xml文件。

    写在接口所在的目录中,文件名和接口保持一致

  6. 创建mybatis的主配置文件:

    一个项目就一个主配置文件。

    主配置文件提供了数据库的连接信息和sql映射文件的位置信息。

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

第二章

1.主要类的介绍

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

InputStream in = Resources.getResourceAsStream("mybatis.xml");

SqlSessionFactoryBuilder:创建SqlSessionFactory对象

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

SqlSessionFactory:重量级对象,程序创建这个对象耗时长,整个项目中有一个就够用了

接口的实现类:DefaultSqlSessionFactory

作用:获取SqlSession对象

openSession方法说明:

  1. openSession():无参数的,获取非自动提交事务的SqlSession对象
  2. openSession(boolean):openSession(true) 获取自动提交事务的SqlSession对象
SqlSession sqlSession = factory.openSession();

SqlSession接口:定义了操作数据的方法,例如selectOne,selectList,insert,update,delete,commit,roolback

使用要求:Sqlsession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,要使用openSession()获取Sqlsession对象。在执行完sql语句后,需要关闭他。才能保证其线程安全。

第三章

1.动态代理

传统的dao的增删改查太过冗余,所有可以通过dao中方法的返回值确定MyBatis要调用的SqlSession方法。

MyBatis的动态代理:mybatis根据dao的方法调用,获取执行sql语句的信息

mybatis根据你的dao接口,创建出一个dao接口的实现类,并创建这个类的对象,完成SqlSession调用方法,访问数据库。

使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)

getMapper能获取dao接口对于的实现类对象。

2.传入参数

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

parameterType:

写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型。不是强制的,可以通过反射机制能够发现接口参数的类型,一般不写

传入一个简单参数

简单类型:mybatis把java的基本数据类型和String都叫简单类型

在mapper文件获取简单类型的一个参数的值 #{}

传入多个参数

  1. 使用@Param
接口:public List<Student> selectMulitParam(@Param("stuName") String name,@Param("stuAge") Integer age);

mapper文件:select * from student where name=#{stuName} or age=#{stuAge}
  1. 使用对象
需要创建一个QueryParam类,有stuName和stuAge两个属性

接口: public List<Student> selectMulitParam(QueryParam param);

mapper文件:select * from student where name=#{stuName} or age=#{stuAge}

#和$两种占位符

#,告诉mybatis使用实际的参数值替代。并使用PrepareStatement对象执行sql语句,#{...}代替sql语句的?。安全,迅速,这是首选做法

$,字符串替换,告诉mybatis使用$包含的字符串替换所在的位置。使用Statement把sql语句和${}的内容连接起来。主要用在替换表名,列名,不同列排序等操作。效率比#低,容易引起sql注入。

select * from studnet order by ${colName}

3.封装MyBatis输出结果

resultType:结果类型

指sql语句执行完毕后,数据转为的java对象,java类型是任意的,不必非得是实体类,可以自定义另一个对象。

简单类型:resultType="int",可以直接放别名,也可放入全限定名称。

Map:列名是map的key,列值是map的value。只能执行返回值是一行的记录。

resultMap:结果映射

指定列名和java对象的属性对应关系

应用:

  1. 你自定义列值赋给哪个属性
  2. 当你的列名和属性名不一样时,一定使用resultMap
<resultMap id="studentMap" type="com.mybatisCourse.domain.Student">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <result column="email" property="email"></result>
    <result column="age" property="age"></result>
</resultMap>
<select id="selectAllStudentByMap" resultMap="studentMap">
    select id,name,email,age from student
</select>

Like模糊

java代码指定like的内容

<select id="selectLikeOne" resultType="com.mybatisCourse.domain.Student">
    select id,name,email,age from student where name like #{name};
</select>

第四章 动态SQL

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

动态sql的实现,使用的是mybatis提供的标签,<if> <where> <foreach>

<if test="判断java对象的属性值">
    部分sql语句
</if>
<where> 用来包含多个<if>,当多个if有一个成立时,<where>会自动增加一个where关键字,并去掉if中多余的and,or等

第五章 配置文件

1.主配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置
    1.约束文件
    <!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
    2.configuration 根标签,配置信息
-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--
    settings:控制mybatis全局行为
    -->
    <settings>
        <!--日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--
    1.环境配置:数据库的链接信息
    default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息
    -->
    <environments default="development">
        <!--
        environment:一个数据库信息的配置,环境
        id:唯一值,自定义
        -->
        <environment id="development">
            <!--
            transactionManager:mybatis的事务类型
                type:JDBC(表示使用的jdbc中的Connection对象的commit,roolback做事务处理)
                      MANAGED 把mybatis的事务处理委托给其他的容器,一个服务器软件,一个框架(spring)
            -->
            <transactionManager type="JDBC"/>
            <!--
            dataSource:表示数据源,连接数据库
                java 体系中,规定实现了javax.sql.DataSource接口的都是数据源
                type:表示数据源的类型,POOLED表示使用链接池
                    1) POOLED:使用连接池,mybatis会创建POOLedDataSource类
                    2) UPOOLED:不使用连接池,在每次执行sql语句,先创建连接,执行sql,再关闭连接(一般不用)
                    3) JNDI:java命名和目录服务,类似于windows注册表,不重要
            -->
            <dataSource type="POOLED">
                <!--
                    driver,url,username,password 是固定的,不能自定义
                -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/student"/>
                <property name="username" value="root"/>
                <property name="password" value="cong0917"/>
            </dataSource>
        </environment>
    </environments>
    <!--sql映射文件的位置-->
    <mappers>
        <!--
        一个mapper标签指定一个文件的位置
        从类路径开始的路径信息
        -->
        <mapper resource="com/mybatisCourse/dao/StudentDao.xml"/>
    </mappers>
</configuration>

2.数据库的属性配置文件:

把数据库连接信息放到一个单独的文件中。和mybatis主配置文件分开。

目的是便于修改,保存,处理多个数据库的信息。

  • 在resources目录中定义一个属性配置文件,xxx.properties,例如jdbc.properties。在属性配置文件中,定义数据,格式是key-value。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student
jdbc.username=root
jdbc.password=cong0917
  • 在mybatis的主配置文件中,使用<property>指定文件的位置。在需要使用的地方,${key}
<!--指定properties文件的位置-->
<properties resource="jdbc.properties" />

<dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</dataSource>

3.指定多个mapper文件

<!--第一种:挨个指定-->
<mappers>
    <!--
    一个mapper标签指定一个文件的位置
    从类路径开始的路径信息
    -->
    <mapper resource="com/mybatisCourse/dao/StudentDao.xml"/>
</mappers>
<!--
第二种,使用包名
name:mapper文件所在的包名,这个包中的所有xml文件一次都能加载给mybatis
使用package的要求:
    1.mapper文件名称需要和接口名称一样,区分大小写
    2.mapper文件和dao的接口需要在同一目录
-->
<mappers>
    <package name="com.mybatisCourse.dao"/>
</mappers>