如何理解myBatis的mapper映射文件之批量处理方式
这篇文章主要讲解了"如何理解myBatis的mapper映射文件之批量处理方式",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解myBatis的mapper映射文件之批量处理方式"吧!
目录
mybatis批量插入
mybatis批量删除
mybatis批量修改
myBatis mapper文件详解
Mapper文件中包含的元素有
mybatis支持别名:
jdbcType与JavaType的映射关系
#mybatis常见批量处理
在开发当中,可能经常会遇到批量处理这种情况,一般都再在java层面进行,
其本质是节省数据库连接打开关闭的的次数,占用更少的运行内存。
mybatis批量插入
SELECT LAST_INSERT_ID() INSERT INTO t_product_fee_rule() VALUES ( #{item.id},#{item.productId}, #{item.feeCode},#{item.feeValue}, #{item.remarks} )
mybatis批量删除
DELETE FROM t_product_agent WHERE 1 = 1 AND product_id = #{maps.productId} AND agent_id = #{item}
此处的maps接口中的@Param值对应,属于自定义变量。
void removeProductAgent(@Param("maps")Mapmap);
mybatis批量修改
UPDATE t_product_fee_rule SET fee_value = #{item.feeValue}, remarks = #{item.remarks} WHERE id = #{item.id}
myBatis mapper文件详解
本文的写作目的主要是带大家了解mapper的写法
表结构:
CREATE TABLE customer (id int(11) NOT NULL COMMENT '企业用户ID',name varchar(45) DEFAULT NULL COMMENT '名称',logo varchar(80) DEFAULT '' COMMENT '企业标识',describe varchar(500) DEFAULT '' COMMENT '企业班车说明',is_enable tinyint(1) DEFAULT '0' COMMENT '是否启用 1=启用 0=不启用',phone varchar(20) DEFAULT NULL COMMENT '客服电话',admin varchar(50) DEFAULT NULL COMMENT '管理员账号',password varchar(80) DEFAULT NULL COMMENT '管理员密码',uuid varchar(80) DEFAULT NULL COMMENT '企业唯一ID',PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
Mapper映射文件是在实际开发过程中使用最多的。
Mapper文件中包含的元素有
cache
- 配置给定命名空间的缓存。cache-ref
- 从其他命名空间引用缓存配置。resultMap
- 映射复杂的结果对象。sql
- 可以重用的 SQL 块,也可以被其他语句引用。insert
- 映射插入语句update
- 映射更新语句delete
- 映射删除语句select
- 映射查询语句
本文的代码都是用mybatis-generator生成的注释部分是博主自己加的:
/* where 可以自动去除sql语句where关键字后的and关键字*/ /* 向sql传递数组或List, mybatis使用foreach解析,可以做批量处理。 collection:传入的集合的变量名称(要遍历的值)。 item:每次循环将循环出的数据放入这个变量中。 open:循环开始拼接的字符串。 close:循环结束拼接的字符串。 separator:循环中拼接的分隔符。 */ /* 判断语句,test值等于true执行等于false跳过 test可以是一个值为Boolean型的计算语句 */ /* 前缀'and' 被'(' 替换 prefix:前缀覆盖并增加其内容 不写的话默认替换为空 suffix:后缀覆盖并增加其内容 不写的话默认替换为空 prefixOverrides:前缀判断的条件 suffixOverrides:后缀判断的条件 */ /* choose 是或(or)的关系。 choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。 当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。 类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。 */ and ${criterion.condition} and ${criterion.condition} #{criterion.value} and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} and ${criterion.condition} #{listItem} and ${criterion.condition} and ${criterion.condition} #{criterion.value} and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} and ${criterion.condition} #{listItem} id, name, logo, describe, is_enable, phone, admin, password, uuid ${fields} delete from customer where id = #{id,jdbcType=INTEGER} delete from customer insert into customer (id, name, logo, describe, is_enable, phone, admin, password, uuid ) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{logo,jdbcType=VARCHAR}, #{describe,jdbcType=VARCHAR}, #{isEnable,jdbcType=BIT}, #{phone,jdbcType=VARCHAR}, #{admin,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{uuid,jdbcType=VARCHAR} ) insert into customer id, name, logo, describe, is_enable, phone, admin, password, uuid, #{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{logo,jdbcType=VARCHAR}, #{describe,jdbcType=VARCHAR}, #{isEnable,jdbcType=BIT}, #{phone,jdbcType=VARCHAR}, #{admin,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{uuid,jdbcType=VARCHAR}, update customer id = #{record.id,jdbcType=INTEGER}, name = #{record.name,jdbcType=VARCHAR}, logo = #{record.logo,jdbcType=VARCHAR}, describe = #{record.describe,jdbcType=VARCHAR}, is_enable = #{record.isEnable,jdbcType=BIT}, phone = #{record.phone,jdbcType=VARCHAR}, admin = #{record.admin,jdbcType=VARCHAR}, password = #{record.password,jdbcType=VARCHAR}, uuid = #{record.uuid,jdbcType=VARCHAR}, update customer set id = #{record.id,jdbcType=INTEGER}, name = #{record.name,jdbcType=VARCHAR}, logo = #{record.logo,jdbcType=VARCHAR}, describe = #{record.describe,jdbcType=VARCHAR}, is_enable = #{record.isEnable,jdbcType=BIT}, phone = #{record.phone,jdbcType=VARCHAR}, admin = #{record.admin,jdbcType=VARCHAR}, password = #{record.password,jdbcType=VARCHAR}, uuid = #{record.uuid,jdbcType=VARCHAR} update customer where id = #{id,jdbcType=INTEGER} name = #{name,jdbcType=VARCHAR}, logo = #{logo,jdbcType=VARCHAR}, describe = #{describe,jdbcType=VARCHAR}, is_enable = #{isEnable,jdbcType=BIT}, phone = #{phone,jdbcType=VARCHAR}, admin = #{admin,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR}, uuid = #{uuid,jdbcType=VARCHAR}, update customer set name = #{name,jdbcType=VARCHAR}, logo = #{logo,jdbcType=VARCHAR}, describe = #{describe,jdbcType=VARCHAR}, is_enable = #{isEnable,jdbcType=BIT}, phone = #{phone,jdbcType=VARCHAR}, admin = #{admin,jdbcType=VARCHAR}, password = #{password,jdbcType=VARCHAR}, uuid = #{uuid,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} update customer where id in( when #{item.id,jdbcType=INTEGER} then #{item.id,jdbcType=INTEGER} when #{item.id,jdbcType=INTEGER} then customer.id when #{item.id,jdbcType=INTEGER} then #{item.name,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.name when #{item.id,jdbcType=INTEGER} then #{item.logo,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.logo when #{item.id,jdbcType=INTEGER} then #{item.describe,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.describe when #{item.id,jdbcType=INTEGER} then #{item.isEnable,jdbcType=BIT} when #{item.id,jdbcType=INTEGER} then customer.is_enable when #{item.id,jdbcType=INTEGER} then #{item.phone,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.phone when #{item.id,jdbcType=INTEGER} then #{item.admin,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.admin when #{item.id,jdbcType=INTEGER} then #{item.password,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.password when #{item.id,jdbcType=INTEGER} then #{item.uuid,jdbcType=VARCHAR} when #{item.id,jdbcType=INTEGER} then customer.uuid #{item.id,jdbcType=INTEGER} )insert into customer (id, name, logo, describe, is_enable, phone, admin, password, uuid) values (#{item.id,jdbcType=INTEGER}, #{item.name,jdbcType=VARCHAR}, #{item.logo,jdbcType=VARCHAR}, #{item.describe,jdbcType=VARCHAR}, #{item.isEnable,jdbcType=BIT}, #{item.phone,jdbcType=VARCHAR}, #{item.admin,jdbcType=VARCHAR}, #{item.password,jdbcType=VARCHAR}, #{item.uuid,jdbcType=VARCHAR}) delete from customer where id in ( #{id} )
注意
#{}占位符: 占位
如果传入的是基本类型,那么#{}中的变量名称可以随意写
如果传入的参数是pojo类型,那么#{}中的变量名称必须是pojo中的属性.属性名(user.username)
$ {}拼接符: 字符串原样拼接(有sql注入的风险)
如果传入的是基本类型,那么中 的 变 量 名 必 须 是 v a l u e 如 果 传 入 的 参 数 是 p o j o 类 型 , 那 么 {}中的变量名必须是value 如果传入的参数是pojo类型,那么中的变量名必须是value如果传入的参数是pojo类型,那么{}中的变量名称必须是pojo中的属性.属性名(user.username)
注意:使用拼接符有可能造成sql注入,在页面输入的时候可以加入校验,不可输入sql关键字,不可输入空格
注意:如果是取简单数量类型的参数,括号中的值必须为value
例: select * from user where username like '%${value}%'
可以这样写来解决sql注入:select * from user where username like '%' #{name}'%'(开发经常使用)
动态SQL
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
1.判断语句if
判断语句,test值等于true执行等于false跳过,test可以是一个值为Boolean型的计算语句
2.修剪语句:trim
前缀'and' 被'(' 替换
prefix
:前缀覆盖并增加其内容 不写的话默认替换为空suffix
:后缀覆盖并增加其内容 不写的话默认替换为空prefixOverrides
:前缀判断的条件suffixOverrides
:后缀判断的条件
3.循环语句:foreach
向sql传递数组或List, mybatis使用foreach解析,可以做批量处理。
collection
:传入的集合的变量名称(要遍历的值)。item
:每次循环将循环出的数据放入这个变量中。open
:循环开始拼接的字符串。close
:循环结束拼接的字符串。separator
:循环中拼接的分隔符。
4.选择语句:choose
类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
choose 是或(or)的关系。choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。
... ... ...同样这不是必须的
mapper对应的Java接口文件:
package cn.rainbowbus.dao;import cn.rainbowbus.entity.Customer;import cn.rainbowbus.entity.CustomerExample;import java.util.List;import org.apache.ibatis.annotations.Param;public interface CustomerMapper { long countByExample(CustomerExample example); int deleteByExample(CustomerExample example); int deleteByPrimaryKey(Integer id); int insert(Customer record); int insertSelective(Customer record); ListselectByExample(CustomerExample example); Customer selectByPrimaryKey(Integer id); int updateByExampleSelective(@Param("record") Customer record, @Param("example") CustomerExample example); int updateByExample(@Param("record") Customer record, @Param("example") CustomerExample example); int updateByPrimaryKeySelective(Customer record); int updateByPrimaryKey(Customer record); int batchUpdateByKeys(@Param("recordList") List recordList); void batchInsert(List recordLst); int batchDeleteByKeys(@Param("ids") Integer[] ids);}
mybatis支持别名:
别名 | 映射类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
map | Map |
jdbcType与JavaType的映射关系
jdbcType | Java Type |
---|---|
CHAR | String |
ARCHAR | String |
ONGVARCHAR | String |
UMERIC | java.math.BigDecimal |
ECIMAL | java.math.BigDecimal |
IT | boolean |
OOLEAN | boolean |
INYINT | byte |
SMALLINT | short |
INTEGER | int |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
CLOB | Clob |
BLOB | Blob |
ARRAY | Array |
DISTINCT | mapping of underlying type |
STRUCT | Struct |
REF | Ref |
DATALINK | java.net.URL[color=red][/color] |
感谢各位的阅读,以上就是"如何理解myBatis的mapper映射文件之批量处理方式"的内容了,经过本文的学习后,相信大家对如何理解myBatis的mapper映射文件之批量处理方式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!