医疗公司网站建设项目背景,如何判断网站是否被百度降权,wordpress的图片插件,黄梅戏网页制作素材文章目录 Mybatis如何执行批量操作使用foreach标签 使用ExecutorType.BATCH如何获取生成的主键 Mybatis如何执行批量操作
使用foreach标签
foreach的主要用在构建in条件中#xff0c;它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有item#xff0c;index… 文章目录 Mybatis如何执行批量操作使用foreach标签 使用ExecutorType.BATCH如何获取生成的主键 Mybatis如何执行批量操作
使用foreach标签
foreach的主要用在构建in条件中它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有itemindexcollectionopenseparatorclose。 item 表示集合中每一个元素进行迭代时的别名随便起的变量名 index 指定一个名字用于表示在迭代过程中每次迭代到的位置不常用 open 表示该语句以什么开始常用“(” separator表示在每次进行迭代之间以什么符号作为分隔符常用“,” close 表示以什么结束常用“)”。 在使用foreach的时候最关键的也是最容易出错的就是collection属性该属性是必须指定的但是在不同情况下该属性的值是不一样的主要有一下3种情况
如果传入的是单参数且参数类型是一个List的时候collection属性值为list如果传入的是单参数且参数类型是一个array数组的时候collection的属性值为array如果传入的参数是多个的时候我们就需要把它们封装成一个Map了当然单参数也可以封装成map实际上如果你在传入参数的时候在MyBatis里面也是会把它封装成一个Map的map的key就是参数名所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 具体用法如下
!-- 批量保存(foreach插入多条数据两种方法)int addEmpsBatch(Param(emps) ListEmployee emps); --
!-- MySQL下批量保存可以foreach遍历 mysql支持values(),(),()语法 -- //推荐使用
insert idaddEmpsBatchINSERT INTO emp(ename,gender,email,did)VALUESforeach collectionemps itememp separator,(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})/foreach
/insert
!-- 这种方式需要数据库连接属性allowMutiQueriestrue的支持如jdbc.urljdbc:mysql://localhost:3306/mybatis?allowMultiQueriestrue --
insert idaddEmpsBatchforeach collectionemps itememp separator; INSERT INTO emp(ename,gender,email,did)VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})/foreach
/insert
使用ExecutorType.BATCH
Mybatis内置的ExecutorType有3种默认为simple,该模式下它为每个语句的执行创建一个新的预处理语句单条提交sql而batch模式重复使用已经预处理的语句并且批量执行所有更新语句显然batch性能将更优 但batch模式也有自己的问题比如在Insert操作时在事务没有提交之前是没有办法获取到自增的id这在某型情形下是不符合业务要求的
具体用法如下
//批量保存方法测试
Test
public void testBatch() throws IOException{SqlSessionFactory sqlSessionFactory getSqlSessionFactory();//可以执行批量操作的sqlSessionSqlSession openSession sqlSessionFactory.openSession(ExecutorType.BATCH);//批量保存执行前时间long start System.currentTimeMillis();try {EmployeeMapper mapper openSession.getMapper(EmployeeMapper.class);for (int i 0; i 1000; i) {mapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0, 5), b, 1));}openSession.commit();long end System.currentTimeMillis();//批量保存执行后的时间System.out.println(执行时长 (end - start));//批量 预编译sql一次》设置参数》10000次》执行1次 677//非批量 预编译设置参数执行 》10000次 1121} finally {openSession.close();}
}
mapper和mapper.xml如下
public interface EmployeeMapper { //批量保存员工Long addEmp(Employee employee);
}mapper namespacecom.jourwon.mapper.EmployeeMapper!--批量保存员工 --insert idaddEmpinsert into employee(lastName,email,gender)values(#{lastName},#{email},#{gender})/insert
/mapper如何获取生成的主键
对于支持主键自增的数据库MySQL
insert idinsertUser useGeneratedKeystrue keyPropertyuserId insert into user( user_name, user_password, create_time) values(#{userName}, #{userPassword} , #{createTime, jdbcType TIMESTAMP})
/insertparameterType 可以不写Mybatis可以推断出传入的数据类型。如果想要访问主键那么应当parameterType 应当是java实体或者Map。这样数据在插入之后 可以通过ava实体或者Map 来获取主键值。通过 getUserId获取主键
不支持主键自增的数据库Oracle
对于像Oracle这样的数据没有提供主键自增的功能而是使用序列的方式获取自增主键。 可以使用selectKey标签来获取主键的值这种方式不仅适用于不提供主键自增功能的数据库也适用于提供主键自增功能的数据库 selectKey一般的用法
selectKey keyColumnid resultTypelong keyPropertyid orderBEFORE
/selectKey insert idinsertUser selectKey keyColumnid resultTypelong keyPropertyuserId orderBEFORESELECT USER_ID.nextval as id from dual /selectKey insert into user( user_id,user_name, user_password, create_time) values(#{userId},#{userName}, #{userPassword} , #{createTime, jdbcType TIMESTAMP})
/insert此时会将Oracle生成的主键值赋予userId变量。这个userId 就是USER对象的属性这样就可以将生成的主键值返回了。如果仅仅是在insert语句中使用但是不返回此时keyProperty“任意自定义变量名”resultType 可以不写。 Oracle 数据库中的值要设置为 BEFORE 这是因为 Oracle中需要先从序列获取值然后将值作为主键插入到数据库中。
扩展 如果Mysql 使用selectKey的方式获取主键需要注意下面两点
order AFTER 获取递增主键值 SELECT LAST_INSERT_ID()
当实体类中的属性名和表中的字段名不一样 怎么办 第1种 通过在查询的SQL语句中定义字段名的别名让字段名的别名和实体类的属性名一致。
select idgetOrder parameterTypeint resultTypecom.jourwon.pojo.Orderselect order_id id, order_no orderno ,order_price price form orders where order_id#{id};
/select第2种 通过resultMap来映射字段名和实体类属性名的一一对应的关系。
select idgetOrder parameterTypeint resultMaporderResultMapselect * from orders where order_id#{id}
/selectresultMap typecom.jourwon.pojo.Order idorderResultMap!–用id属性来映射主键字段–id propertyid columnorder_id!–用result属性来映射非主键字段property为实体类属性名column为数据库表中的属性–result property orderno column order_no/result propertyprice columnorder_price /
/reslutMap 文章转载自: http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn http://www.morning.whnps.cn.gov.cn.whnps.cn http://www.morning.ckhpg.cn.gov.cn.ckhpg.cn http://www.morning.ypfw.cn.gov.cn.ypfw.cn http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn http://www.morning.dnls.cn.gov.cn.dnls.cn http://www.morning.gqfjb.cn.gov.cn.gqfjb.cn http://www.morning.spqbp.cn.gov.cn.spqbp.cn http://www.morning.qcmhs.cn.gov.cn.qcmhs.cn http://www.morning.qqfcf.cn.gov.cn.qqfcf.cn http://www.morning.qfmns.cn.gov.cn.qfmns.cn http://www.morning.kyytt.cn.gov.cn.kyytt.cn http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn http://www.morning.ysbhj.cn.gov.cn.ysbhj.cn http://www.morning.ychoise.com.gov.cn.ychoise.com http://www.morning.zfyr.cn.gov.cn.zfyr.cn http://www.morning.lcxzg.cn.gov.cn.lcxzg.cn http://www.morning.crkmm.cn.gov.cn.crkmm.cn http://www.morning.fslxc.cn.gov.cn.fslxc.cn http://www.morning.nqrdx.cn.gov.cn.nqrdx.cn http://www.morning.nggbf.cn.gov.cn.nggbf.cn http://www.morning.ybnps.cn.gov.cn.ybnps.cn http://www.morning.nuobeiergw.cn.gov.cn.nuobeiergw.cn http://www.morning.qrgfw.cn.gov.cn.qrgfw.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.jgmdr.cn.gov.cn.jgmdr.cn http://www.morning.rkgyx.cn.gov.cn.rkgyx.cn http://www.morning.rlqwz.cn.gov.cn.rlqwz.cn http://www.morning.brwwr.cn.gov.cn.brwwr.cn http://www.morning.rnwt.cn.gov.cn.rnwt.cn http://www.morning.cokcb.cn.gov.cn.cokcb.cn http://www.morning.zdsdn.cn.gov.cn.zdsdn.cn http://www.morning.jcxgr.cn.gov.cn.jcxgr.cn http://www.morning.hwnnh.cn.gov.cn.hwnnh.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn http://www.morning.dygsz.cn.gov.cn.dygsz.cn http://www.morning.dqxph.cn.gov.cn.dqxph.cn http://www.morning.jpqmq.cn.gov.cn.jpqmq.cn http://www.morning.cjmmn.cn.gov.cn.cjmmn.cn http://www.morning.rdkgw.cn.gov.cn.rdkgw.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.pljxz.cn.gov.cn.pljxz.cn http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.qynpw.cn.gov.cn.qynpw.cn http://www.morning.tbnn.cn.gov.cn.tbnn.cn http://www.morning.wwkdh.cn.gov.cn.wwkdh.cn http://www.morning.wiitw.com.gov.cn.wiitw.com http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.yyzgl.cn.gov.cn.yyzgl.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.qxdrw.cn.gov.cn.qxdrw.cn http://www.morning.tbplf.cn.gov.cn.tbplf.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.fqtzn.cn.gov.cn.fqtzn.cn http://www.morning.pjrgb.cn.gov.cn.pjrgb.cn http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn http://www.morning.jsrnf.cn.gov.cn.jsrnf.cn http://www.morning.kxrhj.cn.gov.cn.kxrhj.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn http://www.morning.gynlc.cn.gov.cn.gynlc.cn http://www.morning.mpyry.cn.gov.cn.mpyry.cn http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn http://www.morning.rycbz.cn.gov.cn.rycbz.cn http://www.morning.lmyq.cn.gov.cn.lmyq.cn http://www.morning.rtlth.cn.gov.cn.rtlth.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.pljxz.cn.gov.cn.pljxz.cn http://www.morning.fmjzl.cn.gov.cn.fmjzl.cn http://www.morning.xqjh.cn.gov.cn.xqjh.cn http://www.morning.btlsb.cn.gov.cn.btlsb.cn http://www.morning.qfkdt.cn.gov.cn.qfkdt.cn http://www.morning.fjlsfs.com.gov.cn.fjlsfs.com