target
掌握 select 标签的使用
掌握 insert 标签的使用
掌握 update 标签的使用
掌握 delete 标签的使用
掌握 sql 标签的使用
1.
在 SQL 映射文件中 元素用于映射 SQL 的 select 语句,其示例代码如下:
select * from user where uid = #{uid}
在上述示例代码中,id 的值是唯一标识符,它接收一个 Integer 类型的参数,返回一个 User 类型的对象,结果集自动映射到 User 属性。
元素除了有上述示例代码中的几个属性以外,还有一些常用的属性,如表所示。
属性名称 | 描 述 |
---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 |
parameterType | 表示传入 SQL 语句的参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数 |
resultType | SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一 |
resultMap | 它是映射集的引用,与 元素一起使用,返回时可以使用 resultType 或 resultMap 之一 |
flushCache | 用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存,默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存 |
useCache | 启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中 |
timeout | 用于设置超时参数,单位是秒(s),超时将抛出异常 |
fetchSize | 获取记录的总条数设定 |
statementType | 告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement) |
resultSetType | 这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新) |
2.
元素用于映射插入语句,MyBatis 执行完一条插入语句后将返回一个整数表示其影响的行数。它的属性与
元素的属性大部分相同,在本节讲解它的几个特有属性。
- keyProperty:该属性的作用是将插入或更新操作时的返回值赋给 PO 类的某个属性,通常会设置为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。
- keyColumn:该属性用于设置第几列是主键,当主键列不是表中的第 1 列时需要设置。如果是联合主键,可以将多个值用逗号隔开。
- useGeneratedKeys:该属性将使 MyBatis 使用 JDBC 的 getGeneratedKeys()方法获取由数据库内部产生的主键,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。
1)主键(自动递增)回填
MySQL、SQL Server 等数据库的表格可以采用自动递增的字段作为主键,有时可能需要使用这个刚刚产生的主键,用于关联其他业务。
首先为 com.mybatis 包中的 SQL 映射文件 UserMapper.xml 中 id 为 addUser 的 元素添加 keyProperty 和 useGeneratedKeys 属性,具体代码如下:
insert into user (uname,usex) values(#{uname},#{usex})
然后在 com.mybaits.test 包的 MybatisTest 类中进行调用,具体代码如下:
@Test
public void testAdd() {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User(null,"李四","男");
// 添加一个用户
int add = userMapper.addUser(user );
System.out.println("添加了" + add + "条数据!");
System.out.println("添加记录的主键是" + user.getUid());
// 提交事务
session.commit();
}
useGeneratedKeys设置为true,当添加成功时,会把自增的主键值带回来赋值给keyProperty的uid,所以程序可以获取到uid的值。
2)自定义主键
如果在实际工程中使用的数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,可以使用 MyBatis 的 元素来自定义生成主键。
-
keyProperty 属性指定了新生主键值返回给 PO 类(com.po.User)的哪个属性。
-
order 属性可以设置为 BEFORE 或 AFTER。
- BEFORE 表示先执行
元素然后执行插入语句。
- AFTER 表示先执行插入语句再执行 元素。
- BEFORE 表示先执行
① 方法一:
select if(max(uid) is null,1,max(uid)+1) as newUid from user
insert into user (uid,uname,usex) values(#{uid},#{uname},#{usex})
在执行上述示例代码时, 元素首先被执行,该元素通过自定义的语句设置数据表的主键,然后执行插入语句。
② 方法二:
使用Oracle的序列:user_seq.nextval
select user_seq.nextval from dual
insert into user (uid,uname,usex) values(#{uid},#{uname},#{usex})
在执行上述示例代码时, 元素首先被执行,该元素通过自定义的语句设置数据表的主键,然后执行插入语句。
③ 方法三:(不推荐)
使用Oracle的序列:user_seq.currval
select user_seq.currval from dual
insert into user (uid,uname,usex) values(user_seq.nextval,#{uname},#{usex})
在执行上述示例代码时,先执行插入语句, 元素随后被执行。
3. 与元素
和
元素比较简单,它们的属性和
元素、
元素的属性差不多,执行后也返回一个整数,表示影响了数据库的记录行数。配置示例代码如下:
update user set uname = #{uname},usex = #{usex} where uid = #{uid}
delete from user where uid = #{uid}
4. 元素
元素的作用在于可以定义 SQL 语句的一部分(代码片段),以方便后面的 SQL 语句引用它,例如反复使用的列名。
在 MyBatis 中只需使用 元素编写一次便能在其他元素中引用它。配置示例代码如下:
id,uname,usex
select from user
在上述代码中使用 元素的 refid 属性引用了自定义的代码片段。