数据库:Mysql

在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下。

结论:

insert:   插入n条记录,返回影响行数n。(n>=1,n为0时实际为插入失败)

update:更新n条记录,返回影响行数n。(n>=0)

delete: 删除n条记录,返回影响行数n。(n>=0)

验证:

插入多条数据,mysql中可以使用如下sql:

insert into bill (TX_TYP,REMARK,NO) VALUES (?,?,?) , (?,?,?) , (?,?,?) ;

而对oracle的操作略有不同(两种方式 以及对应的mapper配置):

INSERT INTO BILL(NO,TX_TYP,REMARK) (SELECT ?,?,? FROM dual) UNION ALL (SELECT ?,?,? FROM dual);
--或者
INSERT ALL INTO bill(NO,TX_TYP,REMARK) values ( ?,?,? ) INTO bill(NO,TX_TYP,REMARK) values ( ?,?,? ) SELECT 1 FROM dual;
   <!--对应的mapper 此处必须设置useGeneratedKeys=false才能批量插入成功-->
<insert id="mulAddOracle" parameterType="java.util.ArrayList" useGeneratedKeys="false">
insert into bill (TX_TYP,REMARK,NO)
<foreach collection="list" item="bill" separator="UNION ALL">
(SELECT #{bill.txTyp},#{bill.remark},#{bill.no} from dual)
</foreach>
</insert>
<!-- 第二种-->
<insert id="mulAddOracle2" parameterType="java.util.ArrayList" useGeneratedKeys="false">
insert ALL
<foreach collection="list" item="bill" >
into bill (TX_TYP,REMARK,NO) values
(#{bill.txTyp},#{bill.remark},#{bill.no})
</foreach>
select 1 from dual
</insert>

为了更直观的查看sql运行情况,在mybatis-config.xml中配置加一个setting配置,将执行的sql打印到控制台。

<setting name="logImpl" value="STDOUT_LOGGING" />

定义实体类Bill,属性no,txTyp,remark,其中no为mysql数据库表bill自增主键。

Mapper接口

    //单条插入
int add(Bill bill);
//多条插入
int mulAdd(List list);
//更新
int upt(Bill bill);
//删除
int del(Bill bill);

Mapper.xml

   <!-- 插入单条记录-->
<insert id="add" parameterType="com.demo.bill1.domain.Bill" >
insert into bill(TX_TYP,REMARK) values(#{txTyp},#{remark})
</insert>
<!--一次插入多条记录 将所有信息插入bill表里面,传入参数为list,通过<foreach>来遍历list-->
<insert id="mulAdd" parameterType="java.util.ArrayList">
insert into bill (TX_TYP,REMARK,NO) VALUES
<foreach collection="list" item="bill" separator=",">
(#{bill.txTyp},#{bill.remark},#{bill.no})
</foreach>
</insert> <!-- 更新记录-->
<update id="upt" parameterType="com.demo.bill1.domain.Bill">
update bill set REMARK=#{remark} where NO=#{no}
</update> <!-- 删除记录-->
<delete id="del" parameterType="com.demo.bill1.domain.Bill">
delete from bill where TX_TYP=#{txTyp}
</delete>

开始测试:

①插入单条记录:

    @Test
public void add(){
Bill bill=new Bill();
bill.setTxTyp("1");
bill.setRemark("试试影响行数");
System.out.println(billMapper.add(bill));
}

sql执行结果与返回值:成功插入一条数据,返回影响行数:1。

②插入多条记录

    @Test //测试一次性插入多条记录
public void mulAdd(){
List list =new ArrayList<Bill>();
Bill bill1=new Bill();
bill1.setTxTyp("1");
bill1.setRemark("bill1");
Bill bill2=new Bill();
bill2.setTxTyp("1");
bill2.setRemark("bill2");
Bill bill3=new Bill();
bill3.setTxTyp("1");
bill3.setRemark("bill3");
list.add(bill1);
list.add(bill2);
list.add(bill3);
System.out.println(billMapper.mulAdd(list));
}

sql执行结果与返回值:成功插入三条数据,返回影响行数:3。

插入多条记录时,如果有记录主键冲突,则sql执行出错,抛出异常,此时未成功插入记录。

③更新语句

    @Test //根据no进行更新
public void upt(){
Bill bill=new Bill();
bill.setTxTyp("1");
bill.setRemark("修改一下");
bill.setNo(1);
System.out.println(billMapper.upt(bill));
}

sql执行结果与返回值:根据NO字段进行更新,数据库表中没有NO=1的行,返回影响行数:0。修改成表中有的值后,成功返回影响行数。

④删除语句

    @Test //根据txTyp进行删除
public void del(){
Bill bill=new Bill();
bill.setTxTyp("1");
System.out.println(billMapper.del(bill));
}

sql执行结果与返回值:先将txTyp设置成数据库中没有的值txTyp=a,执行后返回影响行数为0;设置为有4条记录的txTyp=1,执行后返回影响结果为4,成功删除4条记录。

Mybatis执行sql(insert、update、delete)返回值问题的更多相关文章

  1. 关于MyBatis mapper的insert, update, delete返回值

    这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...

  2. mybatis insert update delete返回都是整型 0,1,增,删,改要提交事物

    mybatis insert update delete返回都是整型 0,1, 没有扔 增,删,改要提交事物

  3. 动态执行SQL语句,接收返回值

    一.exec和sp_executesql介绍 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句.比如,一个比较通用的分页存储过程,可能需要传入表名,字段,过滤条件, ...

  4. mybatis select/insert/update/delete

    这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...

  5. LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作.这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作 插入( ...

  6. 用sp_executesql执行动态SQL语句及获得返回值

    过去我执行拼凑出来的动态SQL语句,都直接使用EXEC @sql 的方式.有好几次,都看到有资料说,应该尽量使用 sp_executesql. 究其原因,是因为仅仅参数不同的情况下,sp_execut ...

  7. JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...

  8. sql中同一个Trigger里同时包含Insert,Update,Delete

    sql中同一个Trigger里同时包含Insert,Update,Delete SQLServer是靠Inserted表和Deleted表来处理的,判断一下就可以了,只不过比ORACLE麻烦一点 cr ...

  9. PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

    原文: PHP5: mysqli 插入, 查询, 更新和删除  Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...

  10. mybatis执行批量更新update

    Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...

随机推荐

  1. JAVA输入随笔

    做题时经常遇到输入的问题,很麻烦 写一点点自己对于输入的随笔,以备后查 这里都以整数为例,其他类型的话换成相应方法就行了 1.知道一共多少行,每一行只有一个整数 这是比较简单的输入,可以用Scanne ...

  2. UltraFast设计法实践(1) -- 初始设计检查

    目录 1. report_failfast 1.1 命令使用 1.2 优化 1.3.总结 2.report_timing_summary 3. report_methodology 4. 总结 5.遗 ...

  3. 洛谷 P3227 [HNOI2013]切糕(最小割)

    题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...

  4. scikit-learn中predict_proba用法 (与predict的区别)

    predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行的概率和为1. # conding :utf-8 ...

  5. TensorFlow GPU 的使用

    一.TensorFlow 设备分配 1.设备分配规则 If a TensorFlow operation has both CPU and GPU implementations, the GPU d ...

  6. Linux串口驱动程序设计

    1. 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备. (1)串口终端(/dev/ttyS*):串口终端是使用计算机串口连接的终端设备.Linux把每 ...

  7. mssqlServer大量数据快速插入:SqlBulkCopy

    SqlBulkCopy类,为微软的一个大量数据快速插入.直接上代码 表结构: namespace SqlBulkCopy的演示 { using System.Data.SqlClient; publi ...

  8. linux如何安装yum

    yum全称Yellow dog Updater Modified,yum的主要用途是对rpm包进行管理,包括安装.卸载.升级等.linux安装yum也较为简单,具体如下: 工具/原料 1.电脑: 2. ...

  9. Oracle 客户端管理软件安装

    1.首先,先说明下为什么要安装Oracle客户端管理工具? 因为Oracle服务端过大,而且消耗的资源过多,大部分公司会把服务端装在公司的服务器上,而不会装在员工的电脑上,所以这个时候就需要使用Ora ...

  10. cg教程

    Unity对shader的重点支持是cg语言,因为具有跨平台性质 Cg语言和CPU 上的C语言是很相似的,只不过有了自己的一套关键字和函数库 Cg语言的权威和入门教程在NVID1A的官方网站上,如果以 ...