MyBatis核心组件
ORM和MyBatis
ORM即Object Relational Mapping(对象---关系映射)的简称。
项目中的业务实体有两种表现形式:对象和关系数据,即在内存中表现为对象,在数据库中表现为关系数据。
ORM框架一般以中间件的形式存在,如下图
从系统结构上看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全面向对象的做法,而面向对象的做法也会对性能产生一定的影响,因此产生一个半自动化的ORM框架MyBatis应运而生。
MyBatis是一个Java持久层框架,它封装少、高性能、可优化、维护简单等优点成为了目前Java移动互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程。其半自动是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibermate只需要提供POJO和映射关系即可。
MyBatis的基本构成
MyBatis核心组件包括四部分:
- SqlSessionFactoryBuilder(构造器)
- SqlSessionFactory(工厂接口)
- SqlSession(会话)
- SQL Mapper(映射器)
MyBatis核心组件之间的关系图如下 :
SqlSessionFactoryBuilder组件
作用:依据配置信息或者代码生成SqlSessionFactory
SqlSessionFactory组件
作用:用于生产SqlSession会话
SqlSession是MyBatis的核心接口,主要进行持久化操作。在MyBatis中有两个实现类DefaultSqlSession和SqlSessionManager,前者单线程使用后者多线程使用。作用类似于JDBC中的Connection对象,代表着一个连接资源的启用。
作用:获取Mapper接口;发送SQL给数据库;控制数据库事务;
MyBatis核心配置
<?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="jdbc.properties"/>
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<typeAliases>
<package name="com.zhan.bean"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="pooled">
<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>
</environments>
<mappers>
<mapper class="com.zhan.dao.UserDao"/>
</mappers>
</configuration>
<configuration>:配置
<properties>:配置属性集:加载了配置文件,下面就需要读取配置文件key对应的value
<settings>:项目的配置信息
<typeAliases>:加载com.zhan.bean包中所有的类,给类-默认起别名为类的名字但首字母小写
<environments>:配置(MyBatis运行环境)环境信息——就是配置连接数据库的参数;
default:指定配置的环境信息的id,表示默认连接该环境
<transactionManager> :配置事务的处理方式:模式使用JDBC的事务处理
<dataSource>:数据源的默认type设置为pooled,表示使用连接池
映射器
1.使用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="com.zhan.dao.UserDao">
<select id="selectAll" resultType="user">
select * from t_user
</select>
<select id="selectById" parameterType="int" resultType="user">
select * from t_user where uid = #{uid}
</select>
</mapper>
<mapper>元素中的属性:namespace是映射的dao接口;把配置文件和接口进行映射
映射器的配置元素:
select元素:映射查询语句
<select id="selectAll" resultType="user">
select * from t_user
</select>
update元素:映射更新语句
<update id="update" parameterType="com.zhan.bean.User">
update t_user set username= #{username},password= #{password},phone= #{phone},address=#{address} where uid = #{uid};
</update>
delete元素:映射删除语句
<delete id="delete" parameterType="int">
delete from t_user where uid= #{uid};
</delete>
insert元素:映射插入语句
<insert id="add" parameterType="com.zhan.bean.User">
insert into t_user(username,password,phone,address)values(#{username},#{password},#{phone},#{address});
</insert>
id:映射接口的方法名;
parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可);
resultType:指定返回值的类型;
2.使用注解实现映射器
使用注解方式定义映射器就比较简单了,只需要定义一个映射器接口即可,然后通过注解的方式来注入 SQL。
注解是解释程序,给JVM编译器看的;注释是用来解释代码,给程序员看的;
使用注解方式实现映射器,在处理一些比较简单的 SOL 语句时,使用起来非常简洁。
但是实际工作中 SQL 语句会比我们这里的举例复杂得多,而使用 XML 方式能更好地处理相对复杂的 SQL 结构,同时 MyBatis 官方推荐使用的也是 XML 方式。另外需要要注意的是同一个映射器接口方法上不能同时使用 XML 方式和注解方式实现映射器。
package com.zhan.dao;
import com.zhan.bean.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface UserDao {
//查询所有用户信息
@Select("select * from t_user")
List<User> selectAll();
//新增
@Insert("insert into t_user(username,password,phone,address)values(#{username},#{password},#{phone},#{address})")
int add(User user);
//删除
@Delete("delete from t_user where uid = #{uid}")
int delete(int uid);
//修改
@Update("update t_user set username= #{username},password= #{password},phone= #{phone},address=#{address} where uid = #{uid}")
int update(User user);
//单查
@Select("select * from t_user where uid = #{uid}")
User selectById(int uid);
//模糊查询
@Select("select * from t_user where username like concat ('%',#{uname},'%')")
List<User> seach(String uname);
}
动态SQL
<select id="seach" parameterType="user" resultType="user">
select * from t_user
<where>
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="address != null and address != ''">
and address like concat('%',#{address},'%')
</if>
</where>
</select>
<if>标签
test的属性值是一个符合OGNL要求的判断表达式,表达式的结果为true或false,除此之外所有的非0值都为true,只有0为false。
<where>标签
当where标签里面的条件成立时,才会加入where关键字组装到SQL里面且会将紧跟where后面的第一个and自动去掉,否则就不会加入。
<update id="update" parameterType="user">
update t_user
<set>
<if test="username != null and username != ''">
username=#{username},
</if>
<if test="password != null and password != ''">
password=#{password},
</if>
<if test="phone != null and phone != ''">
phone =#{phone},
</if>
<if test="address != null and address != ''">
address=#{address},
</if>
</set>
where uid = #{uid}
</update>
<set>标签
作用:如果该标签包含的元素中有返回值,就插入一个set,如果set的字符串是以逗号结尾的,就将这个逗号删除。
<delete id="del" parameterType="delVO">
delete from t_user where uid in
<foreach item="id" collection="ids" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
<foreach>标签:可以对一个集合变量进行迭代 ——常用于批量删除
item:临时变量
collection:集合变量
open:以什么符号开始
close:以什么符号结束
separator:遍历出来的数据之间的分隔符
#{uid} 放入标签中,实现了迭代元素并拼接上了字符
缓存配置
使用缓存在一定程度上可以大大提高数据的读目取性能,尤其是对于查询量大和使用频繁的数据,其缓存命中率越高,越能体现出使用缓存的作用。MyBatis 作为持久层框架,也提供了使用缓存的功能。
MyBatis中缓存分为一级缓存和二级缓存,默人情况下一级缓存是开启的,而且是不能关闭的。因此我们常说的MyBatis 缓存,都是指二级缓存。