2022年6月23
一. mybatis 的入门
-
外部文件的引入(路径在resource下)db.properties
mysql.driver=com.mysql.cj.jdbc.Driver mysql.url=jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=UTC&useSSL=fals e mysql.username=root mysql.password=password
-
mybatis-config.xml ——路径(resource)
<?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> <properties resource="db.properties" /> <!-- 外部文件的引入 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 路径要对,引入你要操作的数据库 xml 文件,就是映射sql文件--> <mappers> <mapper resource="mapper/UsersMapper.xml"></mapper> </mappers> </configuration>
-
UserMapper.xml ——(resource/mapper)
<?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="com.hcxy.pojo.Users"> <!-- 一般为数据表在持久层对应接口的完整路径 --> <select id="findById" resultType="com.hcxy.pojo.Users"> select * from users where uid = #{id} </select> </mapper>
-
User.java
package com.hcxy.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data //生成getter,setter等函数 @AllArgsConstructor //生成全参数构造函数 @NoArgsConstructor //生成无参构造函数 public class Users { private int uid; private String uname; private int uage; }
-
Text.java
public class UserTest { public static void main(String[] args) throws IOException { //获取配置文件 String path = "mybatis-config.xml"; Reader resourceAsReader = Resources.getResourceAsReader(path); // 创建工厂对象SqlSessionFactory SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader); //创建SqlSession对象,有各种对数据库的操作 SqlSession session = build.openSession(); // 唯一标识:namespace statementID Users users = session.selectOne("com.hcxy.pojo.Users.findById",1); // log.debug(users); System.out.println("users = " + users); session.close(); } }
mybatis 工作原理
MyBatis框架在操作数据库时,大体经过了8个步骤。下面结合MyBatis工作原理图对每一步流程进行
详细讲解,具体如下。
- MyBatis读取核心配置文件mybatis-config.xml:mybatis-config.xml核心配置文件主要配置了
MyBatis的运行环境等信息。 - 加载映射文件Mapper.xml:Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语
句,需要在mybatis-config.xml中加载才能执行。 - 构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory,用于创建
SqlSession。 4. 创建会话对象:由会话工厂SqlSessionFactory创建SqlSession对象,该对象中包含了执行SQL语句
的所有方法。 - 创建执行器:会话对象本身不能直接操作数据库,MyBatis底层定义了一个Executor接口用于操作
数据库,执行器会根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存
地维护。 - 封装SQL信息:SqlSession内部通过执行器Executor操作数据库,执行器将待处理的SQL信息封装
到MappedStatement对象中。 - 操作数据库:根据动态生成的SQL操作数据库。
- 输出结果映射:执行SQL语句之后,通过MappedStatement对象将输出结果映射至Java对象中。
mybatis 核心配置
-
setting
<!--解决数据库命名user_name 与 java的驼峰命名--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
-
typeAliases
全限定类设置别名的方式: 方式一:在<typeAliases>元素下,使用多个<typeAlias>元素为每一个全限定类逐个配置别名。 <typeAlias alias="User" type="com.hcxy.pojo.User"/> 方式二(推荐):通过自动扫描包的形式自定义别名 ,默认实体的类型就是别名也就是在对Sql映射的时候直接可以写实体类的名称,但是namespace 属性还是写实体类的包名路径比较好 <package name="com.hcxy.pojo"/>
除了可以使用
<typeAliases>
元素为实体类自定义别名外,MyBatis框架还为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的默认别名。
例如别名byte映射类型byte、long映射类型long等,别名可以在MyBatis中直接使用,但由于别名不区 分大小写,所以在使用时要注意重复定义的覆盖问题 -
environments
MyBatis可以配置多套运行环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配
置,从而将SQL映射到不同运行环境的数据库中。不同的运行环境可以通过<environments>
元素配 置,但不管增加几套运行环境,都必须要明确选择出当前要用的唯一的一个运行环境。
-
配置使用数据库环境,通过mabatis-config.xml 中修改 default
<!-- 配置数据库环境 default 指定使用那一套环境,这里有两套环境 development 和 text --> <environments default="development"> <!-- default 采用默认的配置环境与下面的 id 一致就用谁--> <environment id="development"> <!-- 配置单个的数据环境,id 当前数据库环境的唯一标识--> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <!--value可以用${}表达式获取properties中的值--> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="mysql.userpassword"/> </dataSource> </environment> <environment id="text"> <!-- 配置单个的数据环境,id 当前数据库环境的唯一标识--> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="123456"/> <!-- 建议不使用直接写密码--> </dataSource> </environment> </environments>
-
修改创建工厂对象SqlSessionFactory
//获取配置文件 String path = "mybatis-config.xml"; Reader resourceAsReader = Resources.getResourceAsReader(path); // 创建工厂对象SqlSessionFactory SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader,"text"); // 这里指定,xml中的指定则无效
-
mappers
在MyBatis的核心配置文件中,<mappers>
元素用于引入MyBatis映射文件。映射文件包含了POJO对象和数据表之间的映射信息,MyBatis通过核心配置文件中的<mappers>
元素找到映射文件并解析其中的映射信息。通过<mappers>
元素引入映射文件的方法有4种。<mappers> <!--第一种配置方式:相对路径/Mapper.xml--> <!--<mapper resource="com/hcxy/mapper/UsersMapper.xml"></mapper>--> <!--第二种配置方式:绝对路径/Mapper.xml--> <!--<mapper url="D:\IDEA\..."></mapper>--> <!--第三种配置方式:接口的全限定类名,需要将xml文件放入和接口同名文件夹下--> <!--<mapper class="com.hcxy.mapper.UsersMapper"></mapper>--> <!--第四种配置方式(推荐):指定到接口与xml映射文件的公共包名下--> <package name="com.hcxy.mapper"/> </mappers>
mybatis接口式开发
接口式开发:
1.方法的名称需要保证和映射文件中的sqL语句的statmentId一致, 这里的两个方法名称findByID(), findTotal()与 UsersMapper.xml 中的 id 名称一致
2.namespace的值必须是接口的全路径
- com.hcxy.mapper
public interface UserMapper { public Users findByID(int id); public Integer findTotal(); } //快速生成测试类:Ctrl + shift + T
- UserMapperTest.java
/** * * 接口式开发: * 1.方法的名称需要保证和映射文件中的sqL语句的statmentId一致, 这里的两个方法名称findByID(),findTotal(),就会知道去寻找了。 * 与 UsersMapper.xml 中的 <select id="findById" resultType="users"> id 名称一致 * 2.namespace的值必须是接口的全路径 */ public class UserMapperTest { UserMapper userMapper = null; SqlSession session = null; // 初始化操作 @Before public void setUp() throws Exception{ String path = "mybatis-config.xml"; Reader resourceAsReader = Resources.getResourceAsReader(path); // 创建工厂对象SqlSessionFactory SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader); //创建SqlSession对象,有各种对数据库的操作 session = build.openSession(); // 通过动态接口动态代理对象来实现 // 执行是要找那一条SQL语句来执行,sql 的唯一标识 是通过namespace + statementID 来识别的 userMapper = session.getMapper(UserMapper.class); } @Test public void findByID() { Users users = userMapper.findByID(1); System.out.println("users = " + users); session.close(); } @Test public void findTotal() { Integer integer = userMapper.findTotal(); System.out.println("integer = " + integer); session.close(); } }
- UserMapper.xml
<!-- 接口式开发: 1.方法的名称需要保证和映射文件中的sqL语句的statmentId一致 2.namespace的值必须是接口的全路径 --> <mapper namespace="com.hcxy.mapper.UserMapper"> <!--这个路径一定要写对了,接口的路径 --> <select id="findById" resultType="users"> select * from users where uid = #{id} </select> <select id="findTotal" resultType="int"> select count(*) from users </select> </mapper>
- mybatis-config.xml
<?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> <properties resource="db.properties" /> <!-- 外部文件的引入 --> <!--解决数据库命名user_name 与 java的驼峰命名--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!--引入了User.java的路径,就是别名,之后映射文件中就可以直接写实体类的名称--> <typeAliases> <package name="com.hcxy.pojo"/> </typeAliases> <!-- 配置数据库环境 default 指定使用那一套环境 --> <environments default="development"> <!-- default 采用默认的配置环境与下面的 id 一致就用谁--> <environment id="development"> <!-- 配置单个的数据环境,id 当前数据库环境的唯一标识--> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 路径要对,引入你要操作的数据库 xml 文件,就是映射sql文件--> <mappers> <!-- <mapper resource="mapper/UsersMapper1.xml"></mapper>--> <mapper resource="mapper/UsersMapper.xml"></mapper> </mappers> </configuration>
两种的区别,与入门的
- 接口开发中,mybatis-config.xml,是这种去找实体类路径
<typeAliases>
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!--引入了User.java的路径--> <typeAliases> <package name="com.hcxy.pojo"/> </typeAliases>
- 在UserMapper.xml 中,namespace 的属性也不同
<mapper namespace="com.hcxy.mapper.UserMapper">
这个是写接口的路径,<select id="findById" resultType="users">
,resultType 直接写 实体类的名称,不区分大小写。
- 接口开发中,mybatis-config.xml,是这种去找实体类路径
- 公司最常用的是接口的方式:java 文件下的com.hcxy.mapper 与 resource 文件下要与 java 路径一样,却java 与xml的类名也要一致,采用包的形式映射。eg: UserMapper.java , UserMapper.xml
<mappers> <!-- <mapper resource="mapper/UsersMapper1.xml"></mapper>--> <!-- <mapper resource="mapper/UserMapper.xml"></mapper>--> <package name="com.hcxy.mapper"/> </mappers> <!--采用包的时候,UserMapper.xml 中的namespace 要是接口类的路径,如下 <mapper namespace="com.hcxy.mapper.UserMapper"> -->
mabaits ---- insert,update,delete,select
- 写接口
- 在映射文件xml中写SQL语句,主语 id 与 接口的实现方法一致; 使用别名方便;
- 写实现接口