MyBatis 介绍
简介
MyBatis 是一个开源的、轻量级的数据持久化框架,前身为 IBatis。其内部封装了 JDBC,简化了数据库连接和表的CRUD操作,开发者只需要关注 SQL 语句本身。
MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。
数据持久化:内存数据持久保存到外存(文件、数据库等)中。常见的持久化方式有:IO流、JDBC、MyBatis、Hibernate 。
ORM: Object Relational Mapping,对象关系映射。是一种数据持久化思想,它在对象模型和关系型数据库之间建立起对应关系,通过 Java对象去操作数据库表中的数据。Hibernate 完全实现了 ORM 思想,而 MyBatis 是一个半自动化的 ORM 实现。
IBatis: 2002 年由 Clinton Begin 发布。2010 年从 Apache 迁移到 Google,并改名为 MyBatis,2013 年又迁移到了 Github。
官方文档
英文:mybatis – MyBatis 3 | Introduction
中文:https://mybatis.org/mybatis-3/zh/
其它教程参考:
MyBatis 教程_w3cschool
MyBatis是什么 - C语言中文网
MyBatis 优缺点
-
免费、开源。
-
轻量、小巧、易学。
-
与 JDBC 相比,极大的减少了java代码量。
-
MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于管理和优化,提高了代码的可重用性。
-
支持动态 SQL 语句。
-
支持对象与数据库记录间的关系映射。
-
支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。
缺点:
-
编写 SQL 语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。
-
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
扩展
Mybatis-Plus(简称 MP)是 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,支持 Mybatis 所有原生的特性,为简化开发、提高效率而生。可参考 MyBatis-Plus 官网。
总结:
简化数据库连接
简化增删改查操作
第一个MyBatis程序
准备表和POJO
-
表
CREATE TABLE `user` (`yhbh` varchar(32) NOT NULL COMMENT '用户编号(主键)',`yhm` varchar(32) DEFAULT NULL COMMENT '用户名(唯一)',`pwd` varchar(6) DEFAULT NULL COMMENT '密码',`yhnc` varchar(32) DEFAULT NULL COMMENT '用户昵称',`yhsf` int DEFAULT NULL COMMENT '用户身份(1:卖家(管理员),2:普通管理员,3:买家)',`sex` varchar(4) DEFAULT NULL COMMENT '性别',`yhtx` varchar(64) DEFAULT NULL COMMENT '用户头像URL',`sjh` varchar(11) DEFAULT NULL COMMENT '手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱',`zcsj` varchar(14) DEFAULT NULL COMMENT '用户注册时间',PRIMARY KEY (`yhbh`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
POJO
package com.lsy.eshop.pojo; import lombok.*;@Data public class User implements Serializable{/** 用户编号(主键)*/private String yhbh;/** 用户名(唯一)*/private String yhm;/** 密码*/private String pwd;/** 用户昵称*/private String yhnc;/** 用户身份(1:卖家(管理员),2:普通管理员,3:买家)*/private Integer yhsf;/** 性别*/private String sex;/** 用户头像URL */private String yhtx;/** 手机号*/private String sjh;/** 邮箱*/private String email;/** 用户注册时间*/private String zcsj; }
准备日志
MyBatis 通过日志框架管理日志信息,可将 log4j 日志框架引入项目。不引入日志并不影响项目运行,如果想查看 mybatis 的运行信息,则需引入。
<!-- log4j 日志框架 -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version>
</dependency>
日志配置文件
引入MyBatis
项目中使用 MyBatis,只需在classpath
下导入 mybatis.jar
包即可。下面是通过maven
导入的。
<!-- mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version>s
</dependency>
创建映射器:mapper.xml
UserMapper.xml
文件位于 resources
目录下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lsy.eshop.mapper.UserMapper">
//就可以在这里写增删改查的sql语句
//调用sql语句就是通过id<insert id="addUser" parameterType="com.lsy.eshop.pojo.User">insert into user(yhbh, yhm, pwd, zcsj)values (#{yhbh},#{yhm},#{pwd},#{zcsj})</insert><select id="selectUser" resultType="com.lsy.eshop.pojo.User">select * from user where yhbh = #{yhbh}</select>
</mapper>
mapper是映射器的意思,在mapper里面写各种sql语句
命名空间namespace就取名,包名.文件名
sql语句中id,就用方法名即可,
传参类型parameType,返回类型resultType,指明是哪种类
占位符,传参的问题:把“?”替换为“#{ 传过来的参数属性}”
通过映射文件(mapper),实现了java对象和数据库表的数据一一映射的思想
通过映射文件来封装sql语句操作,通过和sql语句同名的关键字的标签来映射指定(封装)
id的作用就是程序调用的时候通过id来找
注意:
如果 UserMapper.xml
文件没有位于 resources
目录下,而是在其它位置比如 com.lsy.ibook.dao
包下,则在 pom.xml
文件中的 <build> 标签下需添加如下配置,因为 maven
默认只会构建 resources
目录下的资源文件,其它目录下的文件需显示配置说明。
<resources><!-- 构造项目时,加载所有 src/main/java 目录下的 xml 文件 --><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource>
</resources>
管理配置文件: mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 引入数据源文件 --><properties resource="jdbc.properties" /><!-- environments 包含一组数据库使用环境,default值决定了使用哪一个 environment --><environments default="dev"><!-- 开发环境 --><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 通过表达式语法,获取 jdbc.properties 中的数据源信息 --><property name="driver" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--mappers 元素包含一组映射器(mapper),这些映射器包含了 SQL 代码和映射定义信息。--><mappers>//引入映射文件,拷贝资源路径,斜杠<mapper resource="UserMapper.xml"/><mapper class="com.lsy.projs.mapper.UserMapper"/></mappers>
</configuration>
jdbc.properties 数据源信息:
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eshop?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=rootpool.initialSize=5
pool.maxActive=20
pool.minIdle=5
pool.maxWait=6000
测试
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public static void main(String[] args) throws Exception{// 1. 读取配置文件 mybatis-config.xmlInputStream is = Resources.getResourceAsStream("mybatis-config.xml");// 2. 根据配置文件构建SqlSessionFactorySqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);// 3. 通过SqlSessionFactory创建SqlSessiontry(SqlSession session = ssf.openSession(true)){//新增User yh = new User("05","张三","123456",null,3,null,null,null,null,null);int ret = session.insert("com.lsy.eshop.mapper.UserMapper.addUser",yh);session.commit(); //增删改是事务性的操作,需提交事务System.out.println(ret);//查询User user = session.selectOne("com.lsy.eshop.mapper.UserMapper.selectUser","01");System.out.println(user);}
}
第一步,读取配置文件
第二步,通过会话工厂构造器SqlSessionFactoryBuilder
把流资源读进来创建一个会话工厂SqlSessionFactory
第三步,由会话工厂创建会话对象SqlSession
(用于跟数据库会话),默认是false,要改为true(才会自动提交)
第四步,开始调用sqi语句
namespace用来区分是哪个映射文件
通过namespace然后再找id相同,调用sql语句
封装逻辑,同名映射封装
如果不同名,那就用别名as同名,
也可以自定义映射规则:标签<resultMap>映射
补:查询的,selectOne查一个,selestList查询多个,返回值记得做一下类型转换
动态sql语句
sql语句没法固定,需要拼接,如查询
直通拼接where和去掉and
条件类拼接
内容就是,不为空,也不为空字符
if标签
set标签,
逗号会自动去掉
日志 log4j
配置文件 :log4j.properties
放在resources里面
#log level: off fatal error warn info debug all
log4j.rootCategory=debug,con#log to console
log4j.appender.con=org.apache.log4j.ConsoleAppender
log4j.appender.con.layout=org.apache.log4j.PatternLayout
#log4j.appender.con.layout.ConversionPattern=%d{MM-dd HH:mm:ss} %5p %c{5}:%L %m%n
log4j.appender.con.layout.ConversionPattern=[%5p] %c{5}:%L %m%n
Log4j 是一个用于 Java 应用程序的日志记录库,它提供了灵活和可配置的日志记录功能。其主要作用包括:
-
日志记录:Log4j 可以帮助开发者记录应用程序的运行状态、错误信息和调试信息,便于后期分析和故障排查。
-
灵活的配置:Log4j 允许通过配置文件(如 XML 或 properties 文件)定义日志记录的格式、输出目标和日志级别,使得调整日志行为变得简单。
-
多种输出目标:支持将日志输出到多个目的地,例如控制台、文件、数据库、远程服务器等,方便开发者选择适合的记录方式。
-
日志级别管理:提供多种日志级别(如 DEBUG、INFO、WARN、ERROR、FATAL),允许开发者根据不同的需求调整记录的详细程度。
-
性能优化:Log4j 设计时考虑了性能,可以异步记录日志,从而减少对应用程序主线程的影响。
-
日志格式化:支持自定义日志格式,可以定义输出日志的结构和样式,方便阅读和分析。
平常开发的时候,更建议用日志的形式输出
先注解@Log4j
然后按照定级输出
切换级别
切换 Log4j 的级别输出会影响日志记录的行为,具体来说,主要有以下几个方面的变化:
-
输出的日志信息量:
- 低级别(如 DEBUG、INFO):当设置为 DEBUG 或 INFO 时,日志会记录更多详细信息,包括调试信息、普通运行状态等。适合开发和调试阶段。
- 高级别(如 WARN、ERROR、FATAL):当设置为 WARN 或更高时,只会记录警告、错误和致命信息,减少输出的日志量,适合生产环境中使用。
-
日志文件的大小:
- 级别越低,生成的日志文件通常会越大,因为记录的信息更多。将级别提高,可以有效控制日志文件的大小。
-
调试与监控:
- 在开发和调试阶段,较低的日志级别可以帮助开发者更好地理解程序的运行情况。切换到较高级别则更适合上线后的监控,关注系统的稳定性和潜在问题。
- 演示的时候,把级别调到off,直接关闭,不用再去注释代码