初识MyBatis
文章目录
1.MyBatis简短介绍
MyBatis前身是iBatis,本是Apache的一个开源的项目
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
entity ——> pojo
dao ——>mapper
impl——>XML
官方网站 http://mybatis.org
中文官网网站:https://mybatis.org/mybatis-3/zh/
ORM框架
实体类和SQL语句之间建立映射关系
特点
1.基于SQL语法,简单易学
2.能了解底层封装过程
3.SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
4.方便程序代码调试mybatis工作原理
(1)mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。 (2)mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。 (3)通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。 (4)SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。 (5)Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。
2.持久化与ORM
持久化: 持久化是程序数据在瞬时状态和持久状态间转换的过程
ORM(Object Relational Mapping)
编写程序的时候,以面向对象的方式处理数据
保存数据的时候,却以关系型数据库的方式存储ORM解决方案包含下面四个部分
- 在持久化对象上执行基本的增、删、改、查操作
- 对持久化对象提供一种查询语言或者API
- 对象关系映射工具
- 提供与事务对象交互、执行检查、延迟加载以及其他优化功能
3.搭建MyBatis开发环境
使用MyBatis的开发步骤
步骤1、在maven中添加Mybatis依赖包
步骤2、编写MyBatis核心配置文件(configuration.xml)
步骤3、创建实体类-POJO(原entity实体类)
步骤4、Mapper(原dao层)层-SQL映射文件(mapper.xml)
步骤5、创建测试类
① 读取核心配置文件mybatis-config.xml
② 创建SqlSessionFactory对象,读取配置文件
③ 创建SqlSession对象
④ 调用mapper文件进行数据操作mybatis搭建结构预览
<!--步骤1、在maven中添加Mybatis依赖包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!--添加mysql驱动jar包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!-- 添加测试类junit的jar包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!--在maven中添加log4j依赖包便于观察sql信息--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>
mybatis-config.xml文件配置内容
需要注意的是配置文件里的标签是有顺序的,顺序不对会出错
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- ———————————————————————————————————————————————————————————————————————————————— plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers? --> <!--1.properties:配置(可代替)数据源属性--> <!--2.settings:设置MyBatis框架的运行时行为--> <!--3.typeAliases:为java的类取一个简短的别名,从而不需要使用完全限定类名, 也可以设置包名,建议设置包名因为一个包下有多个类,所以每个类都配置的话太多太繁琐了 设置包名后,里面的对象名会默认改为小写的并且是全小写不是驼峰命名 --> <!--4.environments 配置框架的运行环境(数据库连接字符串和设置事务类型)--> <!--5.mappers 用于配置需要引用的SQL映射文件的位置 也可以设置包名,方式和第三步的设置包名方式一致 --> <!-- ———————————————————————————————————————————————————————————————————————————————— --> <!--根节点--> <configuration> <!-- 1.引入包含数据库连接参数的database.properties文件或者自己配置--> <!-- 读取一些外部的(可替代)的属性 此处读取mysql.properties的连接字符串--> <properties resource="mysql.properties"/> <!-- 也可以用直接配置的方式来配置数据源信息--> <!-- <properties>--> <!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>--> <!-- <property name="url"--> <!-- value="jdbc:mysql://localhost:3306/shopping_website?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"></property>--> <!-- <property name="user" value="root"/>--> <!-- <property name="password" value="root"/>--> <!-- </properties>--> <!-- 2.设置 MyBatis 框架的运行时行为--> <settings> <!-- 使用 Log4j 作为 MyBatis 框架的运行环境--> <setting name="logImpl" value="log4j"/> </settings> <!-- 3.设置别名 使用别名后xml映射文件可以用别名指定返回类型等操作--> <!-- 但是一般不推荐使用,可能会有同名类--> <!-- 最好不设置别名 使用包名+类名就可以了 --> <typeAliases> <!-- package指定包下列所有实体类别名为全小写--> <!-- <package name="com.pojo"/>--> <!-- typeAlias指定单个类的别名--> <!-- <typeAlias type="com.pojo.User" alias="别名"/>--> </typeAliases> <!-- 4.配置MyBatis 框架的运行环境 即环境配置容器--> <!-- default:由于可以配置多个数据源所以是用于指定配置环境容器中的某个数据源 指定方式 将default的值改成容器中environment数据源的id值即可--> <environments default="development"> <!--environment环境配置 id用于让框架选择数据源,即标识--> <environment id="development"> <!-- transactionManager配置事务管理器,采用JDBC事务,由应用自行管理事务--> <!-- 用于指定事务管理类型,有两种选项--> <!-- JDBC:直接使用JDBC的提交和回滚功能,依赖程序代码对事务进行管理--> <!-- MANAGED:表示由容器负责,例如spring框架提供的事务机制--> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源,POOLED:MyBatis提供的数据源,JNDI:JNDI数据源--> <!-- 提供了三种数据源类型--> <!-- UNPOOLED:表示采用非池化的连接管理--> <!-- POOLED:表示MyBatis框架实现简单的数据库连接池类型--> <!-- JNDI:表示使用容器中以JNDI范式提供的数据源资源--> <dataSource type="POOLED"> <!--${}引用定义的参数,此处参数来自mysql.properties文件--> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> <!--可配置多个数据源 只需要容器的default属性指定其中一个即可--> <!-- <environment id="development2">--> <!-- <transactionManager type="JDBC"></transactionManager>--> <!-- <dataSource type="POOLED">--> <!-- <property name="driver" value="驱动字符串"/>--> <!-- <property name="url" value="连接字符串"/>--> <!-- <property name="username" value="账号"/>--> <!-- <property name="password" value="密码"/>--> <!-- </dataSource>--> <!-- </environment>--> </environments> <!-- 5.mapper映射配置--> <mappers> <!--此处数据是配置mapper层的映射xml文件--> <mapper resource="com/mapper/UserMapper.xml"/> </mappers> </configuration>
mysql.properties配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/shopping_website?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true jdbc.user=root jdbc.password=root
配置log4j.properties配置日志文件
配置日志信息是为了方便查看sql语句的信息,默认控制台是不会输出sql语句以及传入的参数的,配置了logoj就可以输出
# rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用 # 下面的属性配置中,所有日志的输出级别是debug,输出源是con log4j.rootLogger=debug,con # 定义输出源的输出位置是控制台 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}[%p]%c%n -%m%n ## rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用 ## 下面的属性配置中,所有日志的输出级别是info,输出源是con #log4j.rootLogger=info,con ## 定义输出源的输出位置是控制台的类 #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}[%p]%c%n -%m%n
创建数据库实体类
//步骤3、创建实体类-POJO package com.pojo; /** * 角色类 */ public class User { private long id; //用户id private String name; //用户名 private String img; //用户头像 private String pwd; //密码 private String phone; private long usertype; private long sex; private long state; private long credit; //省略getter/setter... }
编写mapper层
//步骤4、Mapper层 (原dao) 接口 package com.mapper; import com.pojo.User; import java.util.List; /** * 用户类Mapper层 */ public interface UserMapper { /** * 获取所有用户 * * @return */ public List<User> getUserAll(); }
配置mapper层的映射xml文件
xml位置放在mapper层即可<!--步骤4、创建与接口对应的-SQL映射文件(SysRoleMapper.xml)--> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mapper的namespace用于指定mapper层的映射 必须保证全局唯一 --> <mapper namespace="com.mapper.UserMapper"> <!--select标签用于查询,id用于指定mapper接口中的方法--> <!--resultType用于指定返回值,由于返回值是list所以指定--> <!--list中的泛型类型即可--> <select id="getUserAll" resultType="com.pojo.User"> select * from `user` </select> </mapper>
4.使用Mybatis查询数据库内容
创建测试类
package com.mapper; import com.pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; import static org.junit.Assert.*; /** * @version 1.0 * @Description * @Author luyo * @date 2022-05-18 */ public class UserMapperTest { @Test public void getUserAll() { //Mybatis核心配置文件 SqlSession sqlSession = null; String resource = "mybatis-config.xml"; try { //1.读取MyBatis框架的核心配置文件 InputStream is = Resources.getResourceAsStream(resource); //2.使用sqlSessionFactoryBuilder读取配置文件并构建SqlSessionFactory实例 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //3.创建SqlSessionFactory构建SqlSession实例 // 可以在构建的方法其中 写入boolean参数 // true代表关闭事务(直接提交增删改操作),false代表开启事务(需要手动提交事务) //开启事务后 增删改操作需要提交才生效,这里只做查询 sqlSession = sqlSessionFactory.openSession(false); //4.创建UserMapper接口实例,调用其方法执行相关的SQL语句 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //获取接口后直接调用方法获取用户信息列表 List<User> userList = userMapper.getUserAll(); System.out.println("_________________________"); userList.forEach(v -> { System.out.println(v.getName()); System.out.println(v.getPwd()); System.out.println("_________________________"); }); } catch (IOException exception) { exception.printStackTrace(); } finally { //用完sqlSession后记得关闭 if (sqlSession != null) { sqlSession.close(); } } } }
运行后效果:
相信看到这里一定会有一个疑惑,查询的结果是怎么自动映射到对象上的呢?
其实是mybatis自动映射的一个机制,后续也可以手动映射
而映射的机制是对应着javabean中的set\get方法。
如果你不给你的对象写set方法则映射数据失败,set名字有误也会自动映射数据失败,
如果需要映射对象元素或者集合元素无法自动映射,需要手动映射,后续会讲
此外可能会出现两个bug
1.找不到mapper的映射xml文件
原因:maven项目构建不会自动识别java源文件中的xml等配置文件
所以需要在pom.xml中添加配置让maven去识别java源文件中的xml配置文件
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
2.maven项目可能会出错:找不到包,报错xx包不存在
解决方案:将idea构建托给maven
需要注意的是勾选这项后 lib中的jar包无效 只有maven依赖jar包有效
这样就不会出错了
如果还出错 ,请看看你的maven项目是不是命名为中文了,请改为英文
5.编写构建SqlSessionFactory构建工具类
由于构建SqlSession步骤太多 每次使用都需要构建,所以我们可以将这个SqlSession构建的过程封装起来
在工具类中给予一个获取SqlSession和关闭SqlSession的方法即可
package com.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; /** * MyBatis工具类 */ public class MyBatisUtil { //SqlSession的工广对象 private static SqlSessionFactory factory = null; static { String resource = "mybatis-config.xml"; InputStream is = null; try { is = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException exception) { exception.printStackTrace(); throw new RuntimeException("初始化失败," + exception); } } /** * 返回SqlSession开启事物 * * @return SqlSession */ public static SqlSession createSqlSession() { // false:开启事务控制 true(默认):自动提交 return factory.openSession(false); } /** * 关闭SqlSession * * @param sqlSession */ public static void closeSqlSession(SqlSession sqlSession) { if (sqlSession != null) { sqlSession.close(); } } }
使用方式
@Test public void getUserAllTwo() { //获取sqlSession SqlSession sqlSession = MyBatisUtil.createSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = userMapper.getUserAll(); System.out.println("_________________________"); userList.forEach(v -> { System.out.println(v.getName()); System.out.println(v.getPwd()); System.out.println("_________________________"); }); //关闭sqlSession MyBatisUtil.closeSqlSession(sqlSession); }
6.MyBatis框架优缺点
优点
与JDBC相比,减少了50%以上的代码量
最简单的持久化框架,小巧并简单易学
SQL代码从程序代码中彻底分离,可重用
提供XML标签,支持编写动态SQL
提供映射标签,支持对象与数据库的ORM字段映射
缺点
SQL语句编写工作量大,对开发人员有一定要求
数据库移植性差
7.MyBatis核心配置文件
1.mybatis-config.xml 系统核心配置文件
mybatis-config.xml 系统核心配置文件
顺序 标签元素 作用 1 properties 可以配置在Java 属性配置文件中 2 settings 修改 MyBatis 在运行时的行为方式 3 typeAliases 为 Java 类型命名一个别名(简称) 4 typeHandlers 类型处理器 5 objectFactory 对象工厂 6 plugins 插件 7 environments 环境 8 environment 环境变量 9 transactionManager 事务管理器 10 dataSource 数据源 11 mappers 映射器
2.settings元素
用来修改MyBatis运行时的行为方式
主要是MyBatis的一些全局配置属性的设置
设置项 描述 允许值 默认值 cacheEnabled 对在此配置文件下的所有cache 进行全局性开/关设置 true|false true lazyLoadingEnabled 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 true|false true autoMappingBehavior MyBatis对于resultMap自动映射匹配级别 NONE PARTIAL FULL PARTIAL LogImpl 指定MyBatis框架应使用的日志记录实现,如果不指定测将自动发现日志记录并实现 SLF4J|LOG4J|LOG4J2等参数 无