美文网首页hibernate mybatis
二 . mybatis映射文件

二 . mybatis映射文件

作者: 任未然 | 来源:发表于2019-09-29 20:08 被阅读0次

一、概要

本节来盘一下MyBatis中的insert、update、delete和sql元素

二、insert

说明

<insert>元素用于映射插入语句,MyBatis 执行完一条插入语句后将返回一个整数表示其影响的行数。属性与<select>元素的属性大部分相同,但有几个特有属性。

属性 作用
keyProperty 该属性的作用是将插入或更新操作时的返回值赋给类的某个属性,通常会设置为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。
keyColumn 该属性用于设置第几列是主键,当主键列不是表中的第 1 列时需要设置。如果是联合主键,可以将多个值用逗号隔开。
useGeneratedKeys 该方法获主要用于获取由数据库内部产生的主键,需要数据库支持 比如MySQL、SQL Server 等自动递增的字段,其默认值为 false。

1、自增主键

说明

该属性将使 MyBatis 使用JDBC的getGeneratedKeys(),如: **MySQL、PostgreSQL、SQL Server **等数据库的表可以采用自动递增的字段作为主键,有时可能需要使用这个刚刚产生的主键,用于关联其他业务。

栗子

定义接口 InsertMapper.java

public interface InsertMapper {
    /**
     * 保存对象
     * @param user 声明参数
     * @return 默认返回影响的行数
     */
    int save(@Param("user") User user);
}

定义接口实现 InsertMapper.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.vip.mybatis.mapper.InsertMapper">
    <!-- keyProperty的值跟对应的Bean的主键 -->
    <!-- 联合主键使用,隔开(了解就行) -->
    <insert id="save" keyProperty="uid" useGeneratedKeys="true">
        INSERT INTO user(name, password, phone, email)
        VALUES (#{user.name},#{user.password},#{user.phone},#{user.email});
    </insert>
</mapper>

测试代码

public class App {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder()
                .build(App.class
                        .getClassLoader()
                        .getResourceAsStream("mybatis-config.xml"));
        // 1.开启事务 (实战中使用Spring的事务来管理)
        SqlSession sqlSession = factory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findById(1);
        System.out.println(user);
        InsertMapper insert = sqlSession.getMapper(InsertMapper.class);
        user = new User("test", "123456", "10000", "10000@qq.com");
              System.out.println("执行前" + user.getUid());
        insert.save(user);
        // 2. 从对象中获取自动生成的主键 
        System.out.println("执行后" + user.getUid());
    }
}

其它方式(了解)

<!-- 方式二 通过 子元素 selectKey -->
<insert id="save1" parameterType="User">
  INSERT INTO user(name, password, phone, email)
  VALUES (#{user.name},#{user.password},#{user.phone},#{user.email});
  <!--  order="AFTER"   表示执行完上面的SQL语句再执行这 selectKey  BEFORE 与之相反-->
  <selectKey keyProperty="user.uid" resultType="integer" order="AFTER">
    SELECT last_insert_id() AS uid;
  </selectKey>
</insert>

2、自定义主键

说明

在实际开发中如果使用的数据库不支持主键自动递增( Oracle),或者取消了主键自动递增的规则,可以使用 MyBatis 的 <selectKey>元素来自定义生成主键

栗子

SQL

CREATE TABLE test(
    -- 不自动增长
    id  String PRIMARY KEY,
    name VARCHAR(64)
);

定义接口TestMapper.java

public interface TestMapper {
    public int add(@Param("test") Test test);
}

接口实现TestMapper.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.vip.mybatis.mapper.TestMapper">
    <insert id="add">
        <!-- 说明 test.id  test 对应接口参数名字;如果不是对象 直接使用参数名字 -->
        <selectKey keyProperty="test.id" resultType="string" order="BEFORE">
            SELECT replace(uuid(),'-','') FROM dual
        </selectKey>
        INSERT INTO test(id, name) VALUES (#{test.id},#{test.name})
    </insert>
</mapper>

oracle

<insert id="add">
    <selectKey keyProperty="test.id" resultType="long" order="BEFORE">
    <!-- oracle 12 之前只能通过序列来生成自增注解-->
    <!-- seq_test 序列对象 -->
    <!-- 创建序列 CREATE SEQUENCE seq_test;-->
     SELECT seq_test() FROM dual
    </selectKey>
        INSERT INTO test(id, name) VALUES (#{test.id},#{test.name})
</insert>

3、总结

<selectKey> 元素

  • keyProperty: 属性指定了新生主键值返回给 PO 类(User)的哪个属性。如果是基本类型 直接使用参数名字
  • order: 属性可以设置为 BEFORE 或 AFTER。
    • BEFORE 表示先执行 <selectKey> 元素然后执行插入语句。
    • AFTER 表示先执行插入语句再执行 <selectKey>元素。
  • resultType: 表示返回的基本类型,

三、update 与delete

说明

updatedelete元素比较简单,它们的属性和 <insert>元素、<select>元素的属性差不多,执行后也返回一个整数,表示影响了数据库的记录行数。

栗子

定义接口 UpdateAndDeleteMapper.java

public interface UpdateAndDeleteMapper {
    int update(@Param("user") User user);
    int update(@Param("uid") int uid);
}

接口实现 UpdateAndDeleteMapper.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.vip.mybatis.mapper.UpdateAndMapper">
    <update id="update">
        UPDATE user u SET u.name=#{user.name} WHERE u.uid=#{user.uid}
    </update>
    <delete id="delete">
        <!-- 建议使用假删除 -->
        DELETE FROM user u WHERE u.uid=#{uid}
    </delete>
</mapper>

四、SQL和include元素

说明

编写一些语句片段<SQL>标签,然后在其他语句标签汇中用<include>引用,这样可以是SQL语句片段得到重用

栗子

定义接口

public interface SqlMapper {
    public User findById(@Param("uid") int uid);
}

定义接口实现

<?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.vip.mybatis.mapper.SqlMapper">
    <sql id="column">uid,name,password</sql>
    <sql id="select_where">where status=1</sql>
    <select id="findById" resultType="User">
        SELECT
        <include refid="column"/>
        FROM user u WHERE u.uid = #{uid} AND
        <include refid="select_where"/>
    </select>
</mapper>

总结

  • <sql>用来封装SQL语句
  • <include>来调用

相关文章

网友评论

    本文标题:二 . mybatis映射文件

    本文链接:https://www.haomeiwen.com/subject/tpxsyctx.html