이전 기사 "Mybatis 시리즈 심층 소개(6)---objectFactory, 플러그인, 매퍼 소개 및 구성"에서는 mybatis 구성을 간단하게 마무리했습니다. 그래서 이번 글부터 매퍼 매핑 파일의 구성을 소개하겠습니다. 이는 마이바티스의 핵심 중 하나이며, 잘 익혀야 합니다. 매퍼 파일에서 매퍼를 루트 노드로 하고 그 아래에 구성할 수 있는 요소 노드는 선택, 삽입, 업데이트, 삭제, 캐시, 캐시 참조, 결과 맵, sql입니다.
이 글에서는 삽입, 업데이트, 삭제의 구성과 사용법을 간략하게 소개하고, 앞으로는 마이바티스의 소스코드에 대해 심도있게 설명하겠습니다.
삽입, 업데이트, 삭제를 보면 그 기능을 알 수 있을 것이라고 믿습니다. 이름에서 알 수 있듯이 myabtis는 지속성 계층 프레임워크로서 CRUD를 처리해야 합니다.
그럼 먼저 삽입, 업데이트, 삭제를 구성하는 방법과 어떤 요소를 구성할 수 있는지 살펴보겠습니다.
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <!-- mapper 为根元素节点, 一个namespace对应一个dao --><mapper namespace="com.dy.dao.UserDao"> <insert <!-- 1. id (必须配置) id是命名空间中的唯一标识符,可被用来代表这条语句。 一个命名空间(namespace) 对应一个dao接口, 这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致 --> id="insertUser" <!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理) 将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理 parameterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象) --> parameterType="com.demo.User" <!-- 3. flushCache (可选配置,默认配置为true) 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句) --> flushCache="true" <!-- 4. statementType (可选配置,默认配置为PREPARED) STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 --> statementType="PREPARED" <!-- 5. keyProperty (可选配置, 默认为unset) (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 --> keyProperty="" <!-- 6. keyColumn (可选配置) (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 --> keyColumn="" <!-- 7. useGeneratedKeys (可选配置, 默认为false) (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 --> useGeneratedKeys="false" <!-- 8. timeout (可选配置, 默认为unset, 依赖驱动) 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 --> timeout="20"> <update id="updateUser" parameterType="com.demo.User" flushCache="true" statementType="PREPARED" timeout="20"> <delete id="deleteUser" parameterType="com.demo.User" flushCache="true" statementType="PREPARED" timeout="20"></mapper>
위는 템플릿입니다. 구성, 어떤 구성이 필요한지, 어떤 구성이 실제 요구에 따른 것인지 한눈에 알 수 있습니다.
다음으로 첫 번째 기사 "Mybatis 시리즈 심층 소개(1)---Mybatis 시작하기"의 데모를 예로 들어 보겠습니다.
데이터베이스(사용자 테이블) :
내 프로젝트 구조:
User.java :
package com.dy.entity;public class User { private int id; private String name; private String password; private int age; private int deleteFlag; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getDeleteFlag() { return deleteFlag; } public void setDeleteFlag(int deleteFlag) { this.deleteFlag = deleteFlag; } }
UserDao.java:
package com.dy.dao;import com.dy.entity.User;public interface UserDao { public void insertUser (User user); public void updateUser (User user); public void deleteUser (User user); }
userDao.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.dy.dao.UserDao"> <!-- 对应userDao中的insertUser方法, --> <insert id="insertUser" parameterType="com.dy.entity.User"> insert into user(id, name, password, age, deleteFlag) values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag}) </insert> <!-- 对应userDao中的updateUser方法 --> <update id="updateUser" parameterType="com.dy.entity.User"> update user set name = #{name}, password = #{password}, age = #{age}, deleteFlag = #{deleteFlag} where id = #{id}; </update> <!-- 对应userDao中的deleteUser 方法 --> <delete id="deleteUser" parameterType="com.dy.entity.User"> delete from user where id = #{id}; </delete></mapper>
이렇게 간단한 매핑 관계가 성립됩니다. 위의 ParameterType인 "com.dy.entity.User"를 주의 깊게 관찰하세요. 패키지 이름이 길다면 매번 이렇게 쓰여서 쓰기가 힘들 것입니다. 앞에서 언급한 typeAliases(별칭)을 잊지 마세요. 따라서 여기서 별칭을 사용한다는 것은 고통스러울 만큼 긴 패키지 이름에 작별을 고한다는 의미가 아닐까요? 그럼 별칭을 맞춰보자. 어디에서 맞춰야 할까? 물론 이는 mybatis의 전역 구성 파일에 있습니다(여기서 제 이름은 mybatis-conf.xml입니다). 이것이 매퍼 구성 파일에 구성되어 있다고 생각하지 마십시오.
mybatis-conf.xml:
<typeAliases> <!-- 通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的javabean, 并且默认设置一个别名,默认的名字为: javabean 的首字母小写的非限定类名来作为它的别名。 也可在javabean 加上注解@Alias 来自定义别名, 例如: @Alias(user) <package name="com.dy.entity"/> --> <typeAlias alias="user" type="com.dy.entity.User"/> </typeAliases>
이런 식으로 위의 com.dy.entity.User 별칭을 모두 추가할 수 있습니다. 사용자로 직접 변경됩니다. 이 얼마나 편리한가!
여기 내 데이터베이스는 mysql을 사용합니다. 사용자 테이블의 기본 키 ID를 자동으로 늘리도록 설정했습니다. 위 코드는 정상적으로 실행되므로 문제가 발생합니다(물론 어떤 굴삭기인지는 묻지 않습니다). 회사 Strong), Oracle 데이터베이스로 전환하면 어떻게 되나요? 오라클은 ID 자체 증가를 지원하지 않습니까? 무엇을 해야 할까요? 아래를 참조하세요:
아아앙同理,如果我们在使用mysql的时候,想在数据插入后返回插入的id, 我们也可以使用 selectKey 这个元素:
<!-- 对应userDao中的insertUser方法, --> <insert id="insertUser" parameterType="com.dy.entity.User"> <!-- oracle等不支持id自增长的,可根据其id生成策略,先获取id <selectKey resultType="int" order="BEFORE" keyProperty="id"> select seq_user_id.nextval as id from dual </selectKey> --> <!-- mysql插入数据后,获取id --> <selectKey keyProperty="id" resultType="int" order="AFTER" > SELECT LAST_INSERT_ID() as id </selectKey> insert into user(id, name, password, age, deleteFlag) values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag}) </insert>
这儿,我们就简单提一下
<selectKey <!-- selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 --> keyProperty="id" <!-- 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 --> resultType="int" <!-- 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。 --> order="BEFORE" <!-- 与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。 --> statementType="PREPARED">
以上就是深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete的内容,更多相关内容请关注PHP中文网(www.php.cn)!