原文地址:http://www.cnblogs.com/dongying/p/4048828.html

在mapper文件中,以mapper作为根节点,其下面可以配置的元素节点有: select, insert, update, delete, cache, cache-ref, resultMap, sql 。

本篇文章将简单介绍 insert, update, delete 的配置及使用,以后会对mybatis的源码进行深入讲解。

相信,看到insert, update, delete,我们就知道其作用了,顾名思义嘛,myabtis 作为持久层框架,必须要对CRUD啊。

好啦,咱们就先来看看 insert, update, delete 怎么配置,能配置哪些元素吧:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
  4. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
  5.  
  6. <!-- mapper 为根元素节点, 一个namespace对应一个dao -->
  7. <mapper namespace="com.dy.dao.UserDao">
  8.  
  9.     <insert
  10.       <!-- 1. id (必须配置)
  11.         id是命名空间中的唯一标识符,可被用来代表这条语句。
  12.         一个命名空间(namespace) 对应一个dao接口,
  13.         这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致 -->
  14.  
  15.       id="insertUser"
  16.  
  17.       <!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理)
  18.         将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理
  19.         parameterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象) -->
  20.  
  21.       parameterType="com.demo.User"
  22.  
  23.       <!-- 3. flushCache (可选配置,默认配置为true)
  24.         将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句) -->
  25.  
  26.       flushCache="true"
  27.  
  28.       <!-- 4. statementType (可选配置,默认配置为PREPARED)
  29.         STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 -->
  30.  
  31.       statementType="PREPARED"
  32.  
  33.       <!-- 5. keyProperty (可选配置, 默认为unset)
  34.         (仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 -->
  35.  
  36.       keyProperty=""
  37.  
  38.       <!-- 6. keyColumn (可选配置)
  39.         (仅对 insert 和 update 有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 -->
  40.  
  41.       keyColumn=""
  42.  
  43.       <!-- 7. useGeneratedKeys (可选配置, 默认为false)
  44.         (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 -->
  45.  
  46.       useGeneratedKeys="false"
  47.  
  48.       <!-- 8. timeout (可选配置, 默认为unset, 依赖驱动)
  49.         这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 -->
  50.       timeout="20">
  51.  
  52.     <update
  53.       id="updateUser"
  54.       parameterType="com.demo.User"
  55.       flushCache="true"
  56.       statementType="PREPARED"
  57.       timeout="20">
  58.  
  59.     <delete
  60.       id="deleteUser"
  61.       parameterType="com.demo.User"
  62.       flushCache="true"
  63.       statementType="PREPARED"
  64.       timeout="20">
  65. </mapper>

以上就是一个模板配置,哪些是必要配置,哪些是根据自己实际需求,看一眼就知道了。

下面,还是用第一篇文章《深入浅出Mybatis系列(一)---Mybatis入门》里面的demo来示例吧:

数据库(user表):

我项目结构:

User.java:

  1. package com.dy.entity;
  2.  
  3. public class User {
  4.  
  5.     private int id;
  6.     private String name;
  7.     private String password;
  8.     private int age;
  9.     private int deleteFlag;
  10.  
  11.     public int getId() {
  12.         return id;
  13.     }
  14.     public void setId(int id) {
  15.         this.id = id;
  16.     }
  17.     public String getName() {
  18.         return name;
  19.     }
  20.     public void setName(String name) {
  21.         this.name = name;
  22.     }
  23.     public String getPassword() {
  24.         return password;
  25.     }
  26.     public void setPassword(String password) {
  27.         this.password = password;
  28.     }
  29.     public int getAge() {
  30.         return age;
  31.     }
  32.     public void setAge(int age) {
  33.         this.age = age;
  34.     }
  35.     public int getDeleteFlag() {
  36.         return deleteFlag;
  37.     }
  38.     public void setDeleteFlag(int deleteFlag) {
  39.         this.deleteFlag = deleteFlag;
  40.     }
  41.  
  42. }

UserDao.java:

  1. package com.dy.dao;
  2.  
  3. import com.dy.entity.User;
  4.  
  5. public interface UserDao {
  6.  
  7.     public void insertUser (User user);
  8.  
  9.     public void updateUser (User user);
  10.  
  11.     public void deleteUser (User user);
  12.  
  13. }

userDao.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
  4. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
  5.  
  6. <mapper namespace="com.dy.dao.UserDao">
  7.  
  8.    <!-- 对应userDao中的insertUser方法, -->
  9.    <insert id="insertUser" parameterType="com.dy.entity.User">
  10.            insert into user(id, name, password, age, deleteFlag)
  11.                values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
  12.    </insert>
  13.  
  14.    <!-- 对应userDao中的updateUser方法 -->
  15.    <update id="updateUser" parameterType="com.dy.entity.User">
  16.            update user set name = #{name}, password = #{password}, age = #{age}, deleteFlag = #{deleteFlag}
  17.                where id = #{id};
  18.    </update>
  19.  
  20.    <!-- 对应userDao中的deleteUser 方法 -->
  21.    <delete id="deleteUser" parameterType="com.dy.entity.User">
  22.            delete from user where id = #{id};
  23.    </delete>
  24. </mapper>

这样,一个简单的映射关系就建立了。仔细观察上面parameterType,  "com.dy.entity.User",包名要是再长点呢,每次都这样写,写得蛋疼了。别忘了之前讲的 typeAliases(别名),那么这个地方,用上别名,岂不是技能跟蛋疼的长长的包名说拜拜了。好啦,咱们配上别名,在哪儿配?当然是在mybatis 的全局配置文件(我这儿名字是mybatis-conf.xml),不要认为是在mapper的配置文件里面配置哈。

mybatis-conf.xml:

  1. <typeAliases>
  2.       <!--
  3.       通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的javabean,
  4.       并且默认设置一个别名,默认的名字为: javabean 的首字母小写的非限定类名来作为它的别名。
  5.       也可在javabean 加上注解@Alias 来自定义别名, 例如: @Alias(user)
  6.       <package name="com.dy.entity"/>
  7.        -->
  8.       <typeAlias alias="user" type="com.dy.entity.User"/>
  9.   </typeAliases>

这样,一个别名就取好了,咱们可以把上面的 com.dy.entity.User 都直接改为user 了。这多方便呀!

我这儿数据库用的是mysql, 我把user表的主键id 设置了自动增长,以上代码运行正常,那么问题来了(当然,我不是要问学挖掘机哪家强),我要是换成oracle数据库怎么办? oracle 可是不支持id自增长啊?怎么办?请看下面:

  1. <!-- 对应userDao中的insertUser方法, -->
  2.    <insert id="insertUser" parameterType="com.dy.entity.User">
  3.            <!-- oracle等不支持id自增长的,可根据其id生成策略,先获取id
  4.  
  5.         <selectKey resultType="int" order="BEFORE" keyProperty="id">
  6.               select seq_user_id.nextval as id from dual
  7.         </selectKey>
  8.  
  9.         -->
  10.            insert into user(id, name, password, age, deleteFlag)
  11.                values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
  12.    </insert>
  13.  

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。不过,在mysql和oracle中,一般用不上这种方式。可以了解。

  1. <!-- 对应userDao中的insertUser方法, -->
  2.    <insert id="insertUser" parameterType="com.dy.entity.User">
  3.            <!-- oracle等不支持id自增长的,可根据其id生成策略,先获取id
  4.  
  5.         <selectKey resultType="int" order="BEFORE" keyProperty="id">
  6.               select seq_user_id.nextval as id from dual
  7.         </selectKey>
  8.  
  9.         -->
  10.  
  11.         <!-- mysql插入数据后,获取id -->
  12.         <selectKey keyProperty="id" resultType="int" order="AFTER" >
  13.                SELECT LAST_INSERT_ID() as id
  14.            </selectKey>
  15.  
  16.            insert into user(id, name, password, age, deleteFlag)
  17.                values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
  18.    </insert>

这儿,我们就简单提一下 <selectKey> 这个元素节点吧:

  1. <selectKey
  2.         <!-- selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 -->
  3.         keyProperty="id"
  4.         <!-- 结果的类型。MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什么问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 -->
  5.         resultType="int"
  6.         <!-- 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。 -->
  7.         order="BEFORE"
  8.         <!-- 与前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 语句的映射类型,分别代表 PreparedStatement 和 CallableStatement 类型。 -->
  9.         statementType="PREPARED">

好啦,本篇文章主要介绍了insert, update, delete的配置及用法。

注意:使用mysql的的时候一般不是这样的,应该是设置useGeneratedKeys="true", keyProperty="id",然后不传入id,如下:

  1. <insert id="insert" parameterType="Spares"
  2. useGeneratedKeys="true" keyProperty="id">
  3. insert into system(name) values(#{name})
  4. </insert>

然后在java代码中获取刚才插入的id:

  1. int count = systemService.insert(systemBean);
  2. int id = systemBean.getId(); //获取到的即为新插入记录的ID

其中,keyProperty一定得和java对象的属性名称一直,而不是表格的字段名。

mapper映射文件配置之insert、update、delete(转载)的更多相关文章

  1. 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete

    上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介 ...

  2. 深入浅出Mybatis系列七-mapper映射文件配置之insert、update、delete

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(六)---objectFactory.p ...

  3. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  4. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  5. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  6. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  7. mapper映射文件配置之select、resultMap(转载)

    原文地址:http://www.cnblogs.com/dongying/p/4073259.html 先看select的配置吧: <select         <!-- 1. id ( ...

  8. Mybatis将mapper映射文件配置到recources下

    关于为什么要将Mybatis的mappers.xml文件配置到resources目录下的粗浅看法: (1).使文件目录更加清晰.resources文件目录下通常为配置文件,所以将Mappers.xml ...

  9. 关于MyBatis mapper的insert, update, delete返回值

    这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...

随机推荐

  1. web开发(九) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6506027.html>,在此仅供学习参考之用. 一.发送 ...

  2. Nova rebuild for boot from volume issue

    目录 文章目录 目录 Nova boot from volume Rebuild Instance Rebuild for boot from volume Nova boot from volume ...

  3. DateTime相关

    1.string数据转成datetime DateTimeFormatter forPattern = DateTimeFormat.forPattern("yyyyMMddHH" ...

  4. Scratch少儿编程系列:(十一)Scratch编程之简单见解

    一.Scratch官网的说明     With Scratch, you can program your own interactive stories, games, and animations ...

  5. USACO1.6 Healthy Holsteins【dfs/bfs 爆搜】

    题目传送门 饲料种数只有15 枚举每种选或不选一共也就只有$2^{15}=32768$ 爆搜可过觉得bfs要快一些? 但是dfs更方便处理字典序 只需要顺序遍历并且先搞选它的情况就可以了 而且在这种规 ...

  6. Linux执行命令./command与直接输入命令的区别

    我们知道查看文件属性的命令ls的完整文件路径为:/bin/ls(这是绝对路径,)问什么我可以在任何地方执行,任何目录下输入ls就一定可以显示出一些信息而不会说找不到该/bin/ls命令,这是因为不同的 ...

  7. python 并发编程目录

    操作系统介绍 操作系统发展史 进程理论 多进程 多线程 协程 io模型

  8. 软考题型—PERT图(项目计划评审技术)

    经历过软件危机和大量软件项目的失败,人们对软件工程产业现状进行分析后,得出普遍性结论便是:软件项目成功率低的原因很可能就是项目管理能力太弱.由于软件本身的特殊性和复杂性,将项目管理思想引入软件工程领域 ...

  9. Python爬虫之简单的爬取百度贴吧数据

    首先要使用的第类库有 urllib下的request  以及urllib下的parse  以及 time包  random包 之后我们定义一个名叫BaiduSpider类用来爬取信息 属性有 url: ...

  10. RabbitMQ入门教程(七):主题交换机Topics

    原文:RabbitMQ入门教程(七):主题交换机Topics 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...