- MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis
获取途径:
-
maven仓库:
org.mybatis mybatis 3.4.6 -
GitHub:Releases · mybatis/mybatis-3 (github.com)
-
中文文档:mybatis – MyBatis 3 | 简介
数据持久化:将一些需要保存的数据从内存转入到硬盘当中,使得数据永久存在于电脑中
-
内存中的数据断电即失
-
一些重要的数据需要保存起来方便下次直接使用提高效率
-
使得程序拥有记忆功能
持久化的方式:数据库(jdbc)、io文件持久化
Dao层、Service层、Controller层…
持久化层:是指实现将数据持久化的一系列代码操作
1.4 mybatis的优点- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用
- 灵活: sql写在xml里,便于统一管理和优化。
- 解除sql与程序代码的耦合:sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
1、创建数据库
create table users( uid int(20) primary key not null, uname varchar(30) not null, upaw varchar(30) not null ) insert into users (uid,uname,upaw) values(1,"zhangsan","123")
2、新建项目
1、新建一个普通的maven项目(作为父项目)
2、配置maven依赖
mysql
mysql-connector-java
8.0.16
org.junit.jupiter
junit-jupiter-api
5.7.0
org.mybatis
mybatis
3.5.2
3、在项目中新建一个子模块
2.2 创建一个模块-
创建mybatis配置文件
-
编写mybatis工具类
public class MybatisUtil { private static SqlSessionFactory sqlSessionFactory; static{ //使用mybatis的第一步,获取SQLSessionFactory对象 InputStream inputStream = null; try { String resource = "mybatis-config.xml";//对应的配置文件 inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 // 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
-
编写实体类
-
编写Dao层接口
select * from users; -
实现Dao层接口
//获取sqlsession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //执行SQL语句 UseDao mapper = sqlSession.getMapper(UseDao.class); ListuserList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } //关闭流 sqlSession.close();
注意:
-
maven约定大于协议,有时候xml文件不能及时导入到target文件当中去,尽量将配置文件放在resources文件下
-
xml文件中不能写中文注释,否则会报错
-
jdbc中的URL后面需要加上时区 serverTimezone=GMT"
- 利用更长的全限定名来将不同的语句隔离开来,同时也实现了接口绑定
- 将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁
-
id:namespaces绑定接口中的方法
-
resultType:返回值的类型(需要对应的实体类全路径)
-
parameterType:参数对应的类型
SQL语句中提取方法的参数可以使用#{参数名}来提取,当参数是一个类时,参数名可一是类中的属性
3.4 updateinsert into mybatis.users (uid,uname,upaw) values (#{uid},#{uname},#{upaw});
3.5 deleteupdate mybatis.users set uname = #{uname} where uid = 2;
delete from mybatis.users where uid = #{uid};
注意:增删改都需要提交事务(SQLSession.commit)
3.6 map当参数过多时可以使用一个map对象作为参数,将需要传递的参数以键值对的形式存入map集合中
SQL可以用#{key}提取出对应的值
4、配置解析 4.1 核心配置文件
- mybatis-config.xml
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
- configuration(配置)
既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
配置资源文件:
classname=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT username=root password=123456
通过下列标签进行导入
设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值
4.3 类型别名
- 类型别名可为 Java 类型设置一个缩写名字。
- 它仅用于 XML 配置,意在降低冗余的全限定类名书写
类型别名的两种方式:
1、直接对类取别名
2、也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
使用 Bean 的首字母小写类名来作为它的别名,也可以使用注解来为包下的类起别名:@Alias(“author”)
两种方式的选择:当需要的类较少时,可以使用第一种方法给每个类去一个别名。当类居多时,可以使用第二种方式直接导入包,省去给每个类都写包名,并且每个类也可以使用注解取别名;
还有一些系统自动写好的别名,比如八大基础类型以及对应的包装类、集合,可以直接小写使用。 注:通常基础类型在前面加"_"
4.4 环境配置环境配置是必不可少的,mybatis需要通过环境配置来连接数据库并对其进行操作
- MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中
- 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
- 每个数据库对应一个 SqlSessionFactory 实例
可以通过以下方式来指定SQLSessionFactory对象的环境
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
环境配置的模板:
提示 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
4.5 映射器每一个mapper都需要在核心配置文件中进行注册,注册的方式分为三种
-
通过完整的mapper.xml文件URL进行注册
-
通过mapper绑定的接口类URL进行注册
限制:
-
接口名必须与对应的mapper名一样
-
两个文件必须在同一包下
-
-
通过包的URL来绑定其下的所有mapper注册
限制:
- 接口名必须与对应的mapper名一样
- 两个文件必须在同一包下
不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder- 通过mybatis-config配置文件来生产出SqlSessionFactory对象
- 可以被实例化、使用和丢弃
- 一旦创建了 SqlSessionFactory,就不再需要它了
- 实例的最佳作用域是局部方法变量
- 可以简单理解为:数据库连接池
- 一旦被创建就应该在应用的运行期间一直存在
- 应用运行期间不要重复创建多次,不然会造成资源的浪费,甚至引起并发问题
- 实例的最佳作用域是应用作用域(application)
- 连接到连接池的一个请求
- SqlSession 的实例不是线程安全的,因此是不能被共享的
- 用完之后需要及时关闭请求
- 实例的最佳作用域是请求或方法作用域
这里的每一个mapper都代表一个业务!
5、ResultMap核心:解决数据库字段与实体类属性不一致问题
提出问题:
当我的类名与字段名不对应会怎么样?
分析问题:
类加载器只会根据字段对应的属性名进行赋值,当字段与属性名不一致时会将属性置为null
解决办法:
- 起别名:利用SQL的as给一个字段起一个与属性相同的别名
- 采用resultmap作为结果接受,只需在前面申明一个resultmap对其中的键值对做说明
property为实体类的属性名,column为数据库中字段名
提示:不一定所有字段都设立映射关系,可以只选择属性名与字段名不一致的建立映射关系
6、日志 6.1 日志工厂如果一个数据库操作出现了异常,我们需要使用日志进行排错
- SLF4J
- LOG4J 【掌握】
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING 【掌握】标准日志输出
- NO_LOGGING
需要在设置中设置具体需要使用的日志(默认不设置日志文件)有些日志还需要导包
日志结构分析
6.2 log4j什么是log4j?
- Log4j是Apache的一个开源项目
- 通过使用Log4j,我们可以控制日志信息输送的目的地是控制台控制台、文件、GUI组件
- 我们也可以控制每一条日志的输出格式
- 通过定义每一条日志信息的级别
使用log4j之前需要先导包
14 14
然后配置log4j的资源文件
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/zhu.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
最后配置核心配置文件中的日志
设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/zhu.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
最后配置核心配置文件中的日志 ```xml



