转载自:http://blog.csdn.net/shikaiwencn/article/details/52485883
 
  
 
 tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具
 
 实现对员工表的增删改查的代码  Java的dao层接口
 
public interface WorkerMapper extends Mapper<Worker> {
}
 12
 12 
 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">
    
    <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>
 123456789101112131415
 123456789101112131415 
 实体对象
 
@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;
    
    }
 123456789101112131415161718192021
 123456789101112131415161718192021 
 以上就是实现对Worker进行增删改查的所有代码,包括选择性更新、插入、删除等,所有的方法列表如下
 
 
 
 以后对表字段的添加或修改只需要更改实体对象的注解,不需要修改xml映射文件,如将worker_id改成worker_no
 
@Column(name = 
"worker_no")
private String workerNo;
 12
 12 
 数据源的配置,只需要将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>
 123456789
 123456789 
 用这个库之后写代码感觉在飞…….如果只是简单的了解此框架到这里就可以了,下面是对框架实现原理的分析
 
 原理的简单分析
 
 此框架为我们实现这些功能所有的改动都在Mapper层面,所有的Mapper都继承了tk.mybatis.mapper.common.Mapper
 
public interface WorkerMapper extends Mapper<Worker> {}
 1
 1 
 Mapper接口的声明如下,可以看到Mapper接口实现了所有常用的方法
 
public interface Mapper<T> extends
        BaseMapper<T>,
        ExampleMapper<T>,
        RowBoundsMapper<T>,
        Marker {
}
 1234567
 1234567 
 看一下完整的UML图,太大了,可以用新窗口打开,放大之后再看  
 
 这里选择一个接口:SelectOneMapper接口,对于源码进行简单分析,此接口声明如下:
 
public interface SelectOneMapper<T> {
    
/**
     * 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
     *
     * @param record
     * @return
     */
    @SelectProvider(
type = BaseSelectProvider.
class, method = 
"dynamicSQL")
    T selectOne(T record);
}
 123456789101112
 123456789101112 
 @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();
    }
}
 12345678910111213
 12345678910111213 
 到这里我们就大概知道了这个库为我们提供便利的原理了,总的来说就是这个库帮我们提供了对表的基本操作的sql,帮我们省了很多工作量,而且维护起来也很方便,否则我们的xml文件动不动就几百行甚至上千行
 
 对源码的探索不能到这里停止,最起码要分析到与另一个框架的整合点
 
 我们知道,mybatis的mapper接口是在启动的时候被框架以JdkProxy的形式封装了的,具体对应的类是MapperFactoryBean,这个类中有一个checkDaoConfig()方法,是从父类继承并重写了该方法,继承结构如下
 
MapperFactoryBean -> 
SqlSessionDaoSupport -> 
DaoSupport
 1
 1 
 这里的DaoSupport就是spring提供的Dao的抽象,代码如下
 
public abstract class DaoSupport implements InitializingBean {
    @Override
    public final void afterPropertiesSet() 
throws IllegalArgumentException, BeanInitializationException {
        
        checkDaoConfig();
        
        
try {
            initDao();
        }
        
catch (Exception ex) {
            
throw new BeanInitializationException(
"Initialization of DAO failed", ex);
        }
    }
    
protected abstract void checkDaoConfig() 
throws IllegalArgumentException;
    
protected void initDao() 
throws Exception {
    }
}
 1234567891011121314151617181920212223
 1234567891011121314151617181920212223 
 框架自定义的MapperFactoryBean重写了checkDaoConfig()方法,完成对所有sql语句的设置,代码如下
 
    @Override
    protected void checkDaoConfig() {
        
super.checkDaoConfig();
        
        
if (mapperHelper.isExtendCommonMapper(getObjectType())) {
        
            mapperHelper.processConfiguration(getSqlSession().getConfiguration(), getObjectType());
        }
    }
 123456789
 123456789 
 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;
                
                
if (ms.getId().startsWith(prefix) && isMapperMethod(ms.getId())) {
                    
if (ms.getSqlSource() instanceof ProviderSqlSource) {
                       
                        setSqlSource(ms);
                    }
                }
            }
        }
    }
 1234567891011121314151617181920
 1234567891011121314151617181920 
 设置sql的逻辑,提供了几种不同类型的sqlsource
 
    public void setSqlSource(MappedStatement ms) throws Exception 
        
Method method = methodMap.get(getMethodName(ms));
        try 
            
            else if (SqlNode.
class.isAssignableFrom(
method.getReturnType())) 
            //第三种,返回xml形式的sql字符串
            else if (String.class.equals(method.getReturnType())) 
 12345678910111213141516171819202122
 12345678910111213141516171819202122 
 到这里整个sql的获取流程就分析完了,本人用这个库写过一个小项目,确实节省了开发的工作量,而且DAO层的结构更加清晰简洁了
 
 关于mybatis新特性
 
 从3.4.0开始,mybatis提供对外部表的alias引用方法,多表联合查询就方便多了,我们先看原始的方式是怎样做的
 
select a.id,a.name,b.bid,b.bname .....
from user a 
left join room b 
 123
 123 
 原始的方式是将所有的表字段列出来,再来看用新特性怎样做
 
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>
 1234567
 1234567 
 这里主要就是对基本的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>
 123
 123 
 更进一步
 
 敏锐的程序员可能会提出问题,如当多表查询的时候可能会存在字段名称相同的情况,这里的解决方案是给include添加另一个属性
 
<include refid="user_col_sql_id_with_alias">
<property name="alias" value="t"/>
<property name="prefix" value="t_"/>
</include>
 1234
 1234 
 包含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>
 12345678
 12345678 
 如果说觉得手动写包含alias和prefix的字段麻烦,可以用,mybatis代码生成器的插件的方式实现,我自己写了一个生成器的插件,可以代码再这里,仅供参考
 
 通用Service类
 
@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);
    }
}
 12345678910111213141516171819202122232425262728293031323334353637383940
 12345678910111213141516171819202122232425262728293031323334353637383940 
 注入方式区别
 
    <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>
 1234567891011121314
 1234567891011121314 
 实体类
 
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;
 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 
 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=
        (
SELECT COUNT(*) 
FROM XQ_SCHOOL_INFO B 
WHERE A.ID=B.AREA_ID 
AND B.TYPE=
        (
SELECT COUNT(*) 
FROM XQ_SCHOOL_INFO B 
WHERE A.ID=B.AREA_ID 
AND B.TYPE=
        
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(
            <
if test=
"areaCityCode != null and areaCityCode != '' "> A.CITY_CODE = 
#{areaCityCode}  </if>
            <
if test=
"keywords != null and keywords != '' ">
                ( A.NAME 
LIKE CONCAT(
                )
            </
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(
    </
select>
</mapper>
 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 
 普通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 = 
    </select>
    <delete 
id=
"deleteById" parameterType=
"java.util.Map">
        UPDATE
            XQ_SCHOOL_INFO
        SET
            STATUS = 
0,
            UPDATE_ID = 
            UPDATE_DATE = NOW()
        WHERE
            ID = 
    </delete>
    <delete 
id=
"batchDeleteByIds" parameterType=
"java.util.Map">
        UPDATE
            XQ_SCHOOL_INFO
        SET
            STATUS = 
0,
            UPDATE_ID = 
            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 = 
    </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
            (
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
    </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">
                
            </
if>
            <
if test=
"nameSpell != null">
                
            </
if>
            <
if test=
"alias != null">
                
            </
if>
            <
if test=
"aliasSpell != null">
                
            </
if>
            <
if test=
"type != null">
                
            </
if>
            <
if test=
"areaId != null">
                
            </
if>
            <
if test=
"cityCode != null">
                
            </
if>
            <
if test=
"areaCode != null">
                
            </
if>
            <
if test=
"addr != null">
                
            </
if>
            <
if test=
"startTime != null">
                
            </
if>
            <
if test=
"motto != null">
                
            </
if>
            <
if test=
"webSite != null">
                
            </
if>
            <
if test=
"phone != null">
                
            </
if>
            <
if test=
"feature != null">
                
            </
if>
            <
if test=
"lng != null">
                
            </
if>
            <
if test=
"lat != null">
                
            </
if>
            <
if test=
"unitPrice ! =null">
                
            </
if>
            <
if test=
"salePrice">
                
            </
if>
            <
if test=
"natureType != null">
                
            </
if>
            <
if test=
"natureCity != null">
                
            </
if>
            <
if test=
"schoolDegree != null">
                
            </
if>
            <
if test=
"enrolDegree != null">
                
            </
if>
            <
if test=
"imgDegree != null">
                
            </
if>
            <
if test=
"status != null">
                
            </
if>
            <
if test=
"createId != null">
                
            </
if>
            <
if test=
"createDate != null">
                
            </
if>
            <
if test=
"updateId != null">
                
            </
if>
            <
if test=
"updateDate != null">
                
            </
if>
        </trim>
    </insert>
    <update 
id=
"updateSelective" parameterType=
"com.jjshome.esf.common.entity.school.SchoolInfo">
        UPDATE XQ_SCHOOL_INFO
        <
set>
            <
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=
"type != 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=
"salePrice != null">
                UNIT_PRICE=
            </
if>
            <
if test=
"salePrice != 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>
            <
if test=
"saleCount != null">
                SALE_COUNT=
            </
if>
        </
set>
        WHERE
            ID = 
    </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 = 
    </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=
        </
if>
        <
if test=
"area != null and area != '' ">
            AND i.AREA_CODE=
        </
if>
        <
if test=
"schoolId != null and schoolId != ''">
            AND i.ID=
        </
if>
        <
if test=
"schoolName != null and schoolName != ''">
            AND i.NAME LIKE concat('%',
        </
if>
        <
if test=
"schoolDistrictId != null and schoolDistrictId != ''">
            AND i.AREA_ID=
        </
if>
        <
if test=
"schoolType != null and schoolType != '' ">
            AND i.TYPE=
        </
if>
        <
if test=
"key != null and key != '' ">
            AND (i.NAME LIKE CONCAT('%',
        </
if>
        /*priceType == 
1:起售价 
2:房源售均价*/
        <
if test=
"priceType == 1">
            <
if test=
"salePriceStart != null and salePriceStart != '' ">
                AND SALE_PRICE >= 
            </
if>
            <
if test=
"salePriceEnd != null and salePriceEnd != '' ">
                AND SALE_PRICE <= 
            </
if>
        </
if>
        <
if test=
"priceType == 2">
            <
if test=
"salePriceStart != null and salePriceStart != '' ">
                AND UNIT_PRICE >= 
            </
if>
            <
if test=
"salePriceEnd != null and salePriceEnd != '' ">
                AND UNIT_PRICE <= 
            </
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 = 
        AND CITY_CODE=
        AND AREA_CODE=
        AND 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=
        </
if>
        <
if test=
"key != null and key!=''">
            AND (XSI.NAME like CONCAT(
        </
if>
        AND
        XSI.STATUS=
1
        <
if test=
"pageSize != null">
            limit 
        </
if>
    </select>
    <select 
id=
"selectAreaIdList" parameterType=
"map" resultType=
"integer">
        SELECT DISTINCT AREA_ID FROM XQ_SCHOOL_INFO WHERE NAME LIKE CONCAT('%',
    </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=
",">
                
            </foreach>
        </
if>
        <
if test=
"areaId != null and areaId != null"> AND AREA_ID = 
    </select>
</mapper>