【MyBatis05】MyBatis的CRUD操作2

2 删除

删除,修改与增加中的参数绑定部分与1 查询中的一致,此处及后续章节不再赘述。

在MyBatis中的删除标签是:

<delete id="xxxYyyZzz" parameterType="xyz">
    Delete SQL    
</delete>

还是以查询中的测试用例:

DAO接口:

void deleteUser(@Param("id") int id);

Mapper.xml配置文件:

<delete id="deleteUser" parameterType="int">
    delete from t_user
    where id=#{id}
</delete>

测试方法:

 

mapper.deleteUser(1);

运行测试程序发现,测试程序虽然能够正常执行,但是数据库中id=1的数据并没有被删除

 

原因是由于MyBatis默认将autocommit设置为false,需要手动进行commit或rollback来进行事务控制。

在最后增加一条:

sqlSession.commit();

进行手动事务提交操作,此时数据库中id为1的数据便被删除掉了。

 

当然也可以进行手动事务回滚操作:

mapper.deleteUser(2);
sqlSession.rollback();

id等于2的数据没有被删除。

 

3 修改

在MyBatis中的修改标签是:

<update id="xxxYyyZzz" parameterType="xyz">
    Update SQL    
</update>

还是以查询中的测试用例:

DAO接口:

void updateUser(User user);

Mapper.xml配置文件:

<update id="updateUser" parameterType="User">
    update  t_user
    set username=#{username},password=#{password},gender=#{gender},regist_time=#{registerTime}
    where id=#{id}
</update>

测试方法:

User user = new User(2, "TestUpdate", "TestUpdate", 1, new Date());

mapper.updateUser(user);
sqlSession.commit();

测试完毕发现数据库中的数据已经改变

 

4 增加

在MyBatis中的增加标签是:

<insert id="xxxYyyZzz" parameterType="xyz">
    Insert SQL    
</insert>

还是以查询中的测试用例:

DAO接口:

void addUser(User user);

Mapper.xml配置文件:

 

<insert id="addUser" parameterType="User">
    insert into t_user
    values(#{id},#{username},#{password},#{gender},#{registerTime})
</insert>

如果是自动增长主键,例如此处的#{id},可以填写为NULL。

测试方法:

User user = new User(null, "TestInsert", "TestInsert", 1, new Date());

mapper.addUser(user);
sqlSession.commit();

测试完毕发现数据库中的数据已经改变。

 

注意:删除、修改、增加的测试用例中的测试方法都是用的void返回类型,如果需要,可以将返回值改成Integerint获取此次操作影响的行数

5 主键回填

在 4 的增加操作中,执行完毕以后数据库虽然存在刚刚增加的数据,但是存在一个问题:

在数据库表中,新增了一行id列值为4的数据,但是在Java对象中,id属性的值仍然为null。此时Java中的O与数据库中的R并不能一一对应。

在测试方法中增加一条打印语句可以看到输出为null,表明此时的user对象的id属性仍然为null

User user = new User(null, "TestInsert", "TestInsert", 1, new Date());

mapper.addUser(user);
sqlSession.commit();
 
System.out.println(user.getId());

// null

与数据库中的id为4不对应,解决这一问题则需要运用主键回填。

 

5.1 last_insert_id()

last_insert_id()是MySQL中的一个函数,可以获取最后一次插入数据的id,完美契合整数自增类型主键回填的需求。将Mapper.xml配置文件修改为:

<insert id="addUser" parameterType="User">
    <selectKey order="AFTER" resultType="int" keyProperty="id">
        select last_insert_id();
    </selectKey>
    insert into t_user
    values(#{id},#{username},#{password},#{gender},#{registerTime})  
</insert>

其中,

  • order:表明被selectKey标签包裹的SQL语句是要在插入之后执行;

  • resultType:表明返回的结果类型是一个int类型;

  • keyProperty:表明查询到之后要回填到id属性,注意,此处的id是Java对象user的id属性

再次执行测试,此时已经能够打印出id:

User user = new User(null, "TestInsert", "TestInsert", 1, new Date());

mapper.addUser(user);
sqlSession.commit();
 
System.out.println(user.getId());
// 6

表中的数据:

5.2 uuid()

last_insert_id()一样,uuid()也是MySQL中的一个函数,可以生成一个32位长的全球唯一的字符串。可以保证即便是在两台不同计算机上的两张表,任何时间生成的主键都是唯一的。

直接执行select uuid()查看效果:

每次执行都可以获得不同的结果,并且除去“-”后是32位字符。

接下来执行测试。

重新创建一张学生表,主键为字符类型

CREATE TABLE t_student(
    id VARCHAR(32) PRIMARY KEY,
    name VARCHAR(50), 
    gender TINYINT
)DEFAULT CHARSET =utf8;

实体类:

public class Student {
    private String id;
    private String name;
    private Boolean gender;

    public Student() {
    }
    ......

DAO接口:

public interface StudentDao {
    void addStudent(Student student);
}

 配置Mapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qianglj.test1.dao.StudentDao">
    <insert id="addStudent" parameterType="Student">
    	<selectKey order="BEFORE" keyProperty="id" resultType="string">
            select replace(uuid(),'-','')
        </selectKey>
        insert into t_student
        values (#{id},#{name},#{gender})
    </insert>
</mapper>
  • order属性一定要是"BEFORE",表示先生成一个uuid值,再进行插入。否则id的值为空,SQL语句错误。

  • replace()函数代表将uuid中的“-”替换为空字符。否则的话uuid的实际长度会超过建表时规定的32位,SQL语句错误。

配置完毕后不要忘记取MyBatis注册刚刚配置的xml:

<!--注册Mapper文件-->
<mappers>
    <mapper resource="UserDAOMapper.xml"/>
    <mapper resource="StudentDAOMapper.xml"/>
</mappers>

测试方法:

//1. 加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
 
//2. 构建SqlSessionFactory    --核心API
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//3. 通过SqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

//4.通过SqlSession获得Dao实现类的对象
StudentDao studentMapper = sqlSession.getMapper(StudentDao.class);
Student mike = new Student(null, "Mike", true);
studentMapper.addStudent(mike);
sqlSession.commit();

System.out.println(mike.getId());

//a20e0313eb2511ec99831c697abd2bd2

测试结果:数据成功插入,并且主键也被回填。

6 定义复杂的映射规则

MaBatis的同名映射不能满足需求时,可以在Mapper.xml中定义复杂的映射规则:

    <resultMap id="user_resultMap" type="User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="gender" property="gender"/>
        <result column="regist_time" property="registerTime"/>
    </resultMap>
  • <resultMap id="user_resultMap" type="User">

    • id:标识,后续通过id来使用此resultMap

    • type:要封装的数据类型

  • <id column="id" property="id"/>

    • id标签,专门为主键列准备

    • column:数据库中的列名

    • property:JavaBean中的属性名

使用:

将Mapper.xml中select标签中的resultType修改为resultMap,并将定义的id填入即可:

    <select id="queryUserById" resultMap="user_resultMap">
        select id,username,password,gender,regist_time
        from t_user
        where id=#{id}
    </select>

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/framework/mybatis/1927/mybatis_crud_2/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录