`
无量
  • 浏览: 1134813 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mybatis.xml中sql编写规范

阅读更多
一、越少的代码,越强悍的功能,xml里面应该6个sql语句就够用了,修改,维护成本很低,见下表
英文名方法名称核心点建议
insert1.新增数据如果是自增主键,应该返回主键ID
deleteById2. 根据主键ID删除数据sql默认加limit 1,防止多删数据此方法不建议有,建议逻辑删除
updateById3. 根据主键ID修改数据sql默认加limit 1,防止多修改数据
selectById4. 根据主键查询数据查询一条数据
selectByIdForUpdate5. 根据主键加锁查询数据加锁查询一条数据,事务处理用
queryListByParam6. 根据输入条件查询数据列表和7配合使用
queryCountByParam7. 根据输入条件查询总数和6配合使用


二、公共的查询条件和字段列表等抽出公共sql段,方便使用
英文名方法名称核心点建议
_field_list1.字段列表修改方便,方便字段排序
_value_list2. 字段值列表修改方便,方便字段值排序
_common_where3. 通用查询条件每个字段的等值判断
_regin_where4. 通用范围区间条件字段的时间区间,字段的金额区间等的判断
_contain_where5. 包含字段值范围条件字段的常量值包含判断,in ,not in
_common_sorts6. 通用排序条件order by


三、一个mybatis.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="Assets">


	<!-- 设置1分钟缓存,缓存大小1024,采用最近最少使用算法 -->
	<cache readOnly="true" flushInterval="60000" size="10" eviction="LRU" />

	<resultMap type="Assets" id="AssetsResultMap">
		<id property="id" column="id" />
		<result property="userId" column="user_id" />
		<result property="amount" column="amount" />
		<result property="earning" column="earning" />
		<result property="type" column="type" />
		<result property="status" column="status" />
		<result property="productId" column="product_id" />
		<result property="productName" column="product_name" />
		<result property="cardNo" column="card_no" />
		<result property="bankCode" column="bank_code" />
		<result property="orderId" column="order_id" />
		<result property="effectiveDate" column="effective_date" />
		<result property="redeemType" column="redeem_type"/>
		<result property="initAmount" column="init_amount"/>
		<result property="initEarning" column="init_earning"/>
		<result property="redeemingAmount" column="redeeming_amount"/>
		<result property="redeemingEarning" column="redeeming_earning"/>
		<result property="redeemedAmount" column="redeemed_amount"/>
		<result property="redeemedEarning" column="redeemed_earning"/>
		<result property="punishAmount" column="punish_amount"/>
		<result property="latestRedeemTime" column="latest_redeem_time"/>
		<result property="maturityDate" column="maturity_date"/>
		<result property="createTime" column="create_time" />
		<result property="modifyTime" column="modify_time" />
		<result property="remark" column="remark" />
	</resultMap>

	<!-- 字段列表 -->
    <sql id="_field_list">
	    id, 
	    user_id, 
	    amount, 
	    earning, 
	    type, 
	    status, 
		product_id, 
		product_name,
		card_no, 
		bank_code, 
		order_id, 
		effective_date, 
		redeem_type, 
		init_amount, 
		init_earning, 
		redeeming_amount,
		redeeming_earning,
		redeemed_amount, 
		redeemed_earning, 
		punish_amount,
		latest_redeem_time, 
		maturity_date,
		create_time, 
		modify_time,
		remark
    </sql>

	<!-- 字段值列表 -->
    <sql id="_value_list">
        #{id}, 
        #{userId},
		#{amount}, 
		#{earning}, 
		#{type}, 
		#{status}, 
		#{productId}, 
		#{productName}, 
		#{cardNo}, 
		#{bankCode}, 
		#{orderId}, 
		#{effectiveDate}, 
		#{redeemType}, 
		#{initAmount}, 
		#{initEarning}, 
		#{redeemingAmount},
		#{redeemingEarning},
		#{redeemedAmount}, 
		#{redeemedEarning}, 
		#{punishAmount},
		#{latestRedeemTime}, 
		#{maturityDate},
		#{createTime},
		#{modifyTime}, 
		#{remark}
    </sql>

    <!-- 通用查询条件  不支持ID查询条件,ID的直接通过ID即可以查 -->
	<sql id="_common_where">
		<if test="id != null"> AND id = #{id}</if>
		<if test="userId != null"> AND user_id = #{userId}</if>
		<if test="amount != null"> AND amount = #{amount}</if>
		<if test="earning != null"> AND earning = #{earning}</if>
		<if test="type != null"> AND type = #{type}</if>
		<if test="status != null"> AND status = #{status}</if>
		<if test="productId != null"> AND product_id = #{productId}</if>
		<if test="productName != null"> AND product_name = #{productName}</if>
		<if test="cardNo != null"> AND card_no = #{cardNo}</if>
		<if test="bankCode != null"> AND bank_code = #{bankCode}</if>
		<if test="orderId != null"> AND order_id = #{orderId}</if>
		<if test="effectiveDate != null"> AND effective_date = #{effectiveDate}</if>
		<if test="redeemType != null"> AND redeem_type = #{redeemType}</if>
		<if test="initAmount != null"> AND init_amount = #{initAmount}</if>
		<if test="initEarning != null"> AND init_earning = #{initEarning}</if>
		<if test="redeemingAmount != null"> AND redeeming_amount = #{redeemingAmount}</if>
		<if test="redeemingEarning != null"> AND redeeming_earning = #{redeemingEarning}</if>
		<if test="redeemedAmount != null"> AND redeemed_amount = #{redeemedAmount}</if>
		<if test="redeemedEarning != null"> AND redeemed_earning = #{redeemedEarning}</if>
		<if test="punishAmount != null"> AND punish_amount = #{punishAmount}</if>
		<if test="latestRedeemTime != null">
			<![CDATA[
				AND latest_redeem_time = #{latestRedeemTime, jdbcType=TIMESTAMP} 
			]]>
		</if>
		<if test="maturityDate != null">
			<![CDATA[
				AND maturity_date = #{maturityDate, jdbcType=TIMESTAMP} 
			]]>
		</if>
		<if test="createTime != null">
			<![CDATA[
				AND create_time = #{createTime, jdbcType=TIMESTAMP} 
			]]>
		</if>
		<if test="modifyTime != null">
			<![CDATA[
				AND modify_time = #{modifyTime, jdbcType=TIMESTAMP} 
			]]>
		</if>
		<if test="remark != null"> AND remark = #{remark}</if>
	</sql>
	
	
	<!-- 通用范围区间查询 -->
	<sql id="_regin_where">
		<if test="egtCreateTime != null">
			<![CDATA[
				AND create_time >= #{egtCreateTime, jdbcType=TIMESTAMP} 
			]]>
		</if>
		<if test="ltCreateTime != null">
			<![CDATA[
				AND create_time < #{ltCreateTime, jdbcType=TIMESTAMP} 
			]]>
		</if>
	</sql>
	
	
	<!-- 通用排序处理 -->
	<sql id="_common_sorts">
		<if test="sorts != null">
			ORDER BY
			<foreach collection="sorts" item="item" separator=",">
				${item.column.columnName} ${item.sortMode.mode}
			</foreach>
		</if>
	</sql>
	
	
	<!-- in 和 not in的通用查询where -->
	<sql id="_contain_where">
		<if test="containStatusSet!=null">
	 	    AND status IN
	 		<foreach item="item" index="i" collection="containStatusSet" separator="," open="(" close=")" >  
	        	#{item}  
	    	</foreach>
	   	</if>
	   	
 	</sql>
	
	
	<!-- 插入操作 -->
	<insert id="insert" parameterType="Assets">
		INSERT INTO assets (
			<include refid="_field_list"/>)
		VALUES (
			<include refid="_value_list"/>)
	</insert>


	<!-- 根据ID主键进行删除,注意limit 1 -->
	<delete id="deleteById"  parameterType="java.lang.String" >
    	delete from assets where id = #{id} limit 1
  	</delete>	


	<!-- 根据主键ID进行更新,注意limit 1 -->
	<update id="updateById" parameterType="Assets">
		UPDATE assets
		<set>
			<if test="userId != null">
				user_id = #{userId},
			</if>
			<if test="amount != null">
				amount = #{amount},
			</if>
			<if test="earning != null">
				earning = #{earning},
			</if>
			<if test="type != null">
				type = #{type},
			</if>
			<if test="status != null">
				status = #{status},
			</if>
			<if test="productName != null">
				product_name = #{productName},
			</if>
			<if test="productId != null">
				product_id = #{productId},
			</if>
			<if test="cardNo != null">
				card_no = #{cardNo},
			</if>
			<if test="bankCode != null">
				bank_code = #{bankCode},
			</if>
			<if test="orderId != null">
				order_id = #{orderId},
			</if>
			<if test="effectiveDate != null">
				effective_date = #{effectiveDate},
			</if>
			<if test="redeemType != null">
				redeem_type = #{redeemType},
			</if>
			<if test="initAmount != null">
				init_amount = #{initAmount},
			</if>
			<if test="initEarning != null">
				init_earning = #{initEarning},
			</if>
			<if test="redeemingAmount != null">
				redeeming_amount = #{redeemingAmount},
			</if>
			<if test="redeemingEarning != null">
				redeeming_earning = #{redeemingEarning},
			</if>
			<if test="redeemedAmount != null">
				redeemed_amount = #{redeemedAmount},
			</if>
			<if test="redeemedEarning != null">
				redeemed_earning = #{redeemedEarning},
			</if>
			<if test="punishAmount != null">
				punish_amount = #{punishAmount},
			</if>
			<if test="latestRedeemTime != null">
				latest_redeem_time = #{latestRedeemTime},
			</if>
			<if test="maturityDate != null">
				maturity_date = #{maturityDate},
			</if>
			<if test="modifyTime != null">
				modify_time = #{modifyTime},
			</if>
			<if test="remark != null">
				remark = #{remark},
			</if>
		</set>

		<where>
			id = #{id} limit 1
		</where>
	</update>


	<!-- 根据ID进行查询 -->
	<select id="selectById" resultMap="AssetsResultMap">
		select * from assets where id = #{id}
	</select>
	
	
	<!-- 根据ID进行加行锁查询 -->
	<select id="selectByIdForUpdate" resultMap="AssetsResultMap">
		select * from assets where id = #{id} for update
	</select>

  	
  	<!-- 根据查询条件查询数据和queryCountByParam方法配对使用 -->
  	<select id="queryListByParam" parameterType="map" resultMap="AssetsResultMap">
		SELECT 
			<include refid="_field_list"/>
		FROM 
			assets
		<where>
		 	1 = 1
			<include refid="_common_where"/>
			<include refid="_regin_where"/>
			<include refid="_contain_where"/>
		</where>
		
		<include refid="_common_sorts"/>
		
		<if test="offset != null and rows != null">
			limit #{offset}, #{rows}
		</if>
	</select>
	
	
	<!-- 根据查询条件查询总数和queryListByParam方法配对使用 -->
	<select id="queryCountByParam" parameterType="map" resultType="java.lang.Integer">
		SELECT count(1) FROM assets
		<where>
			1 = 1
			<include refid="_common_where"/>
			<include refid="_regin_where"/>
			<include refid="_contain_where"/>
		</where>
	</select>
  	
</mapper>
2
1
分享到:
评论

相关推荐

    mybatis资料,传统方式创建mybatis项目1.创建java项目2.导入mybatis资源3.创建主配置文件…………

    创建sql映射文件:接口名称.xml 9.编写测试类,测试接口方法:接口名称+方法+Test.class cn.edu.xxxx. util 存放工具类包 类/接口的格式:名称+Util pojo 存放实体类包 类/接口的格式:表名称 ...

    Mybatis的映射(sql编写).md

    &lt;mapper namespace="com.tjjp.business.Notice.model.Notice(类的全路径)"&gt; &lt;resultMap id="BaseResultMap" type="com.tjjp.business.Notice.model.Notice(类的全路径)"&gt; &lt;!-- 对于的类型 jdbcType --&gt;...

    day01_eesy_01mybatis.zip

    mybatis是一个持久层框架,用java编写的。 它封装了jdbc操作的很多细节,开发者只需要关注sql语句本身,无需关注注册驱动,创建连接等繁杂过程 它使用了ORM思想实现了结果集的封装。 ORM: Object ...

    mybatis动态sqlmybatis动态sqlmybatis动态sql

    在MyBatis中,动态SQL使用的主要方式是通过使用XML或注解来编写SQL语句。下面我将简单介绍一下MyBatis动态SQL的使用方法和常用的功能。 1. if标签:if标签是动态SQL中最常用的功能之一。它允许我们根据条件判断是否...

    springmybatis

    里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 &lt;typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/&gt; 这个别名非常重要,你在 具体的类的映射中,比如User.xml 中 resultType ...

    Go-GoBatis是用golang编写的ORM工具支持类似MyBatis的XML模板SQL

    基本思路 用户定义结构和接口 在接口的方法上定义 sql (可以在 xml 或 方法的注释中) 用工具生成接口的实现 创建接口的实例并使用它

    Mybatis面试题(含答案)_.pdf

    4. Mybatis 是如何将 sql 执行结果封装为目标对象并返回的? 都有哪些映射形式? 5. Xml 映射文件中,除了常见的 select|insert|update|delete 标 签之外,还有哪些标签? 6. 简述 Mybatis 的插件运行原理,以及如何...

    ezorm:一个易于使用的Golang ORM工具,支持MyBatis-Like XML模板SQL

    埃索姆介绍一个易于使用的Golang ORM工具,支持MyBatis-Like XML模板SQL特征功能齐全的ORM(几乎) MyBatis-Like XML模板SQL 开发人员友好入门 type RowType struct {Id intName string}type DAO struct {Id intName...

    MyBatis 动态 SQL 示例

    附件是MyBatis 动态 SQL 示例,MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够...

    MyBatis 动态SQL示例

    附件是MyBatis 动态SQL示例,MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够灵活...

    mybatis和mybatis plus比较详解

    MyBatis提供了定制化SQL、存储过程以及高级映射的支持,它要求开发者手动编写SQL语句,并使用注解或XML文件进行配置。相比之下,MyBatis Plus则提供了更为丰富的功能,如自动注入基本CRUD操作、强大的条件构造器、...

    mybatis 一对多多对多案例详解

    mybatis 一对多多对多案例详解 1、首先 准备sql 数据 user(用户表) role(角色...4、编写UserDao,RoleDao以及映射文件UserDaoMapping.xml ,RoleDaoMapping.xml和主配置文件SqlMapConfig.xml,下面上代码 5、编写测试类

    mybatis-generator-gui.zip

    mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上。 企业实际开发...

    mybatis逆向工程源码

    mybatis是需要自己在mapper文件中编写sql,这样一来,如果表特别多的话,那么我们需要自己建很多类(pojo,mapper文件,sql语句等),会非常麻烦。为了解决这个问题,mybatis官方提供逆向工程 可以针对单表自动生成...

    mybatis学习笔记

    8.3 第三步:拷贝生成的mapper文件到工程中指定的目录中 73 8.3.1 Mapper.xml 73 8.3.2 Mapper.java 73 8.3.3 第四步Mapper接口测试 73 8.4 逆向工程注意事项 74 8.4.1 Mapper文件内容不覆盖而是追加 74 8.4.2 Table...

    mybatis源代码,包括基本的增删改查、动态参数、动态数据、逆向工程

    (3)MyBatis在XML文件中编写SQL语句,和程序逻辑代码分离,降低了耦合度。这样就不会对应用程序或数据库的现有设计有任何影响,便于统一管理和优化,也提高了代码的可重用性。 (4)MyBatis提供了XML元素,支持...

    MyBatis动态SQL是一种强大的特性.docx

    MyBatis动态SQL则通过标签的形式在XML映射文件中编写,从而避免了手动拼接SQL的麻烦。 MyBatis提供了多种元素来实现动态SQL,如、、、、、、等。这些元素可以单独使用,也可以组合使用,以实现复杂的动态SQL逻辑。...

    Mybatis 28道面试题及答案.docx

    (3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。...

    MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据

    MyBatis动态SQL则通过标签的形式在XML映射文件中编写,从而避免了手动拼接SQL的麻烦。 MyBatis提供了多种元素来实现动态SQL,如、、、、、、等。这些元素可以单独使用,也可以组合使用,以实现复杂的动态SQL逻辑。...

Global site tag (gtag.js) - Google Analytics