MyBatis搭建过程
导入jar包
mybatis-x.x.x.jar //mybatis-3.4.1.jarlog4j.jar //要有log4j的配置文件,例:log4j.xml 或 log4j.properties//名字一定得是log4jmysql-connector-java-5.1.7-bin.jar
创建mybatis的全局配置文件并配置 ```java <?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">
3. 创建映射文件并配置```java<?xml version="1.0" encoding="UTF-8" ?> //必须是第一行<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="">// #{} ${}<select id="" resultType="" >select * from Blog where id=#{id}</select></mapper>
- 创建mapper接口,实现两个绑定 ```java <?xml version=”1.0” encoding=”UTF-8” ?> //必须是第一行 <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd">
//namespace 是对应接口文件的全类名
5. 获取mybatis操作数据库的会话对象sqlsessionjava
public class TestMyBatis {
@Test
public void test(){
//1
InputStream is = Resource.getResourceAsStream(“mybatis.xml”);
//2
SqlSessionFactory sqlSesssionFactory =
new SqlSessionFactoryBuilder().build(is);
//3 openSession有个boolean类型的参数,true表示自动提交事务,默认false
SqlSession sqlSession = sqlSessionFactory.openSession();
//4
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//5
User user = userMapper.getUserById(“1”);
System.out.println(user);
}
}
6. 测试
<a name="sf0Dg"></a>
# enviroments,properties,settings,typeAliases(mybatis.xml)java
<a name="Sdj2A"></a>
# 在mapper.xml中实现简单CRUDjava
<?xml version=”1.0” encoding=”UTF-8” ?> //必须是第一行
<!DOCTYPE configuration
PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”
“http://mybatis.org/dtd/mybatis-3-mapper.dtd">
//namespace 是对应接口文件的全类名
<a name="TLN7V"></a>
# mybatis.xml通过package引入maaper.xml映射文件
<a name="xdR7D"></a>
## 使用 package 引入映射文件需要映射文件和对应的接口文件在同一个包下java
<?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">
<a name="HiQ0T"></a>
# 查询返回键值对集合(Map)
xml配置:java
代码:java
@MapKey(“eid”) //设置map的键
Map<a name="EHwN5"></a>
# 添加时获取自动生成的主键java
//keyProperty:会将自动生成的主键放入设置的eid中
//void insertEmp(Emp emp); useGeneratedKey默认是true
<a name="IiaAf"></a>
# #{ } 和 ${ }的对比
1. 当入参为单个String类型或其他基本类型时
#{ } 可以使用任何名字获取参数<br />${ } 只能用 ${ value } 或 ${ _parameter }
2. 当入参为JavaBean时
#{ } 和 ${ } 都可以通过属性名获取属性值,但要注意单引号问题
3. 当入参有多个时,mybatis会默认将这些参数放入map集合中
使用#{ }:#{0},#{1},#{n} 或者 #{param1},#{param2},#{paramN}<br />使用${ }:#{param1},#{param2},#{paramN} @注意单引号问题
4. 当入参为Map类型时
#{ } 和 ${ } 都可以通过键的名字获取属性值,但要注意单引号问题
注:当传入参数为List 或 Array时,mybatis会将其放在map中,键分别为list 和 array。
<a name="2Q8lu"></a>
# @Param(定义参数在map中的键)java
通过 @Param(“名称”) 为map集合指定键的名字
public Emp getEmp(@Param(“eid”) String eid, @Param(“ename”) String ename);
<a name="SyN5D"></a>
# 多对一(resultMap的使用)java
//emp 和 dept两张表
/
两种类型:Emp, Dept
Emp 属性: eid, ename, age, sex, dept
Dept 属性: did, dname
/
<a name="JcYBJ"></a>
## 使用association标签java
//第二种写法
<a name="o3oGl"></a>
## 分步查询java
//emp 和 dept两张表
/
两种类型:Emp, Dept
Emp 属性: eid, ename, age, sex, dept
Dept 属性: did, dname
/
——————————-另一个mapper
<a name="k2Ouz"></a># 延迟加载在以上分步查询的基础上再在mybatis.xml中添加一下配置```java<settings><setting name="lazyLoadingEnabled" value="true" /><setting name="aggressiveLazyLoading" value="false" /></settings>
fetchType(设定单个是否延迟加载)
在resultMap中的association 和 collection标签上的一个属性,值lazy 和 eager
用于设定单个是否延迟加载
一对多(resultMap中collection标签)
/*准备:DeptEmps类:did, dname, List<Emps> emps*/<mapper namespace="">//没别名的情况下,type写全类名<resultMap id="deptEmpsMap" type="DeptEmps"><id column="did" property="did" /><result column="dname" property="dname" />//ofType是集合中的类型<collection property="emps" ofType="Emp" ><id column="eid" property="eid" /><result column="ename" property="ename" /><result column="age" property="age" /><result column="sex" property="sex" /></collection>//若collection要分步查询,则与上面多对一类似,使用select属性和column//column若要传多个参数则使用map的形式//<collection property="emps" select="" column="{did=did,ename=ename}"></collection></resultMap>//查询一个部门中所有的员工<select id="getDeptEmps" resultMap="deptEmpsMap">select dept.did,dept.dname,eid,ename,age,sexfrom emp left join depton emp.did=dept.didwhere dept.id=#{did}</select></mapper>
动态SQL之if
<select id="" resultType="">select eid,ename,age,sexfrom empwhere eid=#{id}<if test="ename != null and ename != ''">and ename=#{name}</if><if test="age != null">and age=#{age}</if>//对于等于号,必须是数字,男和女不行<if test="sex == 1 or sex == 0">and sex=#{age}</if></select>
动态SQL之where
<select id="" resultType="">select eid,ename,age,sexfrom emp//where 标签自动加上一个where并去除后一个and<where><if test="eid != null">eid=#{eid}</if><if test="ename != null and ename != ''">and ename=#{name}</if><if test="age != null">and age=#{age}</if>//对于等于号,必须是数字,男和女不行<if test="sex == 1 or sex == 0">and sex=#{age}</if></where></select>
动态SQL之trim
<select id="" resultType="">select eid,ename,age,sexfrom emp/*prefix:在操作SQL语句前加上某些内容suffix:在操作SQL语句后加上某些内容prefixOverrides:在操作SQL语句前去除某些内容suffixOverrides:在操作SQL语句后去除某些内容suffixOverrides="and|or" 竖线是或,表示去除and或者or*/<trim prefix="where" prefixOverrides="and"><if test="eid != null">eid=#{eid}</if><if test="ename != null and ename != ''">and ename=#{name}</if><if test="age != null">and age=#{age}</if>//对于等于号,必须是数字,男和女不行<if test="sex == 1 or sex == 0">and sex=#{age}</if></trim></select>
动态SQL之set
<update id="" >update emp//set标签可用于去除多余的逗号,用trim也可实现<set><if test="eid != null">eid=#{eid},</if><if test="ename != null and ename != ''">and ename=#{name},</if><if test="age != null">and age=#{age}</if></set></update>
动态SQL之choose
<select id="" resultType="">select eid,ename,age,sexfrom empwhere<choose><when test="eid != null">eid=#{eid}</when><when test="ename != null and ename!= '' ">ename=#{ename}</when><otherwise></otherwies></choose></select>
动态SQL之foreach
/*collectionitemseperatoropenclose*/<insert id="" >insert into emps values<foreach collection="list" item="emp" seperator=",">(#{emp.eid},#{emp.ename},#{emp.age},#{emp.sex})</foreach></insert>
动态SQL之sql
/*主要用于定义公共sql片段*/<sql id="empColumn">select eid,ename,age,sex from emp</sql>//引用sql片段<include refid="empColumn"></include>
MyBatis缓存
一级缓存
默认开启
一级缓存失效情况:
- 两次查询不是同一个sqlSession时
- 两次查询的查询条件不一样时
- 两次查询中间执行了任意一个增删改语句时
-
二级缓存
二级缓存默认不开启
- 缓存要求POJO实现Serializable接口
- 二级缓存在sqlSession关闭或提交后才会生效
使用配置:
- 全局开启二级缓存
- 需要开启二级缓存的映射文件配置
标签 - POJO要实现序列化接口
二级缓存的相关属性:
