一、概要
本节来盘一下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>
元素。
- BEFORE 表示先执行
- resultType: 表示返回的基本类型,
三、update 与delete
说明
update和 delete元素比较简单,它们的属性和
<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>
来调用
网友评论