关于insert返回值

关于insert返回值

package com.imooc.mybatis;


import com.imooc.dto.GoodsDTO;
import com.imooc.entity.Goods;
import com.imooc.entity.Student;
import com.imooc.mybatis.utils.MyBatisUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import javax.xml.ws.RequestWrapper;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.util.*;

public class MyBatisTestor {
    private Object Goods;

    @Test
    public void testSqlSessionFactory() throws IOException {
        //利用Reader加载classpath下的mybatis-config.xml核心配置文件
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        //初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        System.out.println("SessionFactory加载成功");

    }

    @Test
    public void testMyBatisUtils(){
        SqlSession sqlSession = null;
        try{
        sqlSession=MyBatisUtils.openSession();
        Connection connection=sqlSession.getConnection();
        System.out.println(connection);

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            MyBatisUtils.closeSession(sqlSession);
        }
    }
    @Test
    public void testSelectAll(){
        SqlSession session=null;
        try{
            session=MyBatisUtils.openSession();
            List<Goods> list=session.selectList("goods.selectAll");
            for (Goods g:list
            ) {
                System.out.println(g);
            }

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            MyBatisUtils.closeSession(session);
        }

    }

    @Test
    public void testSelectAllStudent(){
        SqlSession session=null;
        try{
            session=MyBatisUtils.openSession();
            List<Student> list=session.selectList("student.selectAll");
            for (Student s:list
            ) {
                System.out.println(s);
            }

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            MyBatisUtils.closeSession(session);
        }

    }

    @Test
   public void testSelectById(){
        SqlSession session=null;
        try{

            session = MyBatisUtils.openSession();
            Goods = session.selectOne("goods.selectById", 1602);
            System.out.println(Goods);
        }catch(
                Exception e){
            e.printStackTrace();
        }finally {
            MyBatisUtils.closeSession(session);
        }
    }

    @Test
    public void selectGoodsMap(){
        SqlSession session=null;
        try{

            session = MyBatisUtils.openSession();
            List<Map> list = session.selectList("goods.selectGoodsMap");
            for (Map map : list
            ) {
                System.out.println(map);
            }
//            System.out.println(Goods);
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            MyBatisUtils.closeSession(session);
        }
    }

    @Test
    public void selectGoodsDTO(){
        SqlSession session=null;
        try{

            session = MyBatisUtils.openSession();
            List<GoodsDTO> list = session.selectList("goods.selectGoodsDTO");
            for (GoodsDTO g : list
            ) {
                 System.out.println(g);
            }
//            System.out.println(Goods);
        }catch(Exception e){
            e.printStackTrace();
        }finally {

            MyBatisUtils.closeSession(session);
        }
    }

    @Test
    public void insert(){
        SqlSession session=null;
        try{

            session = MyBatisUtils.openSession();
            Goods goods = new Goods();
            goods.setTitle("test");
            goods.setSubTitle("test123");
            goods.setOriginalCost(200f);
            goods.setCurrentPrice(100f);
            goods.setDiscount(0.5f);
            goods.setIsFreeDelivery(1);
            goods.setCategoryId(43);
            int num=session.insert("goods.insert",goods);
            System.out.println(num);
            System.out.println(goods.getGoodsId());
            session.commit();

        }catch(Exception e){
            e.printStackTrace();
            if(session!=null){
                session.rollback();
            }
        }finally {

            MyBatisUtils.closeSession(session);
        }
    }

    @Test
    public void insertStudent(){
        SqlSession session = null;
        try {

            session=MyBatisUtils.openSession();
            Student student = new Student();
            student.setName("楠楠");
            student.setRegNo(20171208);
            student.setAge(26);
            student.setGrade("2013");
            student.setMajor("哲学系");
            student.setSex("男");
            int num = session.insert("goods.insertstudent", student);
            System.out.println(num);
           session.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
            if (session != null) {
                session.rollback();
            }
        }finally {
            session.close();
        }
    }
}

int num = session.insert("goods.insertstudent", student);

我想问一下怎么判断除了在数据表里面查看,还有什么方法可以知道是否插入成功,上面这个方法的返回值1可以证明插入成功吗,如果可以的话,不是要运行session.commit()才提交吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
芝芝兰兰 2019-12-05 18:12:23

同学你好。先要弄明白,执行和真正的提交数据库是两个过程。

1、即便是执行到commit才提交事务,也不是说直到commit执行数据库才执行插入操作。在commit之前,插入实际上可以看做是已经执行了。

commit前的数据操作,同学可以想象是在内存的一块缓冲区域中进行的。在真正的提交后,才会把这个更改存储到数据库中。


2、也就是说,在提交事务时,会检查这个插入是否成功,并且保证它成功插入一条。事务提交可以理解是一个核对的过程。

num是在内存中执行完sql返回,而事务提交之后才会将执行后的数据写在数据库中。但事务回滚是由捕获异常触发的,所以可以根据是否发生异常和num的值两点来判断是否成功插入。


如果解答了同学的疑问,望采纳~

祝学习愉快~

芝芝兰兰 2019-12-05 11:32:43

同学你好。

insert()方法返回值代表本次成功插入的记录总数,判断这个返回值是不是预期的条数可以证明是否插入成功。

session.commit()执行时事务才会提交,如果在session.commit()之前发生了异常都会进行回滚。这不是说事务没有提交所有的数据库操作都不做了。相反,正是因为它做了。所以才需要回滚(执行相反操作)。

如果解答了同学的疑问,望采纳~

祝学习愉快~

  • 我是想问既然commit执行了才提交,那之前Insert那里就是还没有提交事物对吗,没有提交事务就没有实质性往数据库里面添加数据,那怎么知道提交成功了呢
    2019-12-05 11:56:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师