数据库: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. android开发如何获取res/raw和assets文件夹的路径

    ---恢复内容开始--- android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况: 1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以, ...

  2. 爬虫--python3如何安装scrapy?

    直接使用pip3 install scrapy会报很多错误,所以试试以下步骤. (1) https://www.lfd.uci.edu/~gohlke/pythonlibs/ 在这个python第三方 ...

  3. 玩转MongoDB

    一.主从复制 1)首先主从服务器在启动的时候,分别要设置master.slave选项,对于slave可以启动中设置源,也可以在启动后设置源. 如:主:mongod --dbpath=/data/mon ...

  4. 阿里云服务主机部署Thinkphp系统错误解决方案

    最近在阿里云上购买了虚拟主机,于是有了把自己的网站挂在云上的冲动,那就行动呗.本来想的很简单,以为在修改数据库配置之后,将文件打包上传,然后就可以了,可在实际操作过程中,出现了很多问题,找了很多资料, ...

  5. 清除bean中所有非基本数据类型的属性值

    利用beanutils清除javabean中所有非基本数据类型的属性值: import com.google.gson.Gson; import lombok.Data; import org.apa ...

  6. Runas命令巧用

    Runas,从字面上看就知道,以谁的身份去run一个程序,那么他就是在当前登陆的Windows帐号下,以本地或者是域中的其他帐号的身份去运行一个程序.简明语法如下: Runas /user:usern ...

  7. Centos7 安装node(8版本)

    最简洁的命令 yum -y update yum -y install gcc make gcc-c++ openssl-devel wget vim(后面两个如果没有再选择安装) cd /usr/l ...

  8. vue中实现国际化--语言切换(转载)

    https://segmentfault.com/a/1190000011800593

  9. crypto-js计算文件的sha256值

    1. 要在浏览器中计算出文件的sha256或md5值,基本思路就是使用HTML5的FileReader接口把文件读取到内存(readAsArrayBuffer),然后获取文件的二进制内容,然后获取文件 ...

  10. Web性能优化之雅虎军规

    相信互联网已经越来越成为人们生活中不可或缺的一部分.Ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实 现的功能. 比如Google机会已经把最基本的office应 ...