tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具

实现对员工表的增删改查的代码
java的dao层接口


  1. public interface WorkerMapper extends Mapper<Worker> {
  2. }

xml映射文件


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.jjs.kaiwen.dao.WorkerMapper">
  4. <resultMap id="BaseResultMap" type="com.jjs.kaiwen.model.Worker">
  5. <!--
  6. WARNING - @mbggenerated
  7. -->
  8. <id column="id" jdbcType="INTEGER" property="id" />
  9. <result column="worker_id" jdbcType="VARCHAR" property="workerId" />
  10. <result column="name" jdbcType="VARCHAR" property="name" />
  11. <result column="org_id" jdbcType="INTEGER" property="orgId" />
  12. <result column="status" jdbcType="VARCHAR" property="status" />
  13. <result column="role_id" property="roleId" jdbcType="INTEGER" />
  14. </resultMap>
  15. </mapper>

实体对象


  1. @Table(name = "worker")
  2. public class Worker {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. private Integer id;
  6. @Column(name = "worker_id")
  7. private String workerId;
  8. private String name;
  9. @Column(name = "org_id")
  10. private Integer orgId;
  11. private String status;
  12. @Column(name = "role_id")
  13. private Integer roleId;
  14. // getters and setters ...
  15. }

以上就是实现对Worker进行增删改查的所有代码,包括选择性更新、插入、删除等,所有的方法列表如下

以后对表字段的添加或修改只需要更改实体对象的注解,不需要修改xml映射文件,如将worker_id改成worker_no


  1. @Column(name = "worker_no")
  2. private String workerNo;

数据源的配置,只需要将org.mybatis.spring.mapper.MapperScannerConfigurer改成tk.mybatis.spring.mapper.MapperScannerConfigurer,然后加一个属性
,也可不加,因为框架提供了默认实现


  1. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  3. <property name="basePackage" value="com.jjs.zanbi.dao" />
  4. <property name="properties">
  5. <value>
  6. mappers=tk.mybatis.mapper.common.Mapper
  7. </value>
  8. </property>
  9. </bean>

用这个库之后写代码感觉在飞…….如果只是简单的了解此框架到这里就可以了,下面是对框架实现原理的分析

原理的简单分析

此框架为我们实现这些功能所有的改动都在Mapper层面,所有的Mapper都继承了tk.mybatis.mapper.common.Mapper

public interface WorkerMapper extends Mapper<Worker> {}

Mapper接口的声明如下,可以看到Mapper接口实现了所有常用的方法


  1. public interface Mapper<T> extends
  2. BaseMapper<T>,
  3. ExampleMapper<T>,
  4. RowBoundsMapper<T>,
  5. Marker {
  6. }

看一下完整的UML图,太大了,可以用新窗口打开,放大之后再看

这里选择一个接口:SelectOneMapper接口,对于源码进行简单分析,此接口声明如下:


  1. public interface SelectOneMapper<T> {
  2. /**
  3. * 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
  4. *
  5. * @param record
  6. * @return
  7. */
  8. @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
  9. T selectOne(T record);
  10. }

@SelectProvider是mybatis3之后提供的,用于灵活的设置sql来源,这里设置了服务提供类和方法,但这个库并没有直接用method指定的方法来返回sql,而是在运行时进行解析的,代码如下


  1. public class BaseSelectProvider extends MapperTemplate {
  2. public String selectOne(MappedStatement ms) {
  3. Class<?> entityClass = getEntityClass(ms);
  4. //修改返回值类型为实体类型
  5. setResultType(ms, entityClass);
  6. StringBuilder sql = new StringBuilder();
  7. sql.append(SqlHelper.selectAllColumns(entityClass));
  8. sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
  9. sql.append(SqlHelper.whereAllIfColumns(entityClass, isNotEmpty()));
  10. return sql.toString();
  11. }
  12. }

到这里我们就大概知道了这个库为我们提供便利的原理了,总的来说就是这个库帮我们提供了对表的基本操作的sql,帮我们省了很多工作量,而且维护起来也很方便,否则我们的xml文件动不动就几百行甚至上千行

对源码的探索不能到这里停止,最起码要分析到与另一个框架的整合点

我们知道,mybatis的mapper接口是在启动的时候被框架以JdkProxy的形式封装了的,具体对应的类是MapperFactoryBean,这个类中有一个checkDaoConfig()方法,是从父类继承并重写了该方法,继承结构如下

MapperFactoryBean -> SqlSessionDaoSupport -> DaoSupport

这里的DaoSupport就是spring提供的Dao的抽象,代码如下


  1. public abstract class DaoSupport implements InitializingBean {
  2. // spring 完成属性设置后会调用此方法
  3. @Override
  4. public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {
  5. // 这里提供了接口供子类去实现
  6. checkDaoConfig();
  7. // Let concrete implementations initialize themselves.
  8. try {
  9. initDao();
  10. }
  11. catch (Exception ex) {
  12. throw new BeanInitializationException("Initialization of DAO failed", ex);
  13. }
  14. }
  15. protected abstract void checkDaoConfig() throws IllegalArgumentException;
  16. protected void initDao() throws Exception {
  17. }
  18. }

框架自定义的MapperFactoryBean重写了checkDaoConfig()方法,完成对所有sql语句的设置,代码如下


  1. @Override
  2. protected void checkDaoConfig() {
  3. super.checkDaoConfig();
  4. //通用Mapper
  5. if (mapperHelper.isExtendCommonMapper(getObjectType())) {
  6. //这里去处理该类所对应的MappedStatement,封装在helper类中处理
  7. mapperHelper.processConfiguration(getSqlSession().getConfiguration(), getObjectType());
  8. }
  9. }

MapperHelper的processConfiguration方法如下


  1. public void processConfiguration(Configuration configuration, Class<?> mapperInterface) {
  2. String prefix;
  3. if (mapperInterface != null) {
  4. prefix = mapperInterface.getCanonicalName();
  5. } else {
  6. prefix = "";
  7. }
  8. for (Object object : new ArrayList<Object>(configuration.getMappedStatements())) {
  9. if (object instanceof MappedStatement) {
  10. MappedStatement ms = (MappedStatement) object;
  11. //检查这个MappedStatement是否属于此映射对象
  12. if (ms.getId().startsWith(prefix) && isMapperMethod(ms.getId())) {
  13. if (ms.getSqlSource() instanceof ProviderSqlSource) {
  14. //去设置该statement的sql语句
  15. setSqlSource(ms);
  16. }
  17. }
  18. }
  19. }
  20. }

设置sql的逻辑,提供了几种不同类型的sqlsource


  1. public void setSqlSource(MappedStatement ms) throws Exception {
  2. if (this.mapperClass == getMapperClass(ms.getId())) {
  3. throw new RuntimeException("请不要配置或扫描通用Mapper接口类:" + this.mapperClass);
  4. }
  5. Method method = methodMap.get(getMethodName(ms));
  6. try {
  7. //第一种,直接操作ms,不需要返回值
  8. if (method.getReturnType() == Void.TYPE) {
  9. method.invoke(this, ms);
  10. }
  11. //第二种,返回SqlNode
  12. else if (SqlNode.class.isAssignableFrom(method.getReturnType())) {
  13. SqlNode sqlNode = (SqlNode) method.invoke(this, ms);
  14. DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(ms.getConfiguration(), sqlNode);
  15. setSqlSource(ms, dynamicSqlSource);
  16. }
  17. //第三种,返回xml形式的sql字符串
  18. else if (String.class.equals(method.getReturnType())) {
  19. String xmlSql = (String) method.invoke(this, ms);
  20. SqlSource sqlSource = createSqlSource(ms, xmlSql);
  21. //替换原有的SqlSource
  22. setSqlSource(ms, sqlSource);

到这里整个sql的获取流程就分析完了,本人用这个库写过一个小项目,确实节省了开发的工作量,而且DAO层的结构更加清晰简洁了

关于mybatis新特性

从3.4.0开始,mybatis提供对外部表的alias引用方法,多表联合查询就方便多了,我们先看原始的方式是怎样做的


  1. select a.id,a.name,b.bid,b.bname .....
  2. from user a
  3. left join room b

原始的方式是将所有的表字段列出来,再来看用新特性怎样做


  1. select id="selectUsers" resultType="map">
  2. select
  3. <include refid="user_col_sql_id"><property name="alias" value="t1"/>,
  4. <include refid="room_col_sql_id"><property name="alias" value="t2"/>
  5. from user t1
  6. left join room t2
  7. </select>

这里主要就是对基本的sql进行了复用,如果对表进行了修改只要在原始的sql节点修改就可以了,就算是5个表的联合查询,sql也是清晰易懂,维护起来会更轻松

新版本的mybatis对于对象映射也提供了更友好的方式,直接使用外部的ResultMap再加上查询语句中的别名就映射完成了


  1. <resultMap id="workerResultMap" type="com.jjs.kaiwen.model.Worker" extends="BaseResultMap">
  2. <association property="room" columnPrefix="b_" resultMap="com.jjs.kaiwen.dao.OrgMapper.BaseResultMap"/>
  3. </resultMap>

更进一步

敏锐的程序员可能会提出问题,如当多表查询的时候可能会存在字段名称相同的情况,这里的解决方案是给include添加另一个属性


  1. <include refid="user_col_sql_id_with_alias">
  2. <property name="alias" value="t"/>
  3. <property name="prefix" value="t_"/>
  4. </include>

包含prefix的sqlNode如下


  1. <sql id="base_column_with_alias">
  2. ${alias}.ID as ${prefix}ID,
  3. ${alias}.WORKER_ID as ${prefix}WORKER_ID,
  4. ${alias}.NAME as ${prefix}NAME,
  5. ${alias}.ZB_ROLE_ID as ${prefix}ZB_ROLE_ID,
  6. ${alias}.ORG_ID as ${prefix}ORG_ID,
  7. ${alias}.STATUS as ${prefix}STATUS
  8. </sql>

如果说觉得手动写包含alias和prefix的字段麻烦,可以用,mybatis代码生成器的插件的方式实现,我自己写了一个生成器的插件,可以代码再这里,仅供参考

通用Service类


  1. /**
  2. * Created by Kaiwen
  3. */
  4. @Service
  5. public abstract class CommonServiceImpl<T,PK extends Serializable> implements CommonService<T,PK> {
  6. /**
  7. * 泛型注入
  8. */
  9. @Autowired
  10. private Mapper<T> mapper;
  11. public T selectByPrimaryKey(PK entityId) {
  12. return mapper.selectByPrimaryKey(entityId);
  13. }
  14. public int deleteByPrimaryKey(PK entityId) {
  15. return mapper.deleteByPrimaryKey(entityId);
  16. }
  17. public int insert(T record) {
  18. return mapper.insert(record);
  19. }
  20. public int insertSelective(T record) {
  21. return mapper.insertSelective(record);
  22. }
  23. public int updateByPrimaryKeySelective(T record) {
  24. return mapper.updateByPrimaryKeySelective(record);
  25. }
  26. public int updateByPrimaryKey(T record) {
  27. return mapper.updateByPrimaryKey(record);
  28. }
  29. public List<T> selectByExample(Example example) {
  30. return mapper.selectByExample(example);
  31. }
  32. }

注入方式区别


  1. <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
  2. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  3. <property name="basePackage" value="com.jjshome.esf.core.dao.school" />
  4. <property name="properties">
  5. <value>
  6. mappers=tk.mybatis.mapper.common.Mapper
  7. </value>
  8. </property>
  9. </bean>
  10. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  11. <property name="basePackage" value="com.jjshome.esf.core.dao.community,com.jjshome.esf.core.dao.hsl"/>
  12. </bean>

实体类


  1. package com.jjshome.esf.common.entity.school;
  2. import java.util.Date;
  3. import javax.persistence.*;
  4. @Table(name = "XQ_SCHOOL_AREA")
  5. public class SchoolArea {
  6. /**
  7. * 主键ID
  8. */
  9. @Id
  10. @Column(name = "ID")
  11. private Integer id;
  12. /**
  13. * 城市编码
  14. */
  15. @Column(name = "CITY_CODE")
  16. private String cityCode;
  17. /**
  18. * 学区名称
  19. */
  20. @Column(name = "NAME")
  21. private String name;
  22. /**
  23. * 学区名称拼音
  24. */
  25. @Column(name = "NAME_SPELL")
  26. private String nameSpell;
  27. /**
  28. * 状态,1:正常,0:删除
  29. */
  30. @Column(name = "STATUS")
  31. private Byte status;
  32. /**
  33. * 添加人
  34. */
  35. @Column(name = "CREATE_ID")
  36. private String createId;
  37. @Transient
  38. private Integer primaryCount; //小学数量
  39. @Transient
  40. private Integer middleCount; //初中数量
  41. @Transient
  42. private Integer highCount;//高中数量

TK mybatis Mapper文件内容


  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.jjshome.esf.core.dao.school.ISchoolAreaDAO" >
  4. <resultMap id="BaseResultMap" type="com.jjshome.esf.common.entity.school.SchoolArea" >
  5. <!--
  6. WARNING - @mbggenerated
  7. -->
  8. <id column="ID" property="id" jdbcType="INTEGER" />
  9. <result column="CITY_CODE" property="cityCode" jdbcType="VARCHAR" />
  10. <result column="NAME" property="name" jdbcType="VARCHAR" />
  11. <result column="NAME_SPELL" property="nameSpell" jdbcType="VARCHAR" />
  12. <result column="STATUS" property="status" jdbcType="TINYINT" />
  13. <result column="CREATE_ID" property="createId" jdbcType="VARCHAR" />
  14. <result column="CREATE_DATE" property="createDate" jdbcType="TIMESTAMP" />
  15. <result column="UPDATE_ID" property="updateId" jdbcType="VARCHAR" />
  16. <result column="UPDATE_DATE" property="updateDate" jdbcType="TIMESTAMP" />
  17. <result column="CITY_NAME" property="cityName"/>
  18. <result column="PRIMARY_COUNT" property="primaryCount"/>
  19. <result column="MIDDLE_COUNT" property="middleCount"/>
  20. <result column="HIGH_COUNT" property="highCount"/>
  21. </resultMap>
  22. <resultMap id="SchoolDetailArea" type="com.jjshome.esf.common.entity.school.SchoolAreaDetail"
  23. extends="com.jjshome.esf.core.dao.school.ISchoolInfoDAO.SchoolInfo">
  24. <result column="SCHOOL_AREA_NAME" property="schoolAreaName"/>
  25. </resultMap>
  26. <select id="selectByPage" parameterType="map" resultMap="BaseResultMap">
  27. SELECT A.*, C.NAME AS CITY_NAME,
  28. (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='553' AND B.STATUS = 1 ) AS PRIMARY_COUNT,
  29. (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='554' AND B.STATUS = 1 ) AS MIDDLE_COUNT,
  30. (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='555' AND B.STATUS = 1 ) AS HIGH_COUNT
  31. FROM XQ_SCHOOL_AREA A
  32. LEFT JOIN YW_CITY_SETTING C ON A.CITY_CODE = C.CODE
  33. <where>
  34. <if test="name != null and name != '' "> A.NAME LIKE CONCAT('%',#{NAME},'%') </if>
  35. <if test="areaCityCode != null and areaCityCode != '' "> A.CITY_CODE = #{areaCityCode} </if>
  36. <if test="keywords != null and keywords != '' ">
  37. ( A.NAME LIKE CONCAT('%',#{keywords},'%')
  38. )
  39. </if>
  40. </where>
  41. </select>
  42. <select id="selectAreaIdAndKeyWord" parameterType="java.util.Map" resultMap="BaseResultMap">
  43. SELECT
  44. *
  45. FROM
  46. XQ_SCHOOL_AREA
  47. WHERE
  48. 1=1
  49. <if test="cityId != null">
  50. AND CITY_CODE=#{cityId}
  51. </if>
  52. <if test="key != null and key!=''">
  53. AND (NAME like CONCAT(#{key},'%' ) or NAME_SPELL like CONCAT(#{key},'%' ))
  54. </if>
  55. AND
  56. STATUS=1
  57. <if test="pageSize != null">
  58. limit #{pageSize}
  59. </if>
  60. </select>
  61. <!--查询学区详情列表-->
  62. <select id="selectAreaDetailByPage" parameterType="map" resultMap="SchoolDetailArea">
  63. SELECT A.* ,B.NAME AS SCHOOL_AREA_NAME ,C.NAME AS CITY_NAME,D.NAME AS AREA_NAME FROM XQ_SCHOOL_INFO A
  64. LEFT JOIN XQ_SCHOOL_AREA B ON A.AREA_ID = B.ID
  65. LEFT JOIN YW_CITY_SETTING C ON A.CITY_CODE = C.CODE
  66. LEFT JOIN YW_CITY_SETTING D ON A.AREA_CODE = D.CODE
  67. WHERE A.STATUS = 1 AND B.STATUS =1
  68. <if test="areaId != null and areaId.length() &gt; 0"> AND A.AREA_ID = #{areaId} </if>
  69. <if test="typeList != null and typeList.size &gt; 0">
  70. AND
  71. A.TYPE IN
  72. <foreach collection="typeList" item="item" index="index" open="(" close=")" separator=",">
  73. #{item}
  74. </foreach>
  75. </if>
  76. <if test="name != null and name != '' "> AND A.NAME LIKE CONCAT('%',#{name},'%') </if>
  77. </select>
  78. </mapper>

普通mybatisMapper文件


  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.jjshome.esf.core.dao.school.ISchoolInfoDAO">
  4. <resultMap id="SchoolInfo" type="com.jjshome.esf.common.entity.school.SchoolInfo">
  5. <id column="ID" property="id"/>
  6. <result column="NAME" property="name"/>
  7. <result column="NAME_SPELL" property="nameSpell"/>
  8. <result column="ALIAS" property="alias"/>
  9. <result column="ALIAS_SPELL" property="aliasSpell"/>
  10. <result column="TYPE" property="type" typeHandler="com.jjshome.esf.core.component.handler.DictValueTypeHandler"/>
  11. <result column="AREA_ID" property="areaId"/>
  12. <result column="CITY_CODE" property="cityCode"/>
  13. <result column="AREA_CODE" property="areaCode"/>
  14. <result column="ADDR" property="addr"/>
  15. <result column="START_TIME" property="startTime"/>
  16. <result column="MOTTO" property="motto"/>
  17. <result column="WEB_SITE" property="webSite"/>
  18. <result column="PHONE" property="phone"/>
  19. <result column="FEATURE" property="feature" typeHandler="com.jjshome.esf.core.component.handler.DictValueListTypeHandler"/>
  20. <result column="LNG" property="lng"/>
  21. <result column="LAT" property="lat"/>
  22. <result column="UNIT_PRICE" property="unitPrice"/>
  23. <result column="SALE_PRICE" property="salePrice"/>
  24. <result column="NATURE_TYPE" property="natureType" typeHandler="com.jjshome.esf.core.component.handler.DictValueTypeHandler"/>
  25. <result column="NATURE_CITY" property="natureCity" typeHandler="com.jjshome.esf.core.component.handler.DictValueTypeHandler"/>
  26. <result column="SCHOOL_DEGREE" property="schoolDegree"/>
  27. <result column="ENROL_DEGREE" property="enrolDegree"/>
  28. <result column="IMG_DEGREE" property="imgDegree"/>
  29. <result column="STATUS" property="status"/>
  30. <result column="CREATE_ID" property="createId"/>
  31. <result column="CREATE_DATE" property="createDate"/>
  32. <result column="UPDATE_ID" property="updateId"/>
  33. <result column="UPDATE_DATE" property="updateDate"/>
  34. <result column="CITY_NAME" property="cityName" />
  35. <result column="AREA_NAME" property="areaName" />
  36. <result column="SCHOOL_DISTRICT_NAME" property="schoolDistrictName" />
  37. <result column="SALE_COUNT" property="saleCount" />
  38. </resultMap>
  39. <sql id="Base_Column_List">
  40. ID,
  41. NAME,
  42. NAME_SPELL,
  43. ALIAS,
  44. ALIAS_SPELL,
  45. TYPE,
  46. AREA_ID,
  47. CITY_CODE,
  48. AREA_CODE,
  49. ADDR,
  50. START_TIME,
  51. MOTTO,
  52. WEB_SITE,
  53. PHONE,
  54. FEATURE,
  55. LNG,
  56. LAT,
  57. UNIT_PRICE,
  58. SALE_PRICE,
  59. NATURE_TYPE,
  60. NATURE_CITY,
  61. SCHOOL_DEGREE,
  62. ENROL_DEGREE,
  63. IMG_DEGREE,
  64. STATUS,
  65. CREATE_ID,
  66. CREATE_DATE,
  67. UPDATE_ID,
  68. UPDATE_DATE,
  69. SALE_COUNT,
  70. SALE_COUNT
  71. </sql>
  72. <select id="selectById" resultMap="SchoolInfo" parameterType="java.lang.Integer">
  73. SELECT
  74. i.*,
  75. yc.NAME as 'CITY_NAME',
  76. ya.NAME as 'AREA_NAME',
  77. xq.NAME as 'SCHOOL_DISTRICT_NAME'
  78. FROM
  79. XQ_SCHOOL_INFO i
  80. LEFT JOIN YW_CITY_SETTING yc ON i.CITY_CODE = yc.CODE
  81. LEFT JOIN YW_CITY_SETTING ya ON i.AREA_CODE = ya.CODE
  82. LEFT JOIN XQ_SCHOOL_AREA xq ON i.AREA_ID = xq.ID
  83. WHERE
  84. i.ID = #{id,jdbcType=INTEGER}
  85. </select>
  86. <delete id="deleteById" parameterType="java.util.Map">
  87. UPDATE
  88. XQ_SCHOOL_INFO
  89. SET
  90. STATUS = 0,
  91. UPDATE_ID = #{updateId},
  92. UPDATE_DATE = NOW()
  93. WHERE
  94. ID = #{id,jdbcType=INTEGER}
  95. </delete>
  96. <delete id="batchDeleteByIds" parameterType="java.util.Map">
  97. UPDATE
  98. XQ_SCHOOL_INFO
  99. SET
  100. STATUS = 0,
  101. UPDATE_ID = #{updateId},
  102. UPDATE_DATE = NOW()
  103. WHERE
  104. ID IN (${ids})
  105. </delete>
  106. <update id="deleteAreaRelation" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
  107. update XQ_SCHOOL_INFO
  108. SET AREA_ID = NULL,
  109. UPDATE_DATE = NOW()
  110. WHERE
  111. ID = #{id}
  112. </update>
  113. <insert id="insert" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
  114. <selectKey resultType="Integer" keyProperty="id">
  115. SELECT LAST_INSERT_ID()
  116. </selectKey>
  117. INSERT INTO XQ_SCHOOL_INFO
  118. (NAME,
  119. NAME_SPELL,
  120. ALIAS,
  121. ALIAS_SPELL,
  122. TYPE,
  123. AREA_ID,
  124. CITY_CODE,
  125. AREA_CODE,
  126. ADDR,
  127. START_TIME,
  128. MOTTO,
  129. WEB_SITE,
  130. PHONE,
  131. FEATURE,
  132. LNG,
  133. LAT,
  134. UNIT_PRICE,
  135. SALE_PRICE,
  136. NATURE_TYPE,
  137. NATURE_CITY,
  138. SCHOOL_DEGREE,
  139. ENROL_DEGREE,
  140. IMG_DEGREE,
  141. STATUS,
  142. CREATE_ID,
  143. CREATE_DATE,
  144. UPDATE_ID,
  145. UPDATE_DATE)
  146. VALUES
  147. (#{name,jdbcType=VARCHAR},
  148. #{nameSpell,jdbcType=VARCHAR},
  149. #{alias,jdbcType=VARCHAR},
  150. #{aliasSpell,jdbcType=VARCHAR},
  151. #{type,jdbcType=INTEGER},
  152. #{areaId,jdbcType=INTEGER},
  153. #{cityCode,jdbcType=VARCHAR},
  154. #{areaCode,jdbcType=VARCHAR},
  155. #{addr,jdbcType=VARCHAR},
  156. #{startTime,jdbcType=DATE},
  157. #{motto,jdbcType=VARCHAR},
  158. #{webSite,jdbcType=VARCHAR},
  159. #{phone,jdbcType=VARCHAR},
  160. #{feature,jdbcType=VARCHAR},
  161. #{lng,jdbcType=DECIMAL},
  162. #{lat,jdbcType=DECIMAL},
  163. #{unitPrice},
  164. #{salePrice},
  165. #{natureType,jdbcType=INTEGER},
  166. #{natureCity,jdbcType=INTEGER},
  167. #{schoolDegree,jdbcType=INTEGER},
  168. #{enrolDegree,jdbcType=INTEGER},
  169. #{imgDegree,jdbcType=INTEGER},
  170. #{status,jdbcType=TINYINT},
  171. #{createId,jdbcType=VARCHAR},
  172. #{createDate,jdbcType=DATE},
  173. #{updateId,jdbcType=VARCHAR},
  174. #{updateDate,jdbcType=DATE})
  175. </insert>
  176. <insert id="insertSelective" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
  177. <selectKey resultType="Integer" keyProperty="id">
  178. SELECT LAST_INSERT_ID()
  179. </selectKey>
  180. INSERT INTO XQ_SCHOOL_INFO
  181. <trim prefix="(" suffix=")" suffixOverrides=",">
  182. <if test="name != null">
  183. NAME,
  184. </if>
  185. <if test="nameSpell != null">
  186. NAME_SPELL,
  187. </if>
  188. <if test="alias != null">
  189. ALIAS,
  190. </if>
  191. <if test="aliasSpell != null">
  192. ALIAS_SPELL,
  193. </if>
  194. <if test="type != null">
  195. TYPE,
  196. </if>
  197. <if test="areaId != null">
  198. AREA_ID,
  199. </if>
  200. <if test="cityCode != null">
  201. CITY_CODE,
  202. </if>
  203. <if test="areaCode != null">
  204. AREA_CODE,
  205. </if>
  206. <if test="addr != null">
  207. ADDR,
  208. </if>
  209. <if test="startTime != null">
  210. START_TIME,
  211. </if>
  212. <if test="motto != null">
  213. MOTTO,
  214. </if>
  215. <if test="webSite != null">
  216. WEB_SITE,
  217. </if>
  218. <if test="phone != null">
  219. PHONE,
  220. </if>
  221. <if test="feature != null">
  222. FEATURE,
  223. </if>
  224. <if test="lng != null">
  225. LNG,
  226. </if>
  227. <if test="lat != null">
  228. LAT,
  229. </if>
  230. <if test="UNIT_PRICE != null">
  231. UNIT_PRICE,
  232. </if>
  233. <if test="SALE_PRICE != null ">
  234. SALE_PRICE,
  235. </if>
  236. <if test="natureType != null">
  237. NATURE_TYPE,
  238. </if>
  239. <if test="natureCity != null">
  240. NATURE_CITY,
  241. </if>
  242. <if test="schoolDegree != null">
  243. SCHOOL_DEGREE,
  244. </if>
  245. <if test="enrolDegree != null">
  246. ENROL_DEGREE,
  247. </if>
  248. <if test="imgDegree != null">
  249. IMG_DEGREE,
  250. </if>
  251. <if test="status != null">
  252. STATUS,
  253. </if>
  254. <if test="createId != null">
  255. CREATE_ID,
  256. </if>
  257. <if test="createDate != null">
  258. CREATE_DATE,
  259. </if>
  260. <if test="updateId != null">
  261. UPDATE_ID,
  262. </if>
  263. <if test="updateDate != null">
  264. UPDATE_DATE,
  265. </if>
  266. </trim>
  267. <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
  268. <if test="name != null">
  269. #{name,jdbcType=VARCHAR},
  270. </if>
  271. <if test="nameSpell != null">
  272. #{nameSpell,jdbcType=VARCHAR},
  273. </if>
  274. <if test="alias != null">
  275. #{alias,jdbcType=VARCHAR},
  276. </if>
  277. <if test="aliasSpell != null">
  278. #{aliasSpell,jdbcType=VARCHAR},
  279. </if>
  280. <if test="type != null">
  281. #{type,jdbcType=INTEGER},
  282. </if>
  283. <if test="areaId != null">
  284. #{areaId,jdbcType=INTEGER},
  285. </if>
  286. <if test="cityCode != null">
  287. #{cityCode,jdbcType=VARCHAR},
  288. </if>
  289. <if test="areaCode != null">
  290. #{areaCode,jdbcType=VARCHAR},
  291. </if>
  292. <if test="addr != null">
  293. #{addr,jdbcType=VARCHAR},
  294. </if>
  295. <if test="startTime != null">
  296. #{startTime,jdbcType=DATE},
  297. </if>
  298. <if test="motto != null">
  299. #{motto,jdbcType=VARCHAR},
  300. </if>
  301. <if test="webSite != null">
  302. #{webSite,jdbcType=VARCHAR},
  303. </if>
  304. <if test="phone != null">
  305. #{phone,jdbcType=VARCHAR},
  306. </if>
  307. <if test="feature != null">
  308. #{feature,jdbcType=VARCHAR},
  309. </if>
  310. <if test="lng != null">
  311. #{lng,jdbcType=DECIMAL},
  312. </if>
  313. <if test="lat != null">
  314. #{lat,jdbcType=DECIMAL},
  315. </if>
  316. <if test="unitPrice ! =null">
  317. #{unitPrice},
  318. </if>
  319. <if test="salePrice">
  320. #{salePrice},
  321. </if>
  322. <if test="natureType != null">
  323. #{natureType,jdbcType=INTEGER},
  324. </if>
  325. <if test="natureCity != null">
  326. #{natureCity,jdbcType=INTEGER},
  327. </if>
  328. <if test="schoolDegree != null">
  329. #{schoolDegree,jdbcType=INTEGER},
  330. </if>
  331. <if test="enrolDegree != null">
  332. #{enrolDegree,jdbcType=INTEGER},
  333. </if>
  334. <if test="imgDegree != null">
  335. #{imgDegree,jdbcType=INTEGER},
  336. </if>
  337. <if test="status != null">
  338. #{status,jdbcType=TINYINT},
  339. </if>
  340. <if test="createId != null">
  341. #{createId,jdbcType=VARCHAR},
  342. </if>
  343. <if test="createDate != null">
  344. #{createDate,jdbcType=DATE},
  345. </if>
  346. <if test="updateId != null">
  347. #{updateId,jdbcType=VARCHAR},
  348. </if>
  349. <if test="updateDate != null">
  350. #{updateDate,jdbcType=DATE},
  351. </if>
  352. </trim>
  353. </insert>
  354. <update id="updateSelective" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
  355. UPDATE XQ_SCHOOL_INFO
  356. <set>
  357. <if test="name != null">
  358. NAME=#{name,jdbcType=VARCHAR},
  359. </if>
  360. <if test="nameSpell != null">
  361. NAME_SPELL=#{nameSpell,jdbcType=VARCHAR},
  362. </if>
  363. <if test="alias != null">
  364. ALIAS=#{alias,jdbcType=VARCHAR},
  365. </if>
  366. <if test="aliasSpell != null">
  367. ALIAS_SPELL=#{aliasSpell,jdbcType=VARCHAR},
  368. </if>
  369. <if test="type != null">
  370. TYPE=#{type,jdbcType=INTEGER},
  371. </if>
  372. <if test="type != null">
  373. AREA_ID=#{areaId,jdbcType=INTEGER},
  374. </if>
  375. <if test="cityCode != null">
  376. CITY_CODE=#{cityCode,jdbcType=VARCHAR},
  377. </if>
  378. <if test="areaCode != null">
  379. AREA_CODE=#{areaCode,jdbcType=VARCHAR},
  380. </if>
  381. <if test="addr != null">
  382. ADDR=#{addr,jdbcType=VARCHAR},
  383. </if>
  384. <if test="startTime != null">
  385. START_TIME=#{startTime,jdbcType=DATE},
  386. </if>
  387. <if test="motto != null">
  388. MOTTO=#{motto,jdbcType=VARCHAR},
  389. </if>
  390. <if test="webSite != null">
  391. WEB_SITE=#{webSite,jdbcType=VARCHAR},
  392. </if>
  393. <if test="phone != null">
  394. PHONE=#{phone,jdbcType=VARCHAR},
  395. </if>
  396. <if test="feature != null">
  397. FEATURE=#{feature,jdbcType=VARCHAR},
  398. </if>
  399. <if test="lng != null">
  400. LNG=#{lng,jdbcType=DECIMAL},
  401. </if>
  402. <if test="lat != null">
  403. LAT=#{lat,jdbcType=DECIMAL},
  404. </if>
  405. <if test="salePrice != null">
  406. UNIT_PRICE=#{unitPrice},
  407. </if>
  408. <if test="salePrice != null">
  409. SALE_PRICE=#{salePrice},
  410. </if>
  411. <if test="natureType != null">
  412. NATURE_TYPE=#{natureType,jdbcType=INTEGER},
  413. </if>
  414. <if test="natureCity != null">
  415. NATURE_CITY=#{natureCity,jdbcType=INTEGER},
  416. </if>
  417. <if test="schoolDegree != null">
  418. SCHOOL_DEGREE=#{schoolDegree,jdbcType=INTEGER},
  419. </if>
  420. <if test="enrolDegree != null">
  421. ENROL_DEGREE=#{enrolDegree,jdbcType=INTEGER},
  422. </if>
  423. <if test="imgDegree != null">
  424. IMG_DEGREE=#{imgDegree,jdbcType=INTEGER},
  425. </if>
  426. <if test="status != null">
  427. STATUS=#{status,jdbcType=TINYINT},
  428. </if>
  429. <if test="createId != null">
  430. CREATE_ID=#{createId,jdbcType=VARCHAR},
  431. </if>
  432. <if test="createDate != null">
  433. CREATE_DATE=#{createDate,jdbcType=DATE},
  434. </if>
  435. <if test="updateId != null">
  436. UPDATE_ID=#{updateId,jdbcType=VARCHAR},
  437. </if>
  438. <if test="updateDate != null">
  439. UPDATE_DATE=#{updateDate,jdbcType=DATE},
  440. </if>
  441. <if test="saleCount != null">
  442. SALE_COUNT=#{saleCount},
  443. </if>
  444. </set>
  445. WHERE
  446. ID = #{id,jdbcType=INTEGER}
  447. </update>
  448. <select id="selectList" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo" resultMap="SchoolInfo">
  449. SELECT
  450. <include refid="Base_Column_List" />
  451. FROM
  452. XQ_SCHOOL_INFO
  453. WHERE
  454. STATUS = 1
  455. <if test="areaId != null and areaId != null"> AND AREA_ID = #{areaId} </if>
  456. </select>
  457. <select id="selectSchoolInfoAll" resultMap="SchoolInfo">
  458. SELECT
  459. <include refid="Base_Column_List" />
  460. FROM
  461. XQ_SCHOOL_INFO
  462. WHERE
  463. STATUS = 1
  464. ORDER BY ID DESC
  465. </select>
  466. <select id="selectSchoolInfo" parameterType="com.jjshome.esf.common.model.SchoolInfoSearchModel" resultMap="SchoolInfo">
  467. SELECT
  468. i.*,
  469. yc.NAME as 'CITY_NAME',
  470. ya.NAME as 'AREA_NAME'
  471. FROM
  472. XQ_SCHOOL_INFO i
  473. LEFT JOIN YW_CITY_SETTING yc ON i.CITY_CODE = yc.CODE
  474. LEFT JOIN YW_CITY_SETTING ya ON i.AREA_CODE = ya.CODE
  475. WHERE
  476. i.STATUS = 1
  477. <if test="city != null and city != '' ">
  478. AND i.CITY_CODE=#{city}
  479. </if>
  480. <if test="area != null and area != '' ">
  481. AND i.AREA_CODE=#{area}
  482. </if>
  483. <if test="schoolId != null and schoolId != ''">
  484. AND i.ID=#{schoolId}
  485. </if>
  486. <if test="schoolName != null and schoolName != ''">
  487. AND i.NAME LIKE concat('%',#{schoolName},'%')
  488. </if>
  489. <if test="schoolDistrictId != null and schoolDistrictId != ''">
  490. AND i.AREA_ID=#{schoolDistrictId}
  491. </if>
  492. <if test="schoolType != null and schoolType != '' ">
  493. AND i.TYPE=#{schoolType}
  494. </if>
  495. <if test="key != null and key != '' ">
  496. AND (i.NAME LIKE CONCAT('%',#{key},'%') OR i.ALIAS LIKE CONCAT('%', #{key}, '%'))
  497. </if>
  498. /*priceType == 1:起售价 2:房源售均价*/
  499. <if test="priceType == 1">
  500. <if test="salePriceStart != null and salePriceStart != '' ">
  501. AND SALE_PRICE &gt;= #{salePriceStart}
  502. </if>
  503. <if test="salePriceEnd != null and salePriceEnd != '' ">
  504. AND SALE_PRICE &lt;= #{salePriceEnd}
  505. </if>
  506. </if>
  507. <if test="priceType == 2">
  508. <if test="salePriceStart != null and salePriceStart != '' ">
  509. AND UNIT_PRICE &gt;= #{salePriceStart}
  510. </if>
  511. <if test="salePriceEnd != null and salePriceEnd != '' ">
  512. AND UNIT_PRICE &lt;= #{salePriceEnd}
  513. </if>
  514. </if>
  515. <if test="perfectSituation == 1">
  516. AND SCHOOL_DEGREE = 100
  517. </if>
  518. <if test="perfectSituation == 2">
  519. AND SCHOOL_DEGREE &lt; 100
  520. </if>
  521. ORDER BY ID DESC
  522. </select>
  523. <select id="selectSchoolByNameAndCityAndArea" parameterType="java.util.Map" resultMap="SchoolInfo">
  524. SELECT
  525. <include refid="Base_Column_List" />
  526. FROM
  527. XQ_SCHOOL_INFO
  528. WHERE
  529. STATUS = 1
  530. AND NAME = #{name}
  531. AND CITY_CODE=#{city}
  532. AND AREA_CODE=#{area}
  533. AND TYPE = #{type}
  534. </select>
  535. <select id="selectAreaIdAndKeyWord" parameterType="java.util.Map" resultMap="SchoolInfo">
  536. SELECT
  537. XSI.*,CYCS.NAME AS 'CITY_NAME',AYCS.NAME AS 'AREA_NAME'
  538. FROM
  539. XQ_SCHOOL_INFO XSI
  540. LEFT JOIN YW_CITY_SETTING CYCS ON XSI.CITY_CODE = CYCS.CODE
  541. LEFT JOIN YW_CITY_SETTING AYCS ON XSI.AREA_CODE = AYCS. CODE
  542. WHERE
  543. 1=1
  544. <if test="areaId != null and areaId != ''">
  545. AND XSI.AREA_CODE=#{areaId}
  546. </if>
  547. <if test="key != null and key!=''">
  548. AND (XSI.NAME like CONCAT(#{key},'%' ) or XSI.NAME_SPELL like CONCAT(#{key},'%' ))
  549. </if>
  550. AND
  551. XSI.STATUS=1
  552. <if test="pageSize != null">
  553. limit #{pageSize}
  554. </if>
  555. </select>
  556. <select id="selectAreaIdList" parameterType="map" resultType="integer">
  557. SELECT DISTINCT AREA_ID FROM XQ_SCHOOL_INFO WHERE NAME LIKE CONCAT('%',#{schoolName},'%')
  558. </select>
  559. <select id="selectSchoolList" parameterType="map" resultMap="SchoolInfo">
  560. SELECT
  561. <include refid="Base_Column_List" />
  562. FROM
  563. XQ_SCHOOL_INFO
  564. WHERE
  565. STATUS = 1
  566. <if test="idList != null and idList.size gt 0">
  567. AND ID IN
  568. <foreach collection="idList" item="item" index="index" open="(" close=")" separator=",">
  569. #{item}
  570. </foreach>
  571. </if>
  572. <if test="areaId != null and areaId != null"> AND AREA_ID = #{areaId} </if>
  573. </select>
  574. </mapper>

TKmybatis的框架介绍和原理分析及Mybatis新特性的更多相关文章

  1. TKmybatis的框架介绍和原理分析及Mybatis新特性演示

    tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...

  2. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  3. AbstractQueuedSynchronizer的介绍和原理分析(转)

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  4. Servlet过滤器介绍之原理分析

    zhangjunhd 的BLOG     写留言去学院学习发消息 加友情链接进家园 加好友 博客统计信息 51CTO博客之星 用户名:zhangjunhd 文章数:110 评论数:858 访问量:19 ...

  5. AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  6. Hadoop数据管理介绍及原理分析

    Hadoop数据管理介绍及原理分析 最近2014大数据会议正如火如荼的进行着,Hadoop之父Doug Cutting也被邀参加,我有幸听了他的演讲并获得亲笔签名书一本,发现他竟然是左手写字,当然这个 ...

  7. SpringBoot系列之日志框架介绍及其原理简介

    SpringBoot系列之日志框架介绍及其原理简介 1.常用日志框架简介 市面上常用日志框架:JUL.JCL.jboss-logging.logback.log4j.log4j2.slf4j.etc. ...

  8. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性

    atitit.jQuery Validate验证框架详解与ati Validate 设计新特性 1. AtiValidate的目标1 2. 默的认校验规则1 2.1. 使用方式 1.metadata用 ...

  9. Spring框架介绍和原理

    SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

随机推荐

  1. 微信里去掉下拉select的边框

    <select name="gender" id="" class=" " style="  -webkit-appeara ...

  2. jQuery动画处理

    $(selector).hide(speed,callback);隐藏 $(selector).show(speed,callback);显示 $(selector).toggle(speed,cal ...

  3. iOS重签

    由于渠道推广需要,可能需要多个包做备份推广,区别是icon.游戏名称.登录logo.bundleid.签名证书.支付Consumables不同,其他游戏包体完全相同. 反复修改多次文件提交Jenkin ...

  4. delphi 7 生成 调用 bat文件的exe文件

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. webstorm 设置ES6语法支持以及添加vuejs开发配置

    参考文章:https://blog.csdn.net/diligentkong/article/details/75040651

  6. uploadify插件可选参数的详细介绍

    Uploadify 是一个JQuery插件,它协助你轻松简单的将一个或多个文件上传至你的网站.  它需要Flash控件和后台开发语言的支持,丰富的参数配置,同时也简单易用,让你轻松上手.      官 ...

  7. 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数

    查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅     ( ...

  8. redis简介以及安装

    redis作为开源的高性能的键值对数据库,本身是单线程的,性能虽然没有memcache高,但是也是性能跟memcache相差无几的,memcache是多线程的,但是redis本身功能更加强大,学习一下 ...

  9. super(Student,self).__init__()初始化的是什么东西?

    继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...

  10. 全国高校绿色计算大赛 预赛第二阶段(Python)

    第1关统计分数的麻烦 class Task: def get_lost_scores(self, scores): s = "" index = [1 for i in range ...