1.支持注解和映射器, 配置文件,映射器Mapper接口(可以以类型安全的方式调用映射的SQL语句)
定制化SQL,存储过程,高级映射,
嵌套结果,嵌套查询
2.Mybatis通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象,Java对象的数据持久化数据库中 的过程;
Java对象映射到SQL语句参数,sql结果集映射成Java对象
mybatis-config.xml或者Java API->SqlSessionFactory对象,线程不安全的
映射器mapper接口,方法名与id的值相同,namesapce为映射器接口的权限的名
接口调用映射的SQL语句,
java对象中的属性设置成查询参数,从SQL结果集上生成Java对象这两个过程
3. My流行起来有以下原因:
它消除了大量的 JDBC冗余代码
它有低的学习曲线
它能很好地与传统数据库协同工作
它可以接受 SQL语句
它提供了与 Spring 和 Guice框架的集成支持 框架的集成支持
它提供了与第三方缓存类库的集成支持
4.
1.他支持复杂的SQL结果集数据映射到嵌套对象图结构
2.支持一对一和一对多的结果集和Java对象的映射
3.支持根据输入的数据构建动态的SQL语句
5.typeAlias 类型别名:Alias注解将会覆盖配置文件中的 注解将会覆盖配置文件中的 <typeAliases>定义
@Alias("StudentAlias") public class Student { };
6.typeHandlers 类型处理器:public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType)
throws SQLException { ps.setString(i, parameter.getAsString()); }
<typeHandlers>
<typeHandler handler="com.mybatis3.typehandlers. PhoneTypeHandler" />
</typeHandlers>
7.输入参数类型和结果返回类型有效
8.SqlSession是线程不安全的
9.sqlSession.insert() 方法 返回 执行INSERT语句 后所影响的行数
10.MyBatis的结果集映射 ResultMaps特性非常 强大 ,你可以 使用它将简单的SELECT语句映射到复杂的一对 语句映射到复杂的一对 一和一对多关系的Select语句上
11.resultType='map' java.Util.HashMap的别名 resultMap
12.圆点技法,一对一映射
<resultMap Type = "" id ="" >
<result property="address.addrId" column="addr_id" />
<result property="address.street" column="street" />
<result property="address.city" column="city" />
<result property="address.state" column="state" />
</resultMap>
13.嵌套结果ResultMap,
<association property="address" resultMap="AddressResult" />
元素 <association>被用来 导入 “有一个 ”(has-one)类型 的关联。
嵌套Select查询语句
<association property="address" column="addr_id" select="findAddressById" />
14.一对多
<collection>元素 被用来将多行课程 结果映射成一个Course对象的一个集合
嵌套Select语句查询会导致N+1选择问题。首先,主查询将会执行(1次),对于主查询返回的每一行,另外一个查询将会被执行(主查询N行,则此查询N次)。对于大型数据库而言,这会导致很差的性能问题。
15.<if><choose><where><foreach><trim> OGNL(object Graph Navigation Language)表达式来构建动态SQL语言,
if:<if test="courseName != null"> AND NAME LIKE #{courseName} </if>
只使用一种查询条件:choose when otherwise:<choose> <when test="searchBy == 'Tutor'"> WHERE TUTOR_ID= #{tutorId} </when> <when test="searchBy == 'CourseName'"> WHERE name like #{courseName} </when> <otherwise> WHERE TUTOR start_date >= now() </otherwise> </choose>
16.criteria查询条件
17.所有的查询 条件 (criteria)应该 是可选的。 是可选的。 在需要使用至少 一种查询条件 的情况下, 我们应该 使用 WHERE子句
<where> <if test=" tutorId != null "> TUTOR_ID= #{tutorId} </if> <if test="courseName != null"> AND name like #{courseName} </if> <if test="startDate != null"> AND start_date >= #{startDate} </if> <if test="endDate != null"> AND end_date <= #{endDate} </if> </where>
如果 WHERE子句 以 AND或者 OR 打头,则 打头 的AND或 OR 将会移除
18. trim和where类似,,但是 ,<trim>提供 了在添加前缀 了在添加前缀 /后缀 或者 移除前缀 /后缀方面提供更大的灵活性。 <trim prefix="WHERE" prefixOverrides="AND | OR">
19.foreach,迭代遍历一个数组或者列表,构造AND/OR 条件或一个IN字句
<foreach item="tutorId" collection="tutorIds"> OR tutor_id=#{tutorId} </foreach>
<if test="tutorIds != null"> <where> tutor_id IN <foreach item="tutorId" collection="tutorIds" open="(" separator="," close=")"> #{tutorId} </foreach> </where> </if>
20.set条件,<set> <if test="name != null">name=#{name},</if> <if test="email != null">email=#{email},</if> <if test="phone != null">phone=#{phone},</if> </set>
21.传入多个输入参数
<select id="findAllStudentsByNameEmail" resultMap="StudentResult"> select stud_id, name,email, phone from Students where name=#{param1} and email=#{param2} </select>
22、多行结果集映射成map
23.使用rowbounds对结果集进行分页,
int offset =0 , limit =25; RowBounds rowBounds = new RowBounds(offset, limit); List<Student> = studentMapper.getStudents(rowBounds);
@Alias("StudentAlias") public class Student { }