对于不同的声明风格,MyBatis提供了多个参数,例如:SELECT、INSERT、UPDATE和DELETE。让我们看看这些是如何配置的。

1. 声明INSERT

我们在Mapper XML的文件中使用<insert>来配置INSERT的语言。如下:

<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>

在这儿,我们给出了inSertStudent作为ID,这个可以关联的独有的命名空间是:com.owen.mybatis.mappers.StuentMapper.insertStudent.我们定义的parameterType的属性值必须是完整的限定名,或是别名。我们可以执行上面的代码如下:

 int count =
sqlSession.insert("com.owen.mybatis.mappers.StudentMapper.insertStuden
t", student);

这个sqlSession.insert()方法返回的数值就是插入的行数。取代上面通过命名空间和声明的ID,你可以创建一个Mapper的接口和调用的方式如下:

 package com.owen.mybatis.mappers;
public interface StudentMapper
{
int insertStudent(Student student);
}

你可以调用的insertStudent映射声明如下:

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int count = mapper.insertStudent(student);

这样的方式比Hibernate好用了,不是使用固定的格式,而是通过自己的想法至尊命名,然后去调用。

2. 自动生成Key

在前面的INSERT声明中,我们插入STUDENT的表时,使用了自己手动的STUD_ID作为主键的列值。其实我们可以应用一个useGeneratedKeys和keyProperty属性来生成auto_increment列的值,而将生成的值赋予给STUD_ID.

<insert id="insertStudent" parameterType="Student"
useGeneratedKeys="true" keyProperty="studId">
INSERT INTO STUDENTS(NAME, EMAIL, PHONE)
VALUES(#{name},#{email},#{phone})
</insert>

这里的STUD_ID值将会由MySQL数据库自动生成,而且生成的值将会给student对象的参数studId。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
mapper.insertStudent(student);

现在你可以获取STUD_ID的值:

int studentId = student.getStudId();

一些数据库,如Oracle不能够提供AUTO_INCREMENT列和运用SEQUENCE去创建主键的值。现在,我们拥有一个SEQUENCE名称为STUD_ID_SEQ去生成STUD_ID的主键值。运用的代码如下:

<insert id="insertStudent" parameterType="Student">
<selectKey keyProperty="studId" resultType="int" order="BEFORE">
SELECT ELEARNING.STUD_ID_SEQ.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE)
VALUES(#{studId},#{name},#{email},#{phone})
</insert>

这里我们运用了<selectKey>的子元素去生成一个主键的值,并且储蓄它在Student对象的studId的属性中。我们设置属性order=”BEFORE”,这个说明MyBatis在执行INSERT之前,会先对已有的主键进行排序,然后将主键储蓄到studId中。

当然, 我们也可以用触发器来设置主键值,可以从序列中获得一个主键值,并将其设置为主键的列值插入到查询中。如果你使用这个方法,你可以用下面的代码:

<insert id="insertStudent" parameterType="Student">
INSERT INTO STUDENTS(NAME,EMAIL, PHONE)
VALUES(#{name},#{email},#{phone})
<selectKey keyProperty="studId" resultType="int" order="AFTER">
SELECT ELEARNING.STUD_ID_SEQ.CURRVAL FROM DUAL
</selectKey>
</insert>

3. 声明UPDATE

UPDATE的声明可以使用<update>的元素配置在MapperXML文件中。

<update id="updateStudent" parameterType="Student">
UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, PHONE=#{phone}
WHERE STUD_ID=#{studId}
</update>

我们可以使用如下的代码来调用声明:

int noOfRowsUpdated =
sqlSession.update("com.owen.mybatis.mappers.StudentMapper.updateStudent",
student);

通过UPDATE的声明,sqlSession().update()方法将会返回受影响的行。

这里我们就不使用声明的命名空间和声明的id来执行,我们使用Mapper的接口和调用 方法如下:

package com.owen.mybatis.mappers;
public interface StudentMapper
{
int updateStudent(Student student);
}

你可发调用updateStudent声明使用Mapper接口。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int noOfRowsUpdated = mapper.updateStudent(student);

4. 声明DELETE

一个DELETE的声明可以在MapperXML的文件中使用<delete>元素。

 <delete id="deleteStudent" parameterType="int">
DELETE FROM STUDENTS WHERE STUD_ID=#{studId}
</delete>

我们可以使用下面的方式调用声明:

 int studId =1;
int noOfRowsDeleted =
sqlSession.delete("com.owen.mybatis.mappers.StudentMapper.deleteStuden
t", studId);

在delete的声明中,sqlSession.delete()方法将会返回被影响的那个行。

我们创建一个Mapper接口和调用的方法如下:

 package com.owen.mybatis.mappers;
public interface StudentMapper
{
int deleteStudent(int studId);
}

你可以使用下面的方法来调用Mapper的接口:

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int noOfRowsDeleted = mapper.deleteStudent(studId);

5. 声明SELECT

对于MyBatis的真正有影响的要说它是如何通过JavaBean来映射和选择查询结果了。让我们来看一下简单的配置。

<select id="findStudentById" parameterType="int"
resultType="Student">
SELECT STUD_ID, NAME, EMAIL, PHONE
FROM STUDENTS
WHERE STUD_ID=#{studId}
</select>

我们可以通过下面的方法来调用声明:

int studId =1;
Student student = sqlSession.selectOne("com.owen.mybatis.mappers.
StudentMapper.findStudentById", studId);

上面代码中的sqlSession.selectOne()方法返回的对象,这个对象就是我们要配置文件中配置的resultType属性。如果返回的结果是多个,那么就会报TooManyResultException的报错。

我们不用namespace和声明的id来调用映射声明,而是使用Mapper的接口,如下:

 package com.owen.mybatis.mappers;
public interface StudentMapper
{
Student findStudentById(Integer studId);
}

我们可以调用声明中的finadStudentById,使用Mapper的接口。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.findStudentById(studId);

如果你去查找Student对象的参数时,你会发现studId的参数值并不属于表中的stud_id的列值。这是因为MyBatis会自动匹配JavaBean中定义的参数的值与数据库中列值相对应。也就是说,你在JavaBean定义的参数的名称要与数据表中列名保持一致。这就是为什么name、email、和phone可以匹配,而studId就不可以了。

为了解决这个问题,我们可以给列名一个别名去匹配JavaBeans参数的名字。

<select id="findStudentById" parameterType="int"
resultType="Student">
SELECT STUD_ID AS studId, NAME,EMAIL, PHONE
FROM STUDENTS
WHERE STUD_ID=#{studId}
</select>

现在Student类可以与数据库中的stud_id、name、email和phone的列一样了。接下来,我们来看一下如何去执行SELECT并且返回多行结果。

<select id="findAllStudents" resultType="Student">
SELECT STUD_ID AS studId, NAME,EMAIL, PHONE
FROM STUDENTS
</select>
List<Student> students =
sqlSession.selectList("com.owen.mybatis.mappers.StudentMapper.findAllS
tudents");

Mapper接口的StudentMapper可以如下使用:

package com.owen.mybatis.mappers;
public interface StudentMapper
{
List<Student> findAllStudents();
}

运用前面的代码,你可以使用Mapper接口调用findAllStudents的声明。

StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.findAllStudents(); 

除了使用java.util.List,你可以使用其它的容器,像Set、Map和SortedSet。基于这些容器的使用,MyBatis将会返回下面的结果:

1)        List、Collection、或Iterable类型,将返回java.util.ArrayList.

2)        Map类型,将返回java.util.HashMap。

3)        Set类型,将返回java.util.HashSet。

4)        SortedSet类型,将返回java.util.TreeSet。

MyBatis之使用XML配置SQL映射(二)CRUD映射配置相关推荐

  1. apache camel 相关配置_Web基础配置篇(二): Maven配置及使用

    Web基础配置篇(二): Maven配置及使用 一.概述 Maven是一个软件开发管理工具,主要管理工作是:依赖管理,项目一键构建. 以前用过ant,很不方便,maven比较简单易用. 然后后面又来了 ...

  2. Web基础配置篇(二): Maven配置及使用

    Web基础配置篇(二): Maven配置及使用 一.概述 Maven是一个软件开发管理工具,主要管理工作是:依赖管理,项目一键构建. 以前用过ant,很不方便,maven比较简单易用. 然后后面又来了 ...

  3. mybatis里mapper.xml中SQL语句if语句嵌套if语句

    为了实现一个sql可以根据条件不同实现sql语句的动态查询,所以在使用mybatis时,对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句, 最开始在我的where子句中我 ...

  4. Mybatis 自动生成XML转换SQL工具

    初衷 本人去git找源码时,发现部分代码,不提供sql文件.实在令人气愤.如果xml很多,一个一个去mysql 工具创建数据库,那也太可怕了. 思路 将mybatis创建的XML文件解析出来,只用到 ...

  5. mybatis对mapper.xml的解析(二)

    对select,insert,update,delete的解析是通过buildStatementFromContext来完成的,具体的解析是XMLStatementBuilder来完成的. 支持的属性 ...

  6. Mybatis中Mapper.xml文件sql中动态获取----#{}和${}区别

    1. #{} 获取参数的内容,支持索引获取,param1获取指定位置参数,并且sql使用?占位符 2. ${} 纯字符串拼接,不使用?,默认找${内容}内容的get/set方法,如果写数字,就是一个数 ...

  7. Jira项目管理配置指南(二)—— 工作流配置

    文章目录 工作流概述 属性 触发器 条件 验证器 后处理功能 工作流类型 主任务 子任务 Bug 默认 工作流设计 主任务 后处理功能 主任务总结 子任务 后处理功能 待办到处理中 日期规则 解决结果 ...

  8. 配置SQL Server数据库连接

    "Web.config"文件中提供的设置可以应用于整个应用程序,包括应用程序的子目录.在配置文件"Web.config"中,所有的配置信息都位于<conf ...

  9. 浅谈纯远程配置树莓派(二)

    浅谈纯远程配置树莓派(二) --简单配置.通过SSH访问及配置向导介绍 前情提要:上篇(链接:http://blog.csdn.net/octsjimmy/article/details/700455 ...

  10. Mybatis基于XML配置SQL映射器(二)

    Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档  sysUse ...

最新文章

  1. pandas使用groupby函数和describe函数计算不同分组的描述性统计(descriptive statistics of each group in dataframe)
  2. 自己搭建自动化巡检系统(五) 抖动告警
  3. RAdam优化器又进化:与LookAhead强强结合,性能更优速度更快
  4. 【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性 ( 约束布局可见性处理 | goneMargin 属性 )
  5. Excel 中使用SQL 语句查询数据(七)-----用LIKE 运算符进行模糊匹配查询
  6. mybatis三种(查询,参数传递)
  7. python文献检索工具与技巧答案_短文本分析----基于python的TF-IDF特征词标签自动化提取...
  8. UserWarning: Matplotlib is currently using agg,which is a non-GUI backend, so cannot show the figure
  9. 公交车上应不应该给老人让座?
  10. python一般的基础代码-Python入门经典练习题
  11. Vim 实用技术,第 1 部分: 实用技巧(转)
  12. win10如何在不同窗口切换
  13. 关于滚动条内子控件控制问题
  14. Kubeedge 1.5 部署指南
  15. java 连接不上数据库
  16. 【C++】十进制转化二进制,二进制转化十进制
  17. vuepress的初始化中的heroImage在哪
  18. 潮流品牌TakiTaki 定义年轻人的新潮流
  19. 单片机怎么通过按键控制计时器的开始和停止_学习电路仿真:基于proteus电路仿真软件的交通灯控制电路设计...
  20. YOLOV6网络结构

热门文章

  1. 关于HTML5中hash部分API在历史管理,选项卡自动跳转中的一点使用
  2. Xampp PHPStorm XDebug配置
  3. c# 程序调试出现“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。”...
  4. 捕鱼分鱼、出售鱼、平分七筐鱼
  5. lighttpd + php for android
  6. SQLite B/S使用(一)
  7. Factory Method 抽象工厂模式(创建型)
  8. Cocos2d-xJson数据解析(读取和写入)
  9. HCIE Security IPv6基础与安全技术 备考笔记(幕布)
  10. Linux硬链接与软链接的区别