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() &gt; 0"> AND A.AREA_ID = #{areaId} </if>
<if test="typeList != null and typeList.size &gt; 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 &gt;= #{salePriceStart}
</if>
<if test="salePriceEnd != null and salePriceEnd != '' ">
AND SALE_PRICE &lt;= #{salePriceEnd}
</if>
</if>
<if test="priceType == 2">
<if test="salePriceStart != null and salePriceStart != '' ">
AND UNIT_PRICE &gt;= #{salePriceStart}
</if>
<if test="salePriceEnd != null and salePriceEnd != '' ">
AND UNIT_PRICE &lt;= #{salePriceEnd}
</if>
</if>
<if test="perfectSituation == 1">
AND SCHOOL_DEGREE = 100
</if>
<if test="perfectSituation == 2">
AND SCHOOL_DEGREE &lt; 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>

原文地址:https://www.cnblogs.com/Jeremy2001/p/11123703.html

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. ThinkPHP v5 新漏洞攻击案例首曝光,阿里云已可告警并拦截

    2018年12月10日,ThinkPHP v5系列发布安全更新,修复了一处可导致远程代码执行的严重漏洞.阿里云态势感知已捕获多起基于该漏洞的真实攻击,并对该漏洞原理以及漏洞利用方式进行分析.现在,对于 ...

  2. thinkphp 动态配置

    之前的方式都是通过预先定义配置文件的方式,而在具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数. 设置新的值: C('参数名称','新的参数值 ...

  3. java基础编程题(2)

    1.给定一个二叉树,找出其最大深度. 注:二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. /** * Definition for a binary tree node. * public ...

  4. man命令的使用方法

    转载自:http://www.cnblogs.com/hnrainll/archive/2011/09/06/2168604.html Linux man命令的使用方法 Linux提供了丰富的帮助手册 ...

  5. SparkListener监听使用方式及自定义的事件处理动作

    本文针对spark 2.0+版本 概述 spark 提供了一系列整个任务生命周期中各个阶段变化的事件监听机制,通过这一机制可以在任务的各个阶段做一些自定义的各种动作.SparkListener便是这些 ...

  6. Substring UVA - 11468 AC自动机+概率DP

    题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...

  7. Nginx配置web服务

    Nginx配置虚拟主机 虚拟主机概述 所谓虚拟主机,在web服务里就是一个独立的网站站点,这个站点对应独立的域名(也可以是IP或者端口),具有独立的程序及资源目录,可以独立的对外提供服务,继而给用户访 ...

  8. vue sChart组件使用页面一片空白问题及示例

    参考:https://www.ctolib.com/mip/lin-xin-vue-schart.html 在网上其他示例里,我试验后发现:渲染到<canvas id="myChart ...

  9. mysql sql的分类、运算符、常用的数据类型

    SQL (结构化查询语言)的分类 DML(数据操作语言),关键字 insert,update,delete, DCL(数据控制语言),控制权限,grand,revoke 授权,回收 DDL(数据定义语 ...

  10. ES相关信息

    漫画版原理介绍 搜索引擎的核心:倒排索引 elasticsearch 基于Lucene的,封装成一个restful的api,通过api就可进行操作(Lucene是一个apache开放源代码的全文检索引 ...