一.环境搭建
1.1.持久化和ORM。
1. 持久化就是程序的数据,在瞬时状态(new)和持久状态(数据库等)之间的转化。通过数据库操作进行转化。
2. ORM.(O=javaBean)(R=关系型数据库)(M=映射)。
注意:ORM这三方面要保持一致。任意部分的变动都要一起检测。
1.2.Mybatis的概念和优缺点
优点:
1.Mybatis是一个“半成品”的“ORM”框架。作用于DAO层。
2.和hibernate相比,他是一个轻量级的选手。有着灵活的SQL的操作。
3.小巧简单易学。
4.和JDBC相比,他实现了SQL和代码的分离。可重用。
缺点:
1.SQL编写的量大。需要对sql语句熟悉。
2.数据库的移植性较差。
1.3.Mybatis的主配置文件:
1.数据源的相关信息。
<!-- environments 可以设置多个数据源, default属性指定了默认的数据源-->
<environments default="development">
<!-- environment 设置单个数据源,id属性给数据源指定一个唯一的名称 -->
<environment id="development">
<!--配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
<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>
2.相应的子配置的引用。程序中只需要加载主配置文件即可。
注意:新增子配置文件需要在主配置文件中添加引用。
引用的xml的地址。使用的“/”不是“.”
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
1.4.Mybatis的子配置文件。(通过namespace属性指定一个整个工程中唯一的标识符)
1. 要执行的sql语句。(对应增删改查相应的标签)
2. 实体类的映射信息。
<!-- namespace 指定了命名空间,在整个工程中唯一标识 -->
<mapper namespace="com.dao.EmpMapper">
<!-- 查询用户表记录数
select 标签用于执行查询语句
id属性:在这个mapper中的唯一标识
resultType 查询结果的返回值类型
-->
<select id="count" resultType="int">
SELECT COUNT(1) as count FROM emp
</select>
</mapper>
1.5.Mybatis的三个核心对象以及生命周期。
1. SqlSessionFactoryBuilder:
作用:加载Mybatis的主配置文件,创建SqlSessionFactory.
生命周期:用过即丢,只存在与方法体内部。
2. SqlSessionFactory:
作用:创建SqlSession实例。
生命周期:Application范围内,与应用的生命周期保持一致。是个单例模式。
3. SqlSession
作用:使用Mybatis的API执行sql。
生命周期:对应一次数据库会话,用后关闭。线程级别不能共享。
1.6.SqlSession执行sql的两种方式
1. 通过SqlSession实例直接运行要执行的sql。
例如:sqlSession.selectList("找到唯一的sql");
2.基于Mapper接口方式操作数据。(借助于接口的方法来调用sql)
1.创建一个接口。接口的位置要和Mapper文件同一个目录。命名也要一致。
2.配置这个接口和对应Mapper的关系。
使用nameSpace属性建立接口类和Mapper的关系。
<mapper namespace="com.dao.EmpMapper">
3. 建立接口中方法和Mapper中sql的关系:
1.方法名要对应 方法名对应id属性
2.方法的参数要对应 paramterType属性
3.方法的返回值要对应 resultMap属性和resultType属性
<select id="count" resultType="int">
SELECT COUNT(1) as count FROM emp
</select>
public int count();
4.使用SqlSession的getMapper方法,获取接口对象。
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
5.调用接口的方法,执行sql。
一级缓存:
1.session级别的缓存。
2.默认都会有,不需要手动开启。
3.线程不共享的。
4.当session关闭或者flush时。session缓存清空。
二级缓存:
1.sessionFactroy级别的缓存。同一个namespace内的select会被缓存。
2.默认时不开启。需要手动开启。
3.线程共享。
4.当进行增删改的时候,缓存将被清空。
二级缓存开启的步骤:
1.在mybatis的主配置文件中,开启缓存
<configuration>
<settings>
<setting name="Zhang" value="true"/>
<setting name="Zhang2" value="false"/>
</settings>
</configuration>
2.在mapper中的设置缓存
<cache
eviction="FIFO" // 回收策略
flushInterval="60000" // 缓存刷新的间隔时间
size="512" // 缓存大小
readOnly="true" /> // 默认时false,表示其他线程调用都是复制缓存对象。如果为true,线程使用的时原始的缓存对象
二.Mapper配置详解
select标签。用来执行select语句。需要保证每一个select元素和接口的方法一一对应(方法名、参数和返回值)。
1.id属性:用来在单个Mapper中做唯一标识。要求和接口中的方法名保持一致。
2.parameterType属性。相当于方法的参数。有三种值:
1. 简单数据类型:int,string等。
<select id="Zhang" parameterType="int" resultType="map">
select * from fian where emp_id=#{id}
</select>
2.map。可以传入多个值。key值为map的key值
<select id="Zhang" parameterType="map" resultType="map">
select * from fang where emp_id=#{id} and dept_id=#{deptid}
</select>
3. javaBean。可以传入多个值。key值为属性名
<select id="getZhang" parameterType="com.bean.Fang" resultType="Fang">
select * from fang where emp_id=#{id} and dept_id=#{deptid}
</select>
3.resultType属性。相当于方法的返回值。一般有两种值:
1. 简单数据类型。返回单个值
2. map。
4.resultMap属性。主要用于希望返回自定义的javaBean时。
他的主要作用就是实现数据库结果集(R)和javaBean(O)之间的映射关系。所以在他的配置中既要体现R,也要体现O。在结构和数据上ORM三方都要保持统一。
例如:在多的一方配置如下:
<resultMap type="Emp" id="emp">
<id property="empId" column="emp_id" />
<result property="empName" column="emp_name" />
<!--多对一-->
<association property="dept" javaType="com.bean.Dept">
<id property="deptId" column="dept_id" />
<result property="deptName" column="dept_name" />
</association>
</resultMap>
下面时一对多的配置:
<resultMap type="com.bean.Dept" id="dept">
<id property="deptId" column="dept_id" />
<result property="deptName" column="dept_name" />
<!--一对多-->
<collection property="empList" ofType="com.bean.Emp">
<id property="empId" column="emp_id" />
<result property="empName" column="emp_name" />
</collection>
</resultMap>
三、update insert delete标签。都没有resultType属性。
1.他们的返回值均为影响行数。int类型。
2,增删改默认需要提交事务。
四、@param方式进行参数的传入。
public List<Emp> getEmpListEmp(@Param("name")String name);
五、动态SQL-mybatis
5.1.if标签。可以对输入的参数进行判断,来实现动态SQL。
test属性用来作为判断条件,返回true或者false
select * from emp e where 1=1
<if test="empId!=null">
and e.emp_id=#{empId}
</if>
5.2.where标签。用来简化where条件。智能的判断是否需要and、or。
where有两个作用:1.代替where字符串。
2.自动判断where“紧邻”的条件是否需要and、or.
select * from fang e ,dept d
<where>
e.dept_id=d.dept_id
<if test="empId!=null">
and e.emp_id=#{empId}
</if>
<if test="empName!=null">
and e.emp_name like concat('%', #{empName} ,'%')
</if>
</where>
5.3.set标签。常用在update中。有两个作用:
1.省略set字符串。
2.自动判断最后的设置字段,有没有","。
<update id="updateEmp" parameterType="com.bean.Emp">
update fang e
<set>
<if test="empId!=null">
e.emp_id=#{empId},
</if>
<if test="empName!=null">
e.emp_name=#{empName}
</if>
</set>
where e.emp_id=#{empId}
</update>
5.4.trim标签。他是一个很灵活的标签。他可以替换set和where标签。有四个属性:
1.prefix:增加前缀
2.prefixOverrides: 前缀自动判断省略
3.suffix:增加后缀
4.suffixOverrides: 后缀自动判断省略
<trim prefix="where" prefixOverrides="and">
</trim>
<trim prefix="set" suffixOverrides="," >
</trim>
5.5. foreach标签。用来迭代集合,常用来组合in。
1.collection:必填。指定要循环的集合。有三种情况:
1.传入的参数为List时:填写list
2.传入的参数为数组时:填写array
3.传入的参数为Map,而map中有一个key值对应为集合时。填写key值
2.open:在循环开头增加的字符串
3.close:在循环结束增加的字符串
4.separator:多次循环中的间隔符
5.item:每次循环中的对象。
<select id="getIn" parameterType="map" resultMap="fang">
select * from fang e
where e.fang_id=#{empId} and e.fang_name in
<foreach collection="names"
open="("
close=")"
separator=","
item="bbe" >
#{nameq}
</foreach>
</select>
5.6 choose(when、otherwise)用来做if-else的代替。类似于switch。
<choose>
<when test=""></when>
<when test=""></when>
<otherwise></otherwise>
</choose>
六、resultMap元素
6.1.resultMap元素的属性:
1.id:resultMap的唯一标识
2.type:映射的结果类型
6.2 resultMap元素的子元素
id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能
result:指定结果集字段和实体类属性的映射关系
association:映射“多对一”或“一对一”关系
collection:映射“一对多”关系
七、嵌套结果映射之associationassociation
7.1.复杂的关联类型,映射一个嵌套JavaBean属性
7.2.多对一或一对一
7.3.属性:
1.property:用来映射查询结果子集的实体属性
2.javaType:完整Java类名或者别名
3.esultMap:引用外部resultMap
7.4子元素: id result
八.嵌套结果映射之collection
8.1.复杂类型集合,映射嵌套结果集到一个列表
8.2 一对多
8.3 属性
1. property:实体类中用来映射查询结果子集的集合属性
2.ofType:集合中元素的类型,完整Java类名或者别名
3.resultMap:引用外部resultMap
8.4子元素: id result