MyBatis 是一款优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及手动获取结果集的操作。
MyBatis 可以使用 XML 或注解来配置和映射,将数据库中的记录映射成 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象),是一种 ORM(ORM )Object Relational Mapping 对象关系映射)实现.
它支持动态 SQL 以及数据缓存.
Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可.
Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html
1.添加依赖:mybatis,mysql等
<!-- mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
2.创建数据库对应实体类
3.创建mybatis全局配置文件 (mybatis-config.xml)
具体配置要求请查看官网官网
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/数据库名"/>
<property name="username" value="数据库账号"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper文件所在地址"/>
</mappers>
</configuration>
也可以创建外部配置文件(.properties),避免重复修改,该文件以键值对形式存储
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssmdb
userName=root
pwd=123456
然后在mybatis核心配置文件中引用该文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="config.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${userName}"/>
<property name="password" value="${pwd}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/AdminMapper.xml"/>
</mappers>
</configuration>
4.定义接口
在接口中定义方法,接口方法不可以重载
5.创建sql映射文件***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">
<mapper namespace="mapper接口全类名">
<select id="接口中对应方法名" parameterType="参数类型" resultType="返回类型全类名">
sql语句
</select>
</mapper>
6.测试mybatis
//读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//创建 SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建 SqlSession
SqlSession sqlSession = sessionFactory.openSession();
//获得接口代理对象
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
Admin admin=adminDao.getAdminById(1);
sqlSession.commit();
sqlSession.close();
$和#的区别
${}:采用字符串拼接传值,主要用于动态地向sql中传递列名
#{}:传值时采用预编译方式,主要用于向sql中传值使用
参数传递
单个基本类型不需要做任何处理,
多个需要使用 (@Param "id")绑定
也可以使用paramerMap
字符串类型单独传递时,也需要进行绑定
数据库事务
JDBC默认事务自动提交
MyBatis关闭了事务的自动提交:sqlSession.commit()
MyBatis默认会将查询结果封装到对象中去
自动封装有前提条件
(1)开启了全局的自动结果映射 默认PATHFUL即单张表开启
(2)数据库列名与实体类属性名一致,如果不一致可以使用别名
可以开启驼峰命名映射
<setting name="mapUnderscoreToCamelCase" value="true"/>
即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn
数据库字段名和对应实体类的属性名不一致时
1.起别名
2.resultMap
<resultMap id="userResultMap" type="User">
<id column="id" property="id_"/>
<result property="userName" column="user_Name_" />
<result property="userAge" column="user_age" />
</resultMap>
(1)resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“useresultMap”
(2)resutlMap 的 id 属性是映射的实体类
(3)id 标签映射主键,result 标签映射非主键
(4)property设置实体类的属性名称,column 映射查询结果(不是数据库)的列名称
动态sql
<where>
<if test>
特殊字符
(1)使用转义字符
特殊字符 转义字符
< <
> >
" "
’ '
& &
(2)使用<![CDATA[]]>来包裹特殊字符
缓存
由于mysql数据存储在硬盘上,访问量(I/O)过大可能会导致数据库崩溃,
因此可以将一些经常被访问的数据放在内存中,以此来提高查询效率。
MyBatis有一级和二级缓存,一级缓存是在同一个sqlSession中,如果有多次相同的查询,只执行一次sql,缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中,
当再次需要获取该对象时,直接从内存(缓存)中直接获取,MyBatis默认开启一级缓存。
一级缓存消失的情况:
sqlSession.clearCache();
sqlSession.close();
中间执行了新增,修改,删除操作
二级缓存作用域是同一个namespace中,是SqlSessionFactory级别的
只要SqlSessionFactory未销毁,通过该SqlSessionFactory创建的不同SqlSession即使销毁,
只要有相同的操作,可以直接从内存中获取。
二级缓存消失的情况:
中间执行了新增,修改,删除操作
配置二级缓存
第一步:启用二级缓存
在 SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当 cacheEnabled 设置为 true 时启用二级缓存,设置为 false 时禁用二级缓存。
<setting name="cacheEnabled" value="true"/>
第二步:对象序列化
将所有的 POJO 类实现序列化接口 Java.io. Serializable。