Mybatis
持续更新
一、mybatis简介
mybatis是一款持久层框架,它简化了JDBC的代码,使开发人员对关系数据库的使用更为简化。
mybatis解决了jdbc所存在的问题:
频繁的链接好惹释放数据库造成的内存资源的浪费
SQL语句与代码的高耦合
传值传参步骤繁琐
结果解析麻烦
二、mybatis配置
创建mybatis前需知的工作
mybatis导入有两种,一种是在Javaweb项目下导入依赖包,另外一种是使用maven导入包
- 在Javaweb项目的lib目录下导入Mybatis包与数据库连接包以及log4的相关包之后,在src下导入数据库配置文件、log4j配置文件、mybatis配置文件。其中mapper文件与dao文件同名且同在一个目录文件下。
- 在Maven项目里,先在pom.xml文件中导入依赖,其中配置文件与mapper文件需要放在resources目录下,而且mapper文件在resources目录下的包路径需要与其对应的dao包路径一致。如下图目录
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> </dependencies>
mybatis config配置文件:
首先给配置文件加上config约束
<?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" >
然后插入标签,在这个标签中填写mybatis的配置内容。配置内容如下:
<configuration> <!-- 引入 database.properties 文件--> <properties resource="database.properties"/> <!-- 配置mybatis的log实现为LOG4J --> <settings> <setting name="logImpl" value="LOG4J" /> <!--配置 自动映射 FULL 全部自动映射--> <setting name="autoMappingBehavior" value="FULL"/> <!--打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true"/> <!--将积极加载改为消极加载及按需加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings> <!--配置别名--> <typeAliases> <!--给 Teacher 配置了一个别名 叫 cc --> <!-- <typeAlias type="com.xmx.pojo.Teacher" alias="cc"/> --> <!-- 扫描包的形式 起的别名 类名首字母 小写--> <package name="com.xmx.pojo"/> </typeAliases> <!--配置多个环境--> <environments default="ceshi"> <environment id="ceshi"> <!--配置事务管理,采用JDBC的事务管理 --> <transactionManager type="JDBC"></transactionManager> <!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 --> <!-- 这里的${}中的内容在properties文件中配置了,就没有在其中写详细的内容--> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--申明数据库厂商--> <databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> <property name="MySQL" value="mysql" /> </databaseIdProvider> <!-- 将mapper文件加入到配置文件中 --> <mappers> <!--<mapper resource="com/xmx/dao/StudentDao.xml"/> <!--用扫描包的形式 引入 映射文件--> <!--导入包时用'.',导入文件使用/--> <package name="com.xmx.dao"/> <!--使用sql注解时,需要用class来指定对应的dao接口--> <!-- <mapper class="com.xmx.dao.StudentDao"/> --> </mappers> </configuration>
若需要更为详细的配置内容,可以到官网 https://mybatis.org/mybatis-3/zh/index.html进行查阅。
mybaits mapper配置
创建 ***.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">
之后就能在其中运用一些标签,来进行sql的实现(不会描述了),这些标签的详细参考mybatis的使用。
三、mybatis使用
3.1利用注解的方式使用mybatis
新建一个dao接口,在接口中使用注解,例如:
public interface StudentMapper { //在注解中注入sql语句 @Select("select count(*) from student") int count(); }
在mybatis配置文件中的注解中导入的mapper资源得为class
<!--使用sql注解时,需要用class来指定对应的dao接口--> <mapper class="com.xmx.dao.StudentMapper"/>
3.2利用 xml文件的方式使用mybatis
以maven项目为例,新建一个dao接口类,与dao接口类名字相同xml文件。
在dao接口中编写以下方法
public interface StudentDao { /** * 查找全部的信息 * @return查找到的学生集合 */ List<Student> findAll(); }
之后在xml文件中添加如下语句,其中select标签类似标签的id需要与dao接口中的方法名一致。
<!--这个namespace为xml文件对应的dao接口--> <mapper namespace="com.xmmx.dao.StudentDao"> <select id="findAll" resultType="student"> select * from student </select> </mapper>
其中可能会遇到数据需要序列化的问题,解决方法为让实体类继承Serializable。如:
public class Student implements Serializable { /******内容省略了*******/ }
四、Mybatis缓存
4.1、一级缓存
4.2、二级缓存
4.3、mybaits缓存失效
开启二级缓存后,如果nameSpace不同时,进行多表查询后再查询会出现读取的数据为脏数据的情况。为了避免这样的情况的发生,需要加入与主表相同的namespace,以cache-ref标签插入