TKmybatis的框架介绍和原理分析及Mybatis新特性
tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具
实现对员工表的增删改查的代码 
java的dao层接口
- 
public interface WorkerMapper extends Mapper<Worker> {
 
- 
}
 
xml映射文件
- 
<?xml version="1.0" encoding="UTF-8"?>
 
- 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
- 
<mapper namespace="com.jjs.kaiwen.dao.WorkerMapper">
 
- 
  <resultMap id="BaseResultMap" type="com.jjs.kaiwen.model.Worker">
 
- 
    <!--
 
- 
      WARNING - @mbggenerated
 
- 
    -->
 
- 
    <id column="id" jdbcType="INTEGER" property="id" />
 
- 
    <result column="worker_id" jdbcType="VARCHAR" property="workerId" />
 
- 
    <result column="name" jdbcType="VARCHAR" property="name" />
 
- 
    <result column="org_id" jdbcType="INTEGER" property="orgId" />
 
- 
    <result column="status" jdbcType="VARCHAR" property="status" />
 
- 
    <result column="role_id" property="roleId" jdbcType="INTEGER" />
 
- 
  </resultMap>
 
- 
</mapper>
 
实体对象
- 
@Table(name = "worker")
 
- 
public class Worker {
 
- 
    @Id
 
- 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 
- 
    private Integer id;
 
- 
 
 
- 
    @Column(name = "worker_id")
 
- 
    private String workerId;
 
- 
 
 
- 
    private String name;
 
- 
 
 
- 
    @Column(name = "org_id")
 
- 
    private Integer orgId;
 
- 
 
 
- 
    private String status;
 
- 
 
 
- 
    @Column(name = "role_id")
 
- 
    private Integer roleId;
 
- 
 
 
- 
    // getters and setters ...
 
- 
    }
 
以上就是实现对Worker进行增删改查的所有代码,包括选择性更新、插入、删除等,所有的方法列表如下
以后对表字段的添加或修改只需要更改实体对象的注解,不需要修改xml映射文件,如将worker_id改成worker_no
- 
@Column(name = "worker_no")
 
- 
private String workerNo;
 
数据源的配置,只需要将org.mybatis.spring.mapper.MapperScannerConfigurer改成tk.mybatis.spring.mapper.MapperScannerConfigurer,然后加一个属性 
,也可不加,因为框架提供了默认实现
- 
    <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
 
- 
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
 
- 
        <property name="basePackage" value="com.jjs.zanbi.dao" />
 
- 
        <property name="properties">
 
- 
            <value>
 
- 
                mappers=tk.mybatis.mapper.common.Mapper
 
- 
            </value>
 
- 
        </property>
 
- 
    </bean>
 
用这个库之后写代码感觉在飞…….如果只是简单的了解此框架到这里就可以了,下面是对框架实现原理的分析
原理的简单分析
此框架为我们实现这些功能所有的改动都在Mapper层面,所有的Mapper都继承了tk.mybatis.mapper.common.Mapper
public interface WorkerMapper extends Mapper<Worker> {}
Mapper接口的声明如下,可以看到Mapper接口实现了所有常用的方法
- 
public interface Mapper<T> extends
 
- 
        BaseMapper<T>,
 
- 
        ExampleMapper<T>,
 
- 
        RowBoundsMapper<T>,
 
- 
        Marker {
 
- 
 
 
- 
}
 
看一下完整的UML图,太大了,可以用新窗口打开,放大之后再看 
这里选择一个接口:SelectOneMapper接口,对于源码进行简单分析,此接口声明如下:
- 
public interface SelectOneMapper<T> {
 
- 
 
 
- 
    /**
 
- 
     * 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
 
- 
     *
 
- 
     * @param record
 
- 
     * @return
 
- 
     */
 
- 
    @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
 
- 
    T selectOne(T record);
 
- 
 
 
- 
}
 
@SelectProvider是mybatis3之后提供的,用于灵活的设置sql来源,这里设置了服务提供类和方法,但这个库并没有直接用method指定的方法来返回sql,而是在运行时进行解析的,代码如下
- 
public class BaseSelectProvider extends MapperTemplate {
 
- 
 
 
- 
    public String selectOne(MappedStatement ms) {
 
- 
        Class<?> entityClass = getEntityClass(ms);
 
- 
        //修改返回值类型为实体类型
 
- 
        setResultType(ms, entityClass);
 
- 
        StringBuilder sql = new StringBuilder();
 
- 
        sql.append(SqlHelper.selectAllColumns(entityClass));
 
- 
        sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
 
- 
        sql.append(SqlHelper.whereAllIfColumns(entityClass, isNotEmpty()));
 
- 
        return sql.toString();
 
- 
    }
 
- 
}
 
到这里我们就大概知道了这个库为我们提供便利的原理了,总的来说就是这个库帮我们提供了对表的基本操作的sql,帮我们省了很多工作量,而且维护起来也很方便,否则我们的xml文件动不动就几百行甚至上千行
对源码的探索不能到这里停止,最起码要分析到与另一个框架的整合点
我们知道,mybatis的mapper接口是在启动的时候被框架以JdkProxy的形式封装了的,具体对应的类是MapperFactoryBean,这个类中有一个checkDaoConfig()方法,是从父类继承并重写了该方法,继承结构如下
MapperFactoryBean -> SqlSessionDaoSupport -> DaoSupport
这里的DaoSupport就是spring提供的Dao的抽象,代码如下
- 
public abstract class DaoSupport implements InitializingBean {
 
- 
 
 
- 
// spring 完成属性设置后会调用此方法
 
- 
    @Override
 
- 
    public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {
 
- 
        // 这里提供了接口供子类去实现
 
- 
        checkDaoConfig();
 
- 
 
 
- 
        // Let concrete implementations initialize themselves.
 
- 
        try {
 
- 
            initDao();
 
- 
        }
 
- 
        catch (Exception ex) {
 
- 
            throw new BeanInitializationException("Initialization of DAO failed", ex);
 
- 
        }
 
- 
    }
 
- 
 
 
- 
    protected abstract void checkDaoConfig() throws IllegalArgumentException;
 
- 
 
 
- 
    protected void initDao() throws Exception {
 
- 
    }
 
- 
 
 
- 
}
 
框架自定义的MapperFactoryBean重写了checkDaoConfig()方法,完成对所有sql语句的设置,代码如下
- 
    @Override
 
- 
    protected void checkDaoConfig() {
 
- 
        super.checkDaoConfig();
 
- 
        //通用Mapper
 
- 
        if (mapperHelper.isExtendCommonMapper(getObjectType())) {
 
- 
        //这里去处理该类所对应的MappedStatement,封装在helper类中处理
 
- 
            mapperHelper.processConfiguration(getSqlSession().getConfiguration(), getObjectType());
 
- 
        }
 
- 
    }
 
MapperHelper的processConfiguration方法如下
- 
    public void processConfiguration(Configuration configuration, Class<?> mapperInterface) {
 
- 
        String prefix;
 
- 
        if (mapperInterface != null) {
 
- 
            prefix = mapperInterface.getCanonicalName();
 
- 
        } else {
 
- 
            prefix = "";
 
- 
        }
 
- 
        for (Object object : new ArrayList<Object>(configuration.getMappedStatements())) {
 
- 
            if (object instanceof MappedStatement) {
 
- 
                MappedStatement ms = (MappedStatement) object;
 
- 
                //检查这个MappedStatement是否属于此映射对象
 
- 
                if (ms.getId().startsWith(prefix) && isMapperMethod(ms.getId())) {
 
- 
                    if (ms.getSqlSource() instanceof ProviderSqlSource) {
 
- 
                       //去设置该statement的sql语句
 
- 
                        setSqlSource(ms);
 
- 
                    }
 
- 
                }
 
- 
            }
 
- 
        }
 
- 
    }
 
设置sql的逻辑,提供了几种不同类型的sqlsource
- 
    public void setSqlSource(MappedStatement ms) throws Exception {
 
- 
        if (this.mapperClass == getMapperClass(ms.getId())) {
 
- 
            throw new RuntimeException("请不要配置或扫描通用Mapper接口类:" + this.mapperClass);
 
- 
        }
 
- 
        Method method = methodMap.get(getMethodName(ms));
 
- 
        try {
 
- 
            //第一种,直接操作ms,不需要返回值
 
- 
            if (method.getReturnType() == Void.TYPE) {
 
- 
                method.invoke(this, ms);
 
- 
            }
 
- 
            //第二种,返回SqlNode
 
- 
            else if (SqlNode.class.isAssignableFrom(method.getReturnType())) {
 
- 
                SqlNode sqlNode = (SqlNode) method.invoke(this, ms);
 
- 
                DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(ms.getConfiguration(), sqlNode);
 
- 
                setSqlSource(ms, dynamicSqlSource);
 
- 
            }
 
- 
            //第三种,返回xml形式的sql字符串
 
- 
            else if (String.class.equals(method.getReturnType())) {
 
- 
                String xmlSql = (String) method.invoke(this, ms);
 
- 
                SqlSource sqlSource = createSqlSource(ms, xmlSql);
 
- 
                //替换原有的SqlSource
 
- 
                setSqlSource(ms, sqlSource);
 
到这里整个sql的获取流程就分析完了,本人用这个库写过一个小项目,确实节省了开发的工作量,而且DAO层的结构更加清晰简洁了
关于mybatis新特性
从3.4.0开始,mybatis提供对外部表的alias引用方法,多表联合查询就方便多了,我们先看原始的方式是怎样做的
- 
select a.id,a.name,b.bid,b.bname .....
 
- 
from user a 
 
- 
left join room b 
 
原始的方式是将所有的表字段列出来,再来看用新特性怎样做
- 
select id="selectUsers" resultType="map">
 
- 
  select
 
- 
    <include refid="user_col_sql_id"><property name="alias" value="t1"/>,
 
- 
    <include refid="room_col_sql_id"><property name="alias" value="t2"/>
 
- 
  from user t1
 
- 
    left join room t2
 
- 
</select>
 
这里主要就是对基本的sql进行了复用,如果对表进行了修改只要在原始的sql节点修改就可以了,就算是5个表的联合查询,sql也是清晰易懂,维护起来会更轻松
新版本的mybatis对于对象映射也提供了更友好的方式,直接使用外部的ResultMap再加上查询语句中的别名就映射完成了
- 
    <resultMap id="workerResultMap" type="com.jjs.kaiwen.model.Worker" extends="BaseResultMap">
 
- 
        <association property="room" columnPrefix="b_"  resultMap="com.jjs.kaiwen.dao.OrgMapper.BaseResultMap"/>
 
- 
    </resultMap>
 
更进一步
敏锐的程序员可能会提出问题,如当多表查询的时候可能会存在字段名称相同的情况,这里的解决方案是给include添加另一个属性
- 
<include refid="user_col_sql_id_with_alias">
 
- 
<property name="alias" value="t"/>
 
- 
<property name="prefix" value="t_"/>
 
- 
</include>
 
包含prefix的sqlNode如下
- 
    <sql id="base_column_with_alias">
 
- 
        ${alias}.ID as ${prefix}ID,
 
- 
        ${alias}.WORKER_ID as ${prefix}WORKER_ID,
 
- 
        ${alias}.NAME as ${prefix}NAME,
 
- 
        ${alias}.ZB_ROLE_ID as ${prefix}ZB_ROLE_ID,
 
- 
        ${alias}.ORG_ID as ${prefix}ORG_ID,
 
- 
        ${alias}.STATUS as ${prefix}STATUS
 
- 
    </sql>
 
如果说觉得手动写包含alias和prefix的字段麻烦,可以用,mybatis代码生成器的插件的方式实现,我自己写了一个生成器的插件,可以代码再这里,仅供参考
通用Service类
- 
/**
 
- 
 * Created by Kaiwen
 
- 
 */
 
- 
@Service
 
- 
public abstract class CommonServiceImpl<T,PK extends Serializable> implements CommonService<T,PK> {
 
- 
    /**
 
- 
     * 泛型注入
 
- 
     */
 
- 
    @Autowired
 
- 
    private Mapper<T> mapper;
 
- 
 
 
- 
    public T selectByPrimaryKey(PK entityId) {
 
- 
 
 
- 
        return mapper.selectByPrimaryKey(entityId);
 
- 
    }
 
- 
 
 
- 
    public int deleteByPrimaryKey(PK entityId) {
 
- 
        return mapper.deleteByPrimaryKey(entityId);
 
- 
    }
 
- 
 
 
- 
    public int insert(T record) {
 
- 
        return mapper.insert(record);
 
- 
    }
 
- 
 
 
- 
    public int insertSelective(T record) {
 
- 
        return mapper.insertSelective(record);
 
- 
    }
 
- 
 
 
- 
    public int updateByPrimaryKeySelective(T record) {
 
- 
        return mapper.updateByPrimaryKeySelective(record);
 
- 
    }
 
- 
 
 
- 
    public int updateByPrimaryKey(T record) {
 
- 
        return mapper.updateByPrimaryKey(record);
 
- 
    }
 
- 
 
 
- 
    public List<T> selectByExample(Example example) {
 
- 
        return mapper.selectByExample(example);
 
- 
    }
 
- 
}
 
注入方式区别
- 
    <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
 
- 
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
 
- 
        <property name="basePackage" value="com.jjshome.esf.core.dao.school" />
 
- 
        <property name="properties">
 
- 
            <value>
 
- 
                mappers=tk.mybatis.mapper.common.Mapper
 
- 
            </value>
 
- 
        </property>
 
- 
    </bean>
 
- 
 
 
- 
 
 
- 
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
 
- 
        <property name="basePackage" value="com.jjshome.esf.core.dao.community,com.jjshome.esf.core.dao.hsl"/>
 
- 
    </bean>
 
实体类
- 
package com.jjshome.esf.common.entity.school;
 
- 
 
 
- 
import java.util.Date;
 
- 
import javax.persistence.*;
 
- 
 
 
- 
@Table(name = "XQ_SCHOOL_AREA")
 
- 
public class SchoolArea {
 
- 
    /**
 
- 
     * 主键ID
 
- 
     */
 
- 
    @Id
 
- 
    @Column(name = "ID")
 
- 
    private Integer id;
 
- 
 
 
- 
    /**
 
- 
     * 城市编码
 
- 
     */
 
- 
    @Column(name = "CITY_CODE")
 
- 
    private String cityCode;
 
- 
 
 
- 
    /**
 
- 
     * 学区名称
 
- 
     */
 
- 
    @Column(name = "NAME")
 
- 
    private String name;
 
- 
 
 
- 
    /**
 
- 
     * 学区名称拼音
 
- 
     */
 
- 
    @Column(name = "NAME_SPELL")
 
- 
    private String nameSpell;
 
- 
 
 
- 
    /**
 
- 
     * 状态,1:正常,0:删除
 
- 
     */
 
- 
    @Column(name = "STATUS")
 
- 
    private Byte status;
 
- 
 
 
- 
    /**
 
- 
     * 添加人
 
- 
     */
 
- 
    @Column(name = "CREATE_ID")
 
- 
    private String createId;
 
- 
 
 
- 
 
 
- 
    @Transient
 
- 
    private Integer primaryCount; //小学数量
 
- 
    @Transient
 
- 
    private Integer middleCount; //初中数量
 
- 
    @Transient
 
- 
    private Integer highCount;//高中数量
 
TK mybatis Mapper文件内容
- 
<?xml version="1.0" encoding="UTF-8" ?>
 
- 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 
- 
<mapper namespace="com.jjshome.esf.core.dao.school.ISchoolAreaDAO" >
 
- 
  <resultMap id="BaseResultMap" type="com.jjshome.esf.common.entity.school.SchoolArea" >
 
- 
    <!--
 
- 
      WARNING - @mbggenerated
 
- 
    -->
 
- 
    <id column="ID" property="id" jdbcType="INTEGER" />
 
- 
    <result column="CITY_CODE" property="cityCode" jdbcType="VARCHAR" />
 
- 
    <result column="NAME" property="name" jdbcType="VARCHAR" />
 
- 
    <result column="NAME_SPELL" property="nameSpell" jdbcType="VARCHAR" />
 
- 
    <result column="STATUS" property="status" jdbcType="TINYINT" />
 
- 
    <result column="CREATE_ID" property="createId" jdbcType="VARCHAR" />
 
- 
    <result column="CREATE_DATE" property="createDate" jdbcType="TIMESTAMP" />
 
- 
    <result column="UPDATE_ID" property="updateId" jdbcType="VARCHAR" />
 
- 
    <result column="UPDATE_DATE" property="updateDate" jdbcType="TIMESTAMP" />
 
- 
    <result column="CITY_NAME" property="cityName"/>
 
- 
    <result column="PRIMARY_COUNT" property="primaryCount"/>
 
- 
    <result column="MIDDLE_COUNT" property="middleCount"/>
 
- 
    <result column="HIGH_COUNT" property="highCount"/>
 
- 
  </resultMap>
 
- 
 
 
- 
    <resultMap id="SchoolDetailArea" type="com.jjshome.esf.common.entity.school.SchoolAreaDetail"
 
- 
               extends="com.jjshome.esf.core.dao.school.ISchoolInfoDAO.SchoolInfo">
 
- 
        <result column="SCHOOL_AREA_NAME" property="schoolAreaName"/>
 
- 
    </resultMap>
 
- 
 
 
- 
    <select id="selectByPage" parameterType="map" resultMap="BaseResultMap">
 
- 
 
 
- 
        SELECT A.*, C.NAME AS CITY_NAME,
 
- 
        (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='553' AND B.STATUS = 1 ) AS PRIMARY_COUNT,
 
- 
        (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='554' AND B.STATUS = 1 ) AS MIDDLE_COUNT,
 
- 
        (SELECT COUNT(*) FROM XQ_SCHOOL_INFO B WHERE A.ID=B.AREA_ID AND B.TYPE='555' AND B.STATUS = 1 ) AS HIGH_COUNT
 
- 
        FROM XQ_SCHOOL_AREA A
 
- 
        LEFT JOIN YW_CITY_SETTING C ON A.CITY_CODE = C.CODE
 
- 
        <where>
 
- 
            <if test="name != null and name != '' "> A.NAME LIKE CONCAT('%',#{NAME},'%')  </if>
 
- 
            <if test="areaCityCode != null and areaCityCode != '' "> A.CITY_CODE = #{areaCityCode}  </if>
 
- 
            <if test="keywords != null and keywords != '' ">
 
- 
                ( A.NAME LIKE CONCAT('%',#{keywords},'%')
 
- 
                )
 
- 
            </if>
 
- 
        </where>
 
- 
    </select>
 
- 
 
 
- 
 
 
- 
    <select id="selectAreaIdAndKeyWord" parameterType="java.util.Map" resultMap="BaseResultMap">
 
- 
        SELECT
 
- 
        *
 
- 
        FROM
 
- 
        XQ_SCHOOL_AREA
 
- 
        WHERE
 
- 
        1=1
 
- 
        <if test="cityId != null">
 
- 
            AND CITY_CODE=#{cityId}
 
- 
        </if>
 
- 
        <if test="key != null and key!=''">
 
- 
            AND (NAME like CONCAT(#{key},'%' ) or NAME_SPELL like CONCAT(#{key},'%' ))
 
- 
        </if>
 
- 
        AND
 
- 
        STATUS=1
 
- 
        <if test="pageSize != null">
 
- 
            limit #{pageSize}
 
- 
        </if>
 
- 
    </select>
 
- 
 
 
- 
 
 
- 
    <!--查询学区详情列表-->
 
- 
    <select id="selectAreaDetailByPage" parameterType="map" resultMap="SchoolDetailArea">
 
- 
 
 
- 
        SELECT A.* ,B.NAME AS SCHOOL_AREA_NAME ,C.NAME AS CITY_NAME,D.NAME AS AREA_NAME FROM XQ_SCHOOL_INFO A
 
- 
        LEFT JOIN XQ_SCHOOL_AREA B ON A.AREA_ID = B.ID
 
- 
        LEFT JOIN YW_CITY_SETTING C ON A.CITY_CODE = C.CODE
 
- 
        LEFT JOIN YW_CITY_SETTING D ON A.AREA_CODE = D.CODE
 
- 
 
 
- 
        WHERE A.STATUS = 1 AND B.STATUS =1
 
- 
        <if test="areaId != null and areaId.length() > 0">  AND A.AREA_ID = #{areaId} </if>
 
- 
        <if test="typeList != null and typeList.size > 0">
 
- 
            AND
 
- 
            A.TYPE IN
 
- 
            <foreach collection="typeList"  item="item" index="index" open="(" close=")" separator=",">
 
- 
                #{item}
 
- 
            </foreach>
 
- 
        </if>
 
- 
        <if test="name != null and name != '' "> AND   A.NAME LIKE CONCAT('%',#{name},'%')  </if>
 
- 
    </select>
 
- 
 
 
- 
</mapper>
 
普通mybatisMapper文件
- 
<?xml version="1.0" encoding="UTF-8" ?>
 
- 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 
- 
<mapper namespace="com.jjshome.esf.core.dao.school.ISchoolInfoDAO">
 
- 
    <resultMap id="SchoolInfo" type="com.jjshome.esf.common.entity.school.SchoolInfo">
 
- 
        <id column="ID" property="id"/>
 
- 
        <result column="NAME" property="name"/>
 
- 
        <result column="NAME_SPELL" property="nameSpell"/>
 
- 
        <result column="ALIAS" property="alias"/>
 
- 
        <result column="ALIAS_SPELL" property="aliasSpell"/>
 
- 
        <result column="TYPE" property="type" typeHandler="com.jjshome.esf.core.component.handler.DictValueTypeHandler"/>
 
- 
        <result column="AREA_ID" property="areaId"/>
 
- 
        <result column="CITY_CODE" property="cityCode"/>
 
- 
        <result column="AREA_CODE" property="areaCode"/>
 
- 
        <result column="ADDR" property="addr"/>
 
- 
        <result column="START_TIME" property="startTime"/>
 
- 
        <result column="MOTTO" property="motto"/>
 
- 
        <result column="WEB_SITE" property="webSite"/>
 
- 
        <result column="PHONE" property="phone"/>
 
- 
        <result column="FEATURE" property="feature" typeHandler="com.jjshome.esf.core.component.handler.DictValueListTypeHandler"/>
 
- 
        <result column="LNG" property="lng"/>
 
- 
        <result column="LAT" property="lat"/>
 
- 
        <result column="UNIT_PRICE" property="unitPrice"/>
 
- 
        <result column="SALE_PRICE" property="salePrice"/>
 
- 
        <result column="NATURE_TYPE" property="natureType" typeHandler="com.jjshome.esf.core.component.handler.DictValueTypeHandler"/>
 
- 
        <result column="NATURE_CITY" property="natureCity" typeHandler="com.jjshome.esf.core.component.handler.DictValueTypeHandler"/>
 
- 
        <result column="SCHOOL_DEGREE" property="schoolDegree"/>
 
- 
        <result column="ENROL_DEGREE" property="enrolDegree"/>
 
- 
        <result column="IMG_DEGREE" property="imgDegree"/>
 
- 
        <result column="STATUS" property="status"/>
 
- 
        <result column="CREATE_ID" property="createId"/>
 
- 
        <result column="CREATE_DATE" property="createDate"/>
 
- 
        <result column="UPDATE_ID" property="updateId"/>
 
- 
        <result column="UPDATE_DATE" property="updateDate"/>
 
- 
 
 
- 
        <result column="CITY_NAME" property="cityName" />
 
- 
        <result column="AREA_NAME" property="areaName" />
 
- 
        <result column="SCHOOL_DISTRICT_NAME" property="schoolDistrictName" />
 
- 
        <result column="SALE_COUNT" property="saleCount" />
 
- 
    </resultMap>
 
- 
 
 
- 
    <sql id="Base_Column_List">
 
- 
        ID,
 
- 
        NAME,
 
- 
        NAME_SPELL,
 
- 
        ALIAS,
 
- 
        ALIAS_SPELL,
 
- 
        TYPE,
 
- 
        AREA_ID,
 
- 
        CITY_CODE,
 
- 
        AREA_CODE,
 
- 
        ADDR,
 
- 
        START_TIME,
 
- 
        MOTTO,
 
- 
        WEB_SITE,
 
- 
        PHONE,
 
- 
        FEATURE,
 
- 
        LNG,
 
- 
        LAT,
 
- 
        UNIT_PRICE,
 
- 
        SALE_PRICE,
 
- 
        NATURE_TYPE,
 
- 
        NATURE_CITY,
 
- 
        SCHOOL_DEGREE,
 
- 
        ENROL_DEGREE,
 
- 
        IMG_DEGREE,
 
- 
        STATUS,
 
- 
        CREATE_ID,
 
- 
        CREATE_DATE,
 
- 
        UPDATE_ID,
 
- 
        UPDATE_DATE,
 
- 
        SALE_COUNT,
 
- 
        SALE_COUNT
 
- 
    </sql>
 
- 
 
 
- 
    <select id="selectById" resultMap="SchoolInfo" parameterType="java.lang.Integer">
 
- 
        SELECT
 
- 
            i.*,
 
- 
            yc.NAME as 'CITY_NAME',
 
- 
            ya.NAME as 'AREA_NAME',
 
- 
            xq.NAME as 'SCHOOL_DISTRICT_NAME'
 
- 
        FROM
 
- 
            XQ_SCHOOL_INFO i
 
- 
            LEFT JOIN YW_CITY_SETTING yc ON i.CITY_CODE = yc.CODE
 
- 
            LEFT JOIN YW_CITY_SETTING ya ON i.AREA_CODE = ya.CODE
 
- 
            LEFT JOIN XQ_SCHOOL_AREA xq ON i.AREA_ID = xq.ID
 
- 
        WHERE
 
- 
            i.ID = #{id,jdbcType=INTEGER}
 
- 
    </select>
 
- 
 
 
- 
    <delete id="deleteById" parameterType="java.util.Map">
 
- 
        UPDATE
 
- 
            XQ_SCHOOL_INFO
 
- 
        SET
 
- 
            STATUS = 0,
 
- 
            UPDATE_ID = #{updateId},
 
- 
            UPDATE_DATE = NOW()
 
- 
        WHERE
 
- 
            ID = #{id,jdbcType=INTEGER}
 
- 
    </delete>
 
- 
 
 
- 
    <delete id="batchDeleteByIds" parameterType="java.util.Map">
 
- 
        UPDATE
 
- 
            XQ_SCHOOL_INFO
 
- 
        SET
 
- 
            STATUS = 0,
 
- 
            UPDATE_ID = #{updateId},
 
- 
            UPDATE_DATE = NOW()
 
- 
        WHERE
 
- 
        ID IN (${ids})
 
- 
    </delete>
 
- 
 
 
- 
    <update id="deleteAreaRelation" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
 
- 
        update XQ_SCHOOL_INFO
 
- 
            SET AREA_ID = NULL,
 
- 
            UPDATE_DATE = NOW()
 
- 
        WHERE
 
- 
        ID = #{id}
 
- 
    </update>
 
- 
 
 
- 
    <insert id="insert" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
 
- 
        <selectKey resultType="Integer" keyProperty="id">
 
- 
            SELECT LAST_INSERT_ID()
 
- 
        </selectKey>
 
- 
        INSERT INTO XQ_SCHOOL_INFO
 
- 
            (NAME,
 
- 
            NAME_SPELL,
 
- 
            ALIAS,
 
- 
            ALIAS_SPELL,
 
- 
            TYPE,
 
- 
            AREA_ID,
 
- 
            CITY_CODE,
 
- 
            AREA_CODE,
 
- 
            ADDR,
 
- 
            START_TIME,
 
- 
            MOTTO,
 
- 
            WEB_SITE,
 
- 
            PHONE,
 
- 
            FEATURE,
 
- 
            LNG,
 
- 
            LAT,
 
- 
            UNIT_PRICE,
 
- 
            SALE_PRICE,
 
- 
            NATURE_TYPE,
 
- 
            NATURE_CITY,
 
- 
            SCHOOL_DEGREE,
 
- 
            ENROL_DEGREE,
 
- 
            IMG_DEGREE,
 
- 
            STATUS,
 
- 
            CREATE_ID,
 
- 
            CREATE_DATE,
 
- 
            UPDATE_ID,
 
- 
            UPDATE_DATE)
 
- 
        VALUES
 
- 
            (#{name,jdbcType=VARCHAR},
 
- 
            #{nameSpell,jdbcType=VARCHAR},
 
- 
            #{alias,jdbcType=VARCHAR},
 
- 
            #{aliasSpell,jdbcType=VARCHAR},
 
- 
            #{type,jdbcType=INTEGER},
 
- 
            #{areaId,jdbcType=INTEGER},
 
- 
            #{cityCode,jdbcType=VARCHAR},
 
- 
            #{areaCode,jdbcType=VARCHAR},
 
- 
            #{addr,jdbcType=VARCHAR},
 
- 
            #{startTime,jdbcType=DATE},
 
- 
            #{motto,jdbcType=VARCHAR},
 
- 
            #{webSite,jdbcType=VARCHAR},
 
- 
            #{phone,jdbcType=VARCHAR},
 
- 
            #{feature,jdbcType=VARCHAR},
 
- 
            #{lng,jdbcType=DECIMAL},
 
- 
            #{lat,jdbcType=DECIMAL},
 
- 
            #{unitPrice},
 
- 
            #{salePrice},
 
- 
            #{natureType,jdbcType=INTEGER},
 
- 
            #{natureCity,jdbcType=INTEGER},
 
- 
            #{schoolDegree,jdbcType=INTEGER},
 
- 
            #{enrolDegree,jdbcType=INTEGER},
 
- 
            #{imgDegree,jdbcType=INTEGER},
 
- 
            #{status,jdbcType=TINYINT},
 
- 
            #{createId,jdbcType=VARCHAR},
 
- 
            #{createDate,jdbcType=DATE},
 
- 
            #{updateId,jdbcType=VARCHAR},
 
- 
            #{updateDate,jdbcType=DATE})
 
- 
    </insert>
 
- 
    <insert id="insertSelective" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
 
- 
        <selectKey resultType="Integer" keyProperty="id">
 
- 
            SELECT LAST_INSERT_ID()
 
- 
        </selectKey>
 
- 
        INSERT INTO XQ_SCHOOL_INFO
 
- 
        <trim prefix="(" suffix=")" suffixOverrides=",">
 
- 
            <if test="name != null">
 
- 
                NAME,
 
- 
            </if>
 
- 
            <if test="nameSpell != null">
 
- 
                NAME_SPELL,
 
- 
            </if>
 
- 
            <if test="alias != null">
 
- 
                ALIAS,
 
- 
            </if>
 
- 
            <if test="aliasSpell != null">
 
- 
                ALIAS_SPELL,
 
- 
            </if>
 
- 
            <if test="type != null">
 
- 
                TYPE,
 
- 
            </if>
 
- 
            <if test="areaId != null">
 
- 
                AREA_ID,
 
- 
            </if>
 
- 
            <if test="cityCode != null">
 
- 
                CITY_CODE,
 
- 
            </if>
 
- 
            <if test="areaCode != null">
 
- 
                AREA_CODE,
 
- 
            </if>
 
- 
            <if test="addr != null">
 
- 
                ADDR,
 
- 
            </if>
 
- 
            <if test="startTime != null">
 
- 
                START_TIME,
 
- 
            </if>
 
- 
            <if test="motto != null">
 
- 
                MOTTO,
 
- 
            </if>
 
- 
            <if test="webSite != null">
 
- 
                WEB_SITE,
 
- 
            </if>
 
- 
            <if test="phone != null">
 
- 
                PHONE,
 
- 
            </if>
 
- 
            <if test="feature != null">
 
- 
                FEATURE,
 
- 
            </if>
 
- 
            <if test="lng != null">
 
- 
                LNG,
 
- 
            </if>
 
- 
            <if test="lat != null">
 
- 
                LAT,
 
- 
            </if>
 
- 
            <if test="UNIT_PRICE != null">
 
- 
                UNIT_PRICE,
 
- 
            </if>
 
- 
            <if test="SALE_PRICE != null ">
 
- 
                SALE_PRICE,
 
- 
            </if>
 
- 
            <if test="natureType != null">
 
- 
                NATURE_TYPE,
 
- 
            </if>
 
- 
            <if test="natureCity != null">
 
- 
                NATURE_CITY,
 
- 
            </if>
 
- 
            <if test="schoolDegree != null">
 
- 
                SCHOOL_DEGREE,
 
- 
            </if>
 
- 
            <if test="enrolDegree != null">
 
- 
                ENROL_DEGREE,
 
- 
            </if>
 
- 
            <if test="imgDegree != null">
 
- 
                IMG_DEGREE,
 
- 
            </if>
 
- 
            <if test="status != null">
 
- 
                STATUS,
 
- 
            </if>
 
- 
            <if test="createId != null">
 
- 
                CREATE_ID,
 
- 
            </if>
 
- 
            <if test="createDate != null">
 
- 
                CREATE_DATE,
 
- 
            </if>
 
- 
            <if test="updateId != null">
 
- 
                UPDATE_ID,
 
- 
            </if>
 
- 
            <if test="updateDate != null">
 
- 
                UPDATE_DATE,
 
- 
            </if>
 
- 
        </trim>
 
- 
        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
 
- 
            <if test="name != null">
 
- 
                #{name,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="nameSpell != null">
 
- 
                #{nameSpell,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="alias != null">
 
- 
                #{alias,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="aliasSpell != null">
 
- 
                #{aliasSpell,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="type != null">
 
- 
                #{type,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="areaId != null">
 
- 
                #{areaId,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="cityCode != null">
 
- 
                #{cityCode,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="areaCode != null">
 
- 
                #{areaCode,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="addr != null">
 
- 
                #{addr,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="startTime != null">
 
- 
                #{startTime,jdbcType=DATE},
 
- 
            </if>
 
- 
            <if test="motto != null">
 
- 
                #{motto,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="webSite != null">
 
- 
                #{webSite,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="phone != null">
 
- 
                #{phone,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="feature != null">
 
- 
                #{feature,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="lng != null">
 
- 
                #{lng,jdbcType=DECIMAL},
 
- 
            </if>
 
- 
            <if test="lat != null">
 
- 
                #{lat,jdbcType=DECIMAL},
 
- 
            </if>
 
- 
            <if test="unitPrice ! =null">
 
- 
                #{unitPrice},
 
- 
            </if>
 
- 
            <if test="salePrice">
 
- 
                #{salePrice},
 
- 
            </if>
 
- 
            <if test="natureType != null">
 
- 
                #{natureType,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="natureCity != null">
 
- 
                #{natureCity,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="schoolDegree != null">
 
- 
                #{schoolDegree,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="enrolDegree != null">
 
- 
                #{enrolDegree,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="imgDegree != null">
 
- 
                #{imgDegree,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="status != null">
 
- 
                #{status,jdbcType=TINYINT},
 
- 
            </if>
 
- 
            <if test="createId != null">
 
- 
                #{createId,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="createDate != null">
 
- 
                #{createDate,jdbcType=DATE},
 
- 
            </if>
 
- 
            <if test="updateId != null">
 
- 
                #{updateId,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="updateDate != null">
 
- 
                #{updateDate,jdbcType=DATE},
 
- 
            </if>
 
- 
        </trim>
 
- 
    </insert>
 
- 
    <update id="updateSelective" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo">
 
- 
        UPDATE XQ_SCHOOL_INFO
 
- 
        <set>
 
- 
            <if test="name != null">
 
- 
                NAME=#{name,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="nameSpell != null">
 
- 
                NAME_SPELL=#{nameSpell,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="alias != null">
 
- 
                ALIAS=#{alias,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="aliasSpell != null">
 
- 
                ALIAS_SPELL=#{aliasSpell,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="type != null">
 
- 
                TYPE=#{type,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="type != null">
 
- 
                AREA_ID=#{areaId,jdbcType=INTEGER},
 
- 
            </if>
 
- 
 
 
- 
            <if test="cityCode != null">
 
- 
                CITY_CODE=#{cityCode,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="areaCode != null">
 
- 
                AREA_CODE=#{areaCode,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="addr != null">
 
- 
                ADDR=#{addr,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="startTime != null">
 
- 
                START_TIME=#{startTime,jdbcType=DATE},
 
- 
            </if>
 
- 
            <if test="motto != null">
 
- 
                MOTTO=#{motto,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="webSite != null">
 
- 
                WEB_SITE=#{webSite,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="phone != null">
 
- 
                PHONE=#{phone,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="feature != null">
 
- 
                FEATURE=#{feature,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="lng != null">
 
- 
                LNG=#{lng,jdbcType=DECIMAL},
 
- 
            </if>
 
- 
            <if test="lat != null">
 
- 
                LAT=#{lat,jdbcType=DECIMAL},
 
- 
            </if>
 
- 
            <if test="salePrice != null">
 
- 
                UNIT_PRICE=#{unitPrice},
 
- 
            </if>
 
- 
            <if test="salePrice != null">
 
- 
                SALE_PRICE=#{salePrice},
 
- 
            </if>
 
- 
            <if test="natureType != null">
 
- 
                NATURE_TYPE=#{natureType,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="natureCity != null">
 
- 
                NATURE_CITY=#{natureCity,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="schoolDegree != null">
 
- 
                SCHOOL_DEGREE=#{schoolDegree,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="enrolDegree != null">
 
- 
                ENROL_DEGREE=#{enrolDegree,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="imgDegree != null">
 
- 
                IMG_DEGREE=#{imgDegree,jdbcType=INTEGER},
 
- 
            </if>
 
- 
            <if test="status != null">
 
- 
                STATUS=#{status,jdbcType=TINYINT},
 
- 
            </if>
 
- 
            <if test="createId != null">
 
- 
                CREATE_ID=#{createId,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="createDate != null">
 
- 
                CREATE_DATE=#{createDate,jdbcType=DATE},
 
- 
            </if>
 
- 
            <if test="updateId != null">
 
- 
                UPDATE_ID=#{updateId,jdbcType=VARCHAR},
 
- 
            </if>
 
- 
            <if test="updateDate != null">
 
- 
                UPDATE_DATE=#{updateDate,jdbcType=DATE},
 
- 
            </if>
 
- 
            <if test="saleCount != null">
 
- 
                SALE_COUNT=#{saleCount},
 
- 
            </if>
 
- 
        </set>
 
- 
        WHERE
 
- 
            ID = #{id,jdbcType=INTEGER}
 
- 
    </update>
 
- 
    <select id="selectList" parameterType="com.jjshome.esf.common.entity.school.SchoolInfo" resultMap="SchoolInfo">
 
- 
        SELECT
 
- 
            <include refid="Base_Column_List" />
 
- 
        FROM
 
- 
            XQ_SCHOOL_INFO
 
- 
        WHERE
 
- 
            STATUS = 1
 
- 
            <if test="areaId != null and areaId != null"> AND AREA_ID = #{areaId} </if>
 
- 
 
 
- 
    </select>
 
- 
 
 
- 
    <select id="selectSchoolInfoAll" resultMap="SchoolInfo">
 
- 
        SELECT
 
- 
            <include refid="Base_Column_List" />
 
- 
        FROM
 
- 
            XQ_SCHOOL_INFO
 
- 
        WHERE
 
- 
            STATUS = 1
 
- 
        ORDER BY ID DESC
 
- 
    </select>
 
- 
 
 
- 
    <select id="selectSchoolInfo" parameterType="com.jjshome.esf.common.model.SchoolInfoSearchModel" resultMap="SchoolInfo">
 
- 
        SELECT
 
- 
            i.*,
 
- 
            yc.NAME as 'CITY_NAME',
 
- 
            ya.NAME as 'AREA_NAME'
 
- 
        FROM
 
- 
            XQ_SCHOOL_INFO i
 
- 
            LEFT JOIN YW_CITY_SETTING yc ON i.CITY_CODE = yc.CODE
 
- 
            LEFT JOIN YW_CITY_SETTING ya ON i.AREA_CODE = ya.CODE
 
- 
        WHERE
 
- 
            i.STATUS = 1
 
- 
        <if test="city != null and city != '' ">
 
- 
            AND i.CITY_CODE=#{city}
 
- 
        </if>
 
- 
        <if test="area != null and area != '' ">
 
- 
            AND i.AREA_CODE=#{area}
 
- 
        </if>
 
- 
        <if test="schoolId != null and schoolId != ''">
 
- 
            AND i.ID=#{schoolId}
 
- 
        </if>
 
- 
 
 
- 
        <if test="schoolName != null and schoolName != ''">
 
- 
            AND i.NAME LIKE concat('%',#{schoolName},'%')
 
- 
        </if>
 
- 
 
 
- 
        <if test="schoolDistrictId != null and schoolDistrictId != ''">
 
- 
            AND i.AREA_ID=#{schoolDistrictId}
 
- 
        </if>
 
- 
        <if test="schoolType != null and schoolType != '' ">
 
- 
            AND i.TYPE=#{schoolType}
 
- 
        </if>
 
- 
        <if test="key != null and key != '' ">
 
- 
            AND (i.NAME LIKE CONCAT('%',#{key},'%') OR  i.ALIAS LIKE CONCAT('%', #{key}, '%'))
 
- 
        </if>
 
- 
        /*priceType == 1:起售价 2:房源售均价*/
 
- 
        <if test="priceType == 1">
 
- 
            <if test="salePriceStart != null and salePriceStart != '' ">
 
- 
                AND SALE_PRICE >= #{salePriceStart}
 
- 
            </if>
 
- 
            <if test="salePriceEnd != null and salePriceEnd != '' ">
 
- 
                AND SALE_PRICE <= #{salePriceEnd}
 
- 
            </if>
 
- 
        </if>
 
- 
        <if test="priceType == 2">
 
- 
            <if test="salePriceStart != null and salePriceStart != '' ">
 
- 
                AND UNIT_PRICE >= #{salePriceStart}
 
- 
            </if>
 
- 
            <if test="salePriceEnd != null and salePriceEnd != '' ">
 
- 
                AND UNIT_PRICE <= #{salePriceEnd}
 
- 
            </if>
 
- 
        </if>
 
- 
        <if test="perfectSituation == 1">
 
- 
            AND SCHOOL_DEGREE = 100
 
- 
        </if>
 
- 
        <if test="perfectSituation == 2">
 
- 
            AND SCHOOL_DEGREE < 100
 
- 
        </if>
 
- 
        ORDER BY ID DESC
 
- 
 
 
- 
    </select>
 
- 
 
 
- 
    <select id="selectSchoolByNameAndCityAndArea" parameterType="java.util.Map" resultMap="SchoolInfo">
 
- 
        SELECT
 
- 
            <include refid="Base_Column_List" />
 
- 
        FROM
 
- 
            XQ_SCHOOL_INFO
 
- 
        WHERE
 
- 
            STATUS = 1
 
- 
        AND NAME = #{name}
 
- 
        AND CITY_CODE=#{city}
 
- 
        AND AREA_CODE=#{area}
 
- 
        AND TYPE = #{type}
 
- 
    </select>
 
- 
 
 
- 
    <select id="selectAreaIdAndKeyWord" parameterType="java.util.Map" resultMap="SchoolInfo">
 
- 
        SELECT
 
- 
        XSI.*,CYCS.NAME AS  'CITY_NAME',AYCS.NAME AS  'AREA_NAME'
 
- 
        FROM
 
- 
            XQ_SCHOOL_INFO XSI
 
- 
            LEFT JOIN YW_CITY_SETTING CYCS ON  XSI.CITY_CODE = CYCS.CODE
 
- 
            LEFT JOIN YW_CITY_SETTING AYCS ON XSI.AREA_CODE = AYCS. CODE
 
- 
        WHERE
 
- 
            1=1
 
- 
        <if test="areaId != null and areaId != ''">
 
- 
            AND XSI.AREA_CODE=#{areaId}
 
- 
        </if>
 
- 
        <if test="key != null and key!=''">
 
- 
            AND (XSI.NAME like CONCAT(#{key},'%' ) or XSI.NAME_SPELL like CONCAT(#{key},'%' ))
 
- 
        </if>
 
- 
        AND
 
- 
        XSI.STATUS=1
 
- 
        <if test="pageSize != null">
 
- 
            limit #{pageSize}
 
- 
        </if>
 
- 
    </select>
 
- 
 
 
- 
 
 
- 
    <select id="selectAreaIdList" parameterType="map" resultType="integer">
 
- 
        SELECT DISTINCT AREA_ID FROM XQ_SCHOOL_INFO WHERE NAME LIKE CONCAT('%',#{schoolName},'%')
 
- 
    </select>
 
- 
 
 
- 
 
 
- 
    <select id="selectSchoolList" parameterType="map" resultMap="SchoolInfo">
 
- 
        SELECT
 
- 
        <include refid="Base_Column_List" />
 
- 
        FROM
 
- 
        XQ_SCHOOL_INFO
 
- 
        WHERE
 
- 
        STATUS = 1
 
- 
        <if test="idList != null and idList.size gt 0">
 
- 
            AND ID IN
 
- 
            <foreach collection="idList"  item="item" index="index" open="(" close=")" separator=",">
 
- 
                #{item}
 
- 
            </foreach>
 
- 
        </if>
 
- 
 
 
- 
        <if test="areaId != null and areaId != null"> AND AREA_ID = #{areaId} </if>
 
- 
 
 
- 
    </select>
 
- 
</mapper>
 
TKmybatis的框架介绍和原理分析及Mybatis新特性的更多相关文章
- TKmybatis的框架介绍和原理分析及Mybatis新特性演示
		
tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...
 - 转载:AbstractQueuedSynchronizer的介绍和原理分析
		
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
 - AbstractQueuedSynchronizer的介绍和原理分析(转)
		
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
 - Servlet过滤器介绍之原理分析
		
zhangjunhd 的BLOG 写留言去学院学习发消息 加友情链接进家园 加好友 博客统计信息 51CTO博客之星 用户名:zhangjunhd 文章数:110 评论数:858 访问量:19 ...
 - AbstractQueuedSynchronizer的介绍和原理分析
		
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
 - Hadoop数据管理介绍及原理分析
		
Hadoop数据管理介绍及原理分析 最近2014大数据会议正如火如荼的进行着,Hadoop之父Doug Cutting也被邀参加,我有幸听了他的演讲并获得亲笔签名书一本,发现他竟然是左手写字,当然这个 ...
 - SpringBoot系列之日志框架介绍及其原理简介
		
SpringBoot系列之日志框架介绍及其原理简介 1.常用日志框架简介 市面上常用日志框架:JUL.JCL.jboss-logging.logback.log4j.log4j2.slf4j.etc. ...
 - atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
		
atitit.jQuery Validate验证框架详解与ati Validate 设计新特性 1. AtiValidate的目标1 2. 默的认校验规则1 2.1. 使用方式 1.metadata用 ...
 - Spring框架介绍和原理
		
SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...
 
随机推荐
- js的replace函数把"$"替换成成"\$"
			
var aa = 18$ 转换成 aa = 18\$ aa.replace("\$","\\\$"); 注意JS的replace方法只能替换第一 ...
 - SpringBoot_整合视图层技术
			
SpringBoot整合视图层技术 在目前的企业级应用开发中,前后端分离是趋势,但是视图层技术还占有一席之地.Spring Boot对视图层技术提供了很好的支持,官方推荐使用的模板引擎是Thymele ...
 - javascript之input获取的时间减1秒&&t时间恢复
			
将输入得到的时间减少1秒:20:00:00 ——— 19:59:59 方法一:普通时间转换 endDateMap(date){ var h = new Date(date).getHours ...
 - Android Studio中找出不再使用的资源
			
顶部Analyze菜单中选择Run Inspection by Name 在弹出的输入框中输入unused resources
 - iOS Programming UINavigationController
			
iOS Programming UINavigationController the Settings application has multiple related screens of info ...
 - was--创建概要文件(典型)
			
1.第一步 2 .创建 3.创建 4 .典型 5 下一步 6 下一步 7.下一步 8.输入用户和密码,下一步 9.下一步 10.下一步 11.下一步 12.下一步 13.下一步 14.创建 ...
 - iOS地图----MapKit框架
			
1.MapKit框架使用前提 ①导入框架 ②导入主头文件 #import <MapKit/MapKit.h> ③MapKit框架使用须知 MapKit框架中所有数据类型的前缀都是MK Ma ...
 - 【PostgreSQL-9.6.3】一般视图
			
PG视图分为两种,一种是物化视图,一种是一般视图.本篇文章主要写一般视图哪些事儿.所谓一般视图,通俗点说,就是由查询语句定义的虚拟表.视图中的数据可能来自一张或多张表. 1. 视图创建语句 CREAT ...
 - MongoDB入门解析
			
刚开始学习mongodb,对笔记做了一个整理.是基于nodejs来学习的. 1.mongodb介绍 mongodb 是C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添 ...
 - 字符串(String)几个常用方法的详解
			
String:(字符串) indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. stringObject.indexOf(searchvalue,fromindex) searc ...