加油

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 { }

posted on 2016-10-19 21:00  LelouchKOP  阅读(161)  评论(0编辑  收藏  举报