MyBatis学习
MyBatis简介
ORM概念(Object Relational Mapping):
对象映射关系,是指对象与数据库之间的映射的元数据
MyBatis是一个ORM的实现框架,是一个数据持久层框架,它支持定制化 SQL、存储过程以及高级映射
配置MyBatis
下载jar mybatis.jar,driver
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=""/>
<!--全局配置-->
<settings></settings>
<!--类别名-->
<typeAliases></typeAliases>
<!--类型转换器-->
<typeHandlers></typeHandlers>
<!--通过environments的default值和environment的id指定运行环境-->
<environments default="">
<environment id="">
<!--事务管理器,type事务的提交方式-->
<transactionManager type="JDBC"/>
<!--数据源,使用连接池方式-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
</dataSource>
</environment>
</environments>
<!--mapper.xml配置路径-->
<mappers></mappers>
</configuration>
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>
使用MyBatis
public class MyFirstMyBatisApp{
public static void main(String[] args){
//通过SqlSessionFactoryBuilder获取sqlSessionFactory(先获取工厂,然后从工厂中获取SqlSession)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build("config.xml");
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行statement产生的结果集由ResultSetHandler来处理映射
sqlSession.select(String statement,ResultSetHandler);
//使用动态代理方式
Mapper mapper = sqlSession.getMapper(Mapper.class);
mapper.xxx();
}
}
MyBatis的sql标签以及参数,返回值
<!--结果集映射,Java属性名与表字段名不匹配时,可以使用-->
<resultMap id=""></resultMap>
<select parameterType="传入参数类型" resultType="返回值类型">
</select>
<insert></insert>
<update></update>
<delete></delete>
类型转换器
MyBatis自带一些类型转换器
自定义类型转换器:
需要实现TypeHandler接口
通过里面的方法实现转换
<typeHandlers>
<typeHandler handler="转换器地址" javaType="要转换的Java类型" jdbcType="数据库类型"/>
</typeHandlers>
MyBatis动态SQL
<if test="条件,满足则拼接下面的sql语句">
id=#{id}
</if>
<where> <!--可以去掉多余的and-->
<if test="条件">
</if>
</where>
<trim prefix="前缀" suffixOverrides="后缀"><!--可以去掉多余的and,根据suffixOverrides和prefix来判断and是前缀还是后缀-->
<if test="条件"></if>
</trim>
<set><!--代替sql中的set,可以去掉多余逗号(,)-->
<if test=""></if>
</set>
<foreach collection="类型(array,list)" item="变量名" open="开始符号" close="结束符号" separator="分隔符">
<!--参数是数组或集合类型可以用foreach标签遍历-->
#{变量名}
</foreach>
<!--将重复的sql提取出来-->
<sql></sql>
MyBatis 一对一,一对多
<resultMap id="">
<association>
...一对一
</assiciation>
...使用collection实现一对多
<collection property="属性名" select="查询" column="列名"></collection>
</resultMap>
MyBatis延迟加载
延迟加载:先从单表中查询,需要时才从关联的表中查询,提高数据库性能
在config.xml中配置:
<settings>
<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--关闭立即加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
MyBatis缓存
一级缓存:MyBatis默认开启一级缓存
如果是同一个SqlSession,则在第二次做相同的查询时会在缓存中找(只执行一次sql)
二级缓存:MyBatis自带二级缓存,二级缓存是指同一个namespace生成的mappre对象(默认关闭二级缓存)
开启二级缓存:
<!--config.xml配置-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!--mapper.xml配置
声明开启二级缓存:-->
<cache/>
<!--禁用二级缓存
设置某一个查询的 useCache="false"(默认为true)
清理缓存
与一级缓存清理方法相同(增删改时会清理缓存)
设置flushCache="true"
-->
<!--
第三方提供的二级缓存(ehcache,memcache)
mapper.xml中配置实现了cache接口的类
-->
<cache type="实现了cache接口的类"></cache>