MyBatis单表添加操作分析

添加操作的分析

如果在添加中文时出现乱码的情况,需要在jdbc url的后面加上下面参数

useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai

例如:

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai

在之前的我们编写了第一个MyBatis程序,就是实现了一个向数据库中的添加操作,下面来分析一下:

<!--parameterType可省略-->
<insert id="insertStudent" parameterType="com.monkey1024.bean.Student">
    INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score})
</insert>
  • id:该SQL语句的唯一标识,可被用来代表该sql语句,在Java代码中要使用该标识。
  • parameterType:传入参数的类型,MyBatis会推断出传入参数的类型,因此可以不用配置。
  • { }:里面需要填写javabean中的属性,其底层是通过反射机制,调用bean类相关属性的get方法来获取值的。

在dao的实现类中,我们手动进行了事务的提交:

    //SqlSession继承了AutoCloseable接口,所以可以自动关闭
    try(SqlSession sqlSession = MyBatisUtil.getSqlSession()) {
        //新增数据操作
        sqlSession.insert("insertStudent", student);
        //提交SqlSession
        sqlSession.commit();

    }

如果想要改成自动的话,可以在MyBatisUtil中的下面openSession方法里面传入true,这样mybatis就会自动提交事务了,如果传入false或者没有传入任何参数,他是不会自动提交事务的。

//自动提交事务
sqlSessionFactory.openSession(true);

//不自动提交事务
sqlSessionFactory.openSession(false);
sqlSessionFactory.openSession();

如果不提交事务的话,数据是不会插入到数据库中的。

获取主键

在之前的示例中,我们使用了mysql主键自增的策略,当插入数据库后,我们才能获取到该数据的主键,获取主键的操作可以使用下面方式:

<insert id="insertStudent">
  INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score});
  <selectKey resultType="int" keyProperty="id" order="AFTER">
      SELECT @@identity
  </selectKey>
</insert>

这样子在mybatis完成插入数据后,会将该数据的主键查询出来,重写Student的toString方法,然后通过下面示例可以看到被插入student数据的主键:

@Test
public void insertStudent(){
    StudentDao studentDao = new StudentDaoImpl();
    Student student = new Student("刘德华", 52, 98.50);

    //id是默认值0
    System.out.println("before:" + student);
    studentDao.insertStudent(student);
    //可以获取id的值
    System.out.println("end:" + student);
}

这样子在完成插入数据后就不用再单独去数据库中把主键查询出来了,通过上面的配置,mybatis会帮我们做这件事。那么mybatis是如何获取到这个主键id的呢?我们在执行insert语句之后,提交事务之前添加一行打印student对象的代码:

    //SqlSession继承了AutoCloseable接口,所以可以自动关闭
    try(SqlSession sqlSession = MyBatisUtil.getSqlSession()) {
        //新增数据操作
        sqlSession.insert("insertStudent", student);
        System.out.println("提交数据库之前:" + student);
        //提交SqlSession
        sqlSession.commit();

    }

当执行插入操作的时候,可以看到在提交事务之前,其实已经获取到这个主键id的,就是说不管是提交还是回滚,这个主键都是先获取到的。当执行sql语句之后,数据库就会给该条数据分配一个主键,倘若回滚的话,这个主键就不能用了,下次再执行插入操作时,会在该id之后再分配一个id。由此可以得出一个结论就是主键的生成跟事务没有关系,只要执行了sql语句,mysql就会为其分配一个主键。