前言
知道要学习SSM框架,于是假期便开始了准备,把Maven、JDK动态代理、反射机制学完了,然后Mybatis当时只学完了一半,可惜到现在mybatis忘的差不多了,便下定决心,用8天时间把mybatis学完,因为有了Spring框架的学习,在加上有所基础,料想应该不难,既如此,那就开干
框架概述
三层架构
三层架构包含的三层:界面层、业务逻辑层、数据访问层
三层的职责
- 界面层(表示层、视图层):主要功能是接收用户的数据,显示请求处理结果。使用web页面和用户交互,手机app也就是表示层,用户在app中操作,业务逻辑在服务器端处理
- 业务逻辑层:接收表示层传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据
- 数据访问层:与数据库打交道,主要实现对数据的增删改查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库
三层对应的包
- 界面层:controller包(servlet)
- 业务逻辑层:service包(XXXService类)
- 数据访问层:dao包(XXXDao类)
三层对应的处理框架
- 界面层—servlet—springmvc(框架)
- 业务逻辑层—service类—spring(框架)
- 数据访问层—dao类—mybatis(框架)
框架释义
-
框架是一个舞台,一个模板
-
模板:已经规定好了一些条款、内容,可以加入自己所写的功能,这些功能可以利用框架中写好的功能
-
框架是整个或部分系统的可重用设计
-
框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能 才是完整的,基础功能可重复用的,可升级的
-
框架的特点:
- 框架一般不是全能的,不能做所有事情
- 框架是针对某一个领域有效,特长在某一方面,比如mybatis做数据库操作强,但是不能做其他的
- 框架就是一个软件
JDBC缺陷
- 代码比较多,开发效率低
- 需要关注Connection,Statement,ResultSet对象创建和销毁
- 对ResultSet查询结构,需要自己封装为List
- 重复的代码比较多
- 业务代码和数据库的操作混在一起
- 初级解决办法是写好工具类,进行调用
mybatis介绍
- mybatis是一个sql映射框架(SQL Mapper Framework for Java)
- 可以把数据库中的一行数据,映射为一个java对象
- 一行数据可以看作是一个java对象,操作这个对象,相当于操作表中的数据
- Data Access Objects(DAOs):数据访问,对数据库执行增删改查
mybatis提供的功能
- 提供了Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了
- 提供了执行sql语句的能力,不用你执行sql
- 提供了循环sql,把sql结果转为Java对象,List集合的能力
- 提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet
- 最后,开发人员提供了sql语句,mybatis处理sql,开发人员得到List集合或java对象(表中的数据)
**小结:**mybatis是一个sql映射框架,提供数据库的操作能力,增强的JDBC,使用mybatis让开发人员集中精神写sql就可以了,不必关注Connection、Statement、ResultSet的创建,销毁,sql的执行
以上为假期的简单回顾
MyBatis
跟着尚硅谷的视频进行自学
历史
MyBatis最初是Apache的一个开源项目iBatis
特性
1️⃣MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
2️⃣MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
3️⃣MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的信息
4️⃣MyBatis是一个 半自动的ORM(Object Relation Mapping)框架
下载
来到MyBatis官方提供的下载源
解压后可以看到官方对于MyBatis所写的文档
比较
-
JDBC
- SQL夹杂在Java代码中耦合度高,导致硬编码内伤(硬编码把代码写死)
- 维护不易且实际开发需求中SQL有变化,频繁修改的情况多见
-代码冗余,开发效率低
-
Hibernate和JPA
- 操作简单,开发效率低
- 程序中的长难度复杂 SQL需要绕过框架
- 内部自动产生的SQL,不容易做特殊优化
- 基于全映射的全自动框架,大量的字段的POJO进行部分映射时比较困难
- 反射操作太多,导致数据库性能下降
-
MyBatis
- 轻量级,性能出色
- SQL 和 Java编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
- 开发效率略逊于Hibernate,但是完全能够接收
搭建MyBatis
开发环境
IDE: IDEA 2020.3.4(Ultimate Edition)
构建工具:Maven 3.3.9
MySQL版本:MySQL 5.7.37
MyBatis版本:MyBatis 3.5.7
补充两句: 通过maven管理依赖,需要导入依赖时,maven会先在本地仓库查询,如果有直接导入;如果没有,查看配置文件,看是否配有中央仓库的镜像仓库,如果没有在从中央仓库下载,只不过速度没有保证~
创建maven工程
MyBatis核心配置文件
-
习惯上命名为mybatis-config.xml,这个文件名只是建议,并非强制要求
-
将来整合Spring之后,这个配置文件可以省略……
核心配置文件主要用于 配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置 src/main/resources目录下
配置文件中的内容直接来官方文档里复制粘贴
mybatis的配置文件中用来约束的是dtd文件,而spring的则是xsd文件
因为配置文件中http://mybatis.org/dtd/mybatis-3-config.dtd
这句话爆红,所以先来解决这个问题
创建mapper接口
MyBatis中的mapper接口相当于以前的dao,但是区别在于,mapper仅仅是接口,不需要提供实现类
创建MyBatis的映射文件
相关概念:ORM(Object Relationship Mapping)对象关系映射
- 对象:Java的实体类对象
- 关系:关系型数据库
- 映射:二者之间的对应关系
Java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
1、映射文件的命名规则:
表所对应的实体类的类名+Mapper.xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
因此一个映射文件对应一个实体类,对应一张表的操作
测试添加功能
- SqlSession:代表Java程序和数据库之间的会话(HttpSession是Java程序和浏览器之间的对话)
- SqlSessionFactory:是"生产"SqlSession的"工厂"
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后使用这个工厂类来“生产”我们需要的对象
sqlsession是mybatis提供的操作数据库的会话对象
优化功能
自动提交
查阅资料和观看视频了解到
- openSession()方法有带参数为autoCommit的布尔值,即是否自动提交
但openSession(true),即括号内为true时,mybatis是可以自动提交修改后的数据
当openSession(),即括号内为空(默认是false),为手动提交,需要最后调用sqlsession.commit()来完成事务提交
不知什么原因,IDEA中方法参数提示只有带参数为b的布尔值,但是不影响
SqlSession默认不自动提交事务,若需要自动提交事务,可以使用SqlSessionFactory.openSession(true)
加入log4j的日志功能
1️⃣pom.xml中加入log4j依赖
<!-- log4f日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2️⃣加入log4j的配置文件
log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
日志的级别
FATAL(致命)>ERROR(错误)>WRAN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
问题出现了:爆红(不影响运行,但控制台不输出日志)
注意两点:
- log4j.xml存放的位置是src/main/resources目录下
- 没有输出日志,需要重启IDEA
测试修改和删除功能
有了之前的基础,修改和删除就不难了
发现一个问题:mybatis保存到数据库的中文显示问号
解决方案:在mybatis核心配置文件的数据库连接处加上?useUnicode=true&characterEncoding=UTF-8
这句话
测试查询功能
-
查询功能的标签必须设置resultType或resultMap
-
resultType:设置默认的映射关系(用于字段名和属性名保持一致的情况)
-
resultMap:设置自定义的映射关系(用于一对多或多对一或字段名和属性名不一致情况)
查询整张表
补充
关于集合、数组快速输出
小结
mybatis框架到此已经搭建完了,总的来说,不算难理解,只不过中间遇到了几个问题,但还不错,都解决了,接下来就是继续学习了
简单回顾