mybatis学习笔记(新)

框架概述

三层架构

在项目开发中,遵循的开发模式。

  • 第一层:界面层,用来接收客户端的输入,调用业务逻辑层进行功能处理,返回结果给客户端。(servlet就是界面层的功能)
  • 第二层:业务逻辑层,用来进行整个项目的业务逻辑处理,向上为界面层提供处理结果,向下对数据访问层要数据
  • 第三层:数据访问层:专门用来进行数据库的增删改查操作,向上为业务逻辑层提供数据。
    各层之间的调用顺序是固定的,不允许跨层访问。
    界面层《=》业务逻辑层《==》数据访问层
  • 结构清晰、耦合度低、各层分工明确。
  • 可维护性高、可扩展性高
  • 有利于标准化
  • 开发人员可以只关心整个结构中某一部分
常用的框架SSM

Spring:它是整合其他框架的框架,它的核心是IOC和AOP,由20多个模块构成,在非常多的领域都提供了很好的解决方案,
SpringMVC是Spring家族中的一员,专门用来优化控制器(servlet)的,提供了非常简单的数据提交,数据携带,页面跳转等功能。
MyBatis:是持久化层的一个框架,用来进行数据库访问的优化,专注与sql语句,极大的简化了JDBC的访问。

什么是mybatis框架

框架是一个半成品软件,将所有的公共的,重复的功能解决掉,帮助开发人员快速高效的进行开发,可复用,可扩展的工具。

MyBatis框架:

Mybatis是 apache的一个开源项目,主要是完成数据访问层的优化,它专注于sql语句,简化了JDBC繁琐的访问形式。

添加框架的步骤:
1、 添加依赖;
2、添加配置文件。

具体步骤:
1、新建库和表
2、新建maven项目
3、修改目录,添加缺失的目录,修改目录属性
4、修改pom.xml文件,添加mybatis的依赖,添加mysql的依赖
5、修改pom.xml文件,添加资源文件指定
6、在idea中添加数据库的可视化
7、添加jdbc.properties属性文件(数据库的配置)
8、添加SqlMapConfig.xml文件(mybatis的核心配置文件)
9、创建实体类student用来封装数据。
10添加完成表的增删改查的功能的StudentMapper.xml文件。
11、创建测试类,进行功能测试。

<!--添加mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    <!--添加mysql依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.32</version>
    </dependency>

添加资源文件:

<build>
  <resources>
<resource>
  <directory>src/main/java/study</directory>
  <includes>
    <include>**/*.xml</include>
    <include>**/*.properties</include>
  </includes>
  </resource>

  <resource>
  <directory>src/main/resources</directory>
  <includes>
    <include>**/*.xml</include>
    <include>**/*.properties</include>
  </includes>
  </resource>
  </resources>
</build>

在测试类中应该写的查询步骤:

//使用文件流读取核心配置文件sqlmapconfig.xml
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //取出sqlSession的对象
        SqlSession sqlSession = factory.openSession();
        //完成查询操作
        List<Student> list = sqlSession.selectList("zar.getAll");
        list.forEach(student -> System.out.println(student));
        //关闭sqlSession
        sqlSession.close();
mybatis对象分析
Resources类:

就是解析SqlMapConfig.xml文件,创建出相应的对象。InputStream in = Resources.getResourceAsStream(“SqlMapConfig.xml”);

SqlSessionFactory:

SqlSessionFactory是个接口,使用ctrl+h快捷键查看本接口的子接口及实现。 DefaultSqlSessionFactory是实现类,SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

SqlSession:

也是一个接口,DefaultSqlSession是其实现类。

为实体类注册别名

1、单个注册

2、批量注册

设置日志输出
 <!--设置日志输出底层执行的代码-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

动态代理

无法在业务逻辑层访问xml文件中的功能。
解决方案:使用动态代理。
在业务逻辑层依然使用接口调用xml文件中的功能,这个功能由动态代理对象代理出来。
动态代理存在的意义:在三层架构中,业务逻辑层要通过接口访问数据访问层的功能,动态代理可以实现。

动态代理的实现规范:
1、UserMapper.xml文件与UserMapper.java的接口必须在同一个目录下。
2、UserMapper.xml文件与UserMapper.java的接口的文件名必须一致,后缀不管。
3、UserMapper.xml文件中标签的id值与UserMapper.java的接口中方法的名称完全一致。
4、UserMapper.xml文件中标签的parameterType属性值与UserMapper.java的接口中方法的参数类型完全一致。
5、UserMapper.xml文件中标签的resultType值与UserMapper.java的接口中方法的返回值类型完全一致。
6、UserMapper.xml文件中标签中namespace属性必须是接口的完全限定名称。
7、在SqlMapperConfig.xml文件中注册mapper文件时,使用class=接口的完全限定名称。

动态代理访问的步骤

1、建表Users
2、新建maven工程,刷新可视化
3、修改目录
4、修改pom.xml文件,添加依赖。
5、添加jdbc.properties文件到resources目录下
6、添加SqlMapConfig.xml文件
7、添加实体类
8、添加mapper文件夹,新建UsersMapper接口
9、在mapper文件夹下,新建UsersMapper.xml文件,完成增删改查功能
10、添加测试类,测试功能

<?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>
    <!--读取jdbc.properties属性文件-->
    <properties resource="jdbc.properties"></properties>
    <!--设置日志输出-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--注册实体类的别名-->
    <typeAliases>
        <package name="com.study.pojo"></package>
    </typeAliases>
    <!--配置环境变量-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
    
    <!--注册mapper.xml文件-->
</configuration>

#{}和${}区别:
传参大部分使用前者,它的底层使用的是PreparedStatement对象,是安全的数据库访问,防止sql注入。
#{}里如何写,看parameteType参数的类型。
1、如果parameteType的类型是简单类型(八种基本类型+String),则#{}里随便写。
2、parameteType的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写。
叫 字 符 串 拼 接 或 者 字 符 串 替 换 1 、 字 符 串 拼 接 一 般 用 于 模 糊 查 询 中 , 建 议 少 用 , 因 为 由 s q l 注 入 风 险 , 也 分 两 种 情 况 , 同 样 的 看 p a r a m e t e T y p e 类 型 。 2 、 如 果 p a r a m e t e T y p e 类 型 是 简 单 类 型 , 则 {}叫字符串拼接或者字符串替换 1、字符串拼接一般用于模糊查询中,建议少用,因为由sql注入风险,也分两种情况,同样的看parameteType类型。 2、如果parameteType类型是简单类型,则 1sqlparameteType2parameteType{}随便写,但是分版本,如果是3.5.1及一下,则只能写value。
3、如果parameteType是实体类,则只能是类中成员变量的名称。(现在已经少用)
优化后的模糊查询(以后都要用这种方式)

 <select id="getByNameGood" parameterType="string" resultType="users">
        select id,usersname,birthday,sex,address
        from users
        where usersname like concat('%',#{name},'%')
        
    </select>

动态sql

什么是动态sql:

可以定义代码片段,可以进行逻辑判断,可以进行循环处理(批量处理),使得条件判断更为简单。
1、:用来定义代码片段,可以将所有的列名,或复杂的条件定义为代码片段,供使用时调用
2、:用来引用定义的代码片段。
3、:进行条件判断
4、进行多条件拼接,在查询,删除,更新中使用。
5、:有选择的进行更新处理,至少更新一列。
6、:用来进行循环遍历,完成循环条件查询,批量删除,批量增加,批量更新。foreach参数详解:
collection:用来指定入参的类型,如果是List集合,则为list,如果是Map集合,则为map,如果是数组,则为array。
item:每次循环遍历出来的值或对象。
separator:多个值或对象或语句之间的分隔符。
open:整个循环外面的前括号。
close:整个循环外面的后括号。

指定参数位置:

如果入参是多个,可以通过指定参数位置进行传参,是实体类包含不住的条件。
实体类只能封装住成员变量的条件,如果某个成员变量要有区间范围内的判断,或者有两个值进行处理,则实体类包不住。
例如,查询指定日期范围内的用户信息。

入参是map(重点掌握):

如果入参超过一个,使用map封装查询条件,更有语义,查询条件更明确。

返回值是map

如果返回的数据实体类无法包含,可以使用map返回多张表中的若干数据,返回后这些数据之间没有任何关系,就是Object类型。返回的map的key就是列名或别名。

表之间的关联关系

1、一对多关联
2、多对一关联
3、一对一关联
4、多对多关联

事务

多个操作同时完成,或同时失败称为事务处理。
事务有四个特性:一致性,持久性,隔离性,原子性。
在mybatis中设置事务
程序员自己控制处理的提交和回滚。

可设置为自动提交。
sqlSession = factory.openSession(true);即为自动提交。在增删改后不需要commit。

缓存

mybatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存。
使用缓存的目的:提高查询效率。如果数据库中发生改变,则清空缓存。
使用缓存后,查询的流程:
查询时,先到缓存里查,如果没有则查询数据库,放缓存一份,再返回客户端,下次再查询的时候直接从缓存返回,不再访问数据库,如果数据库发生commit操作,则清空缓存。

一级缓存,使用的是SqlSession的作用域,同一个SqlSession共享一级缓存的数据。
二级缓存使用的是mapper的作用域,不同的SqlSession只要访问的是同一个mapper.xml文件,则共享二级缓存作用域。

ORM:

什么是ORM:对象关系映射。
mybatis框架是ORM非常优秀的框架,java语言中以对象的方式操作数据,存到数据库中是以表的方式进行存储,对象中的成员变量与表中的列之间的数据互换称为映射,整套这个操作称为ORM。
持久化操作:将对象保存到关系型数据库中,将关系型数据库中的数据读取出来以对象的形式封装。
mybatis是持久化层优秀的框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mingshengda

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

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

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

打赏作者

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

抵扣说明:

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

余额充值