MyBatis之使用XML配置SQL映射(二)CRUD映射配置
对于不同的声明风格,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映射配置相关推荐
- apache camel 相关配置_Web基础配置篇(二): Maven配置及使用
Web基础配置篇(二): Maven配置及使用 一.概述 Maven是一个软件开发管理工具,主要管理工作是:依赖管理,项目一键构建. 以前用过ant,很不方便,maven比较简单易用. 然后后面又来了 ...
- Web基础配置篇(二): Maven配置及使用
Web基础配置篇(二): Maven配置及使用 一.概述 Maven是一个软件开发管理工具,主要管理工作是:依赖管理,项目一键构建. 以前用过ant,很不方便,maven比较简单易用. 然后后面又来了 ...
- mybatis里mapper.xml中SQL语句if语句嵌套if语句
为了实现一个sql可以根据条件不同实现sql语句的动态查询,所以在使用mybatis时,对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句, 最开始在我的where子句中我 ...
- Mybatis 自动生成XML转换SQL工具
初衷 本人去git找源码时,发现部分代码,不提供sql文件.实在令人气愤.如果xml很多,一个一个去mysql 工具创建数据库,那也太可怕了. 思路 将mybatis创建的XML文件解析出来,只用到 ...
- mybatis对mapper.xml的解析(二)
对select,insert,update,delete的解析是通过buildStatementFromContext来完成的,具体的解析是XMLStatementBuilder来完成的. 支持的属性 ...
- Mybatis中Mapper.xml文件sql中动态获取----#{}和${}区别
1. #{} 获取参数的内容,支持索引获取,param1获取指定位置参数,并且sql使用?占位符 2. ${} 纯字符串拼接,不使用?,默认找${内容}内容的get/set方法,如果写数字,就是一个数 ...
- Jira项目管理配置指南(二)—— 工作流配置
文章目录 工作流概述 属性 触发器 条件 验证器 后处理功能 工作流类型 主任务 子任务 Bug 默认 工作流设计 主任务 后处理功能 主任务总结 子任务 后处理功能 待办到处理中 日期规则 解决结果 ...
- 配置SQL Server数据库连接
"Web.config"文件中提供的设置可以应用于整个应用程序,包括应用程序的子目录.在配置文件"Web.config"中,所有的配置信息都位于<conf ...
- 浅谈纯远程配置树莓派(二)
浅谈纯远程配置树莓派(二) --简单配置.通过SSH访问及配置向导介绍 前情提要:上篇(链接:http://blog.csdn.net/octsjimmy/article/details/700455 ...
- Mybatis基于XML配置SQL映射器(二)
Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档 sysUse ...
最新文章
- pandas使用groupby函数和describe函数计算不同分组的描述性统计(descriptive statistics of each group in dataframe)
- 自己搭建自动化巡检系统(五) 抖动告警
- RAdam优化器又进化:与LookAhead强强结合,性能更优速度更快
- 【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性 ( 约束布局可见性处理 | goneMargin 属性 )
- Excel 中使用SQL 语句查询数据(七)-----用LIKE 运算符进行模糊匹配查询
- mybatis三种(查询,参数传递)
- python文献检索工具与技巧答案_短文本分析----基于python的TF-IDF特征词标签自动化提取...
- UserWarning: Matplotlib is currently using agg,which is a non-GUI backend, so cannot show the figure
- 公交车上应不应该给老人让座?
- python一般的基础代码-Python入门经典练习题
- Vim 实用技术,第 1 部分: 实用技巧(转)
- win10如何在不同窗口切换
- 关于滚动条内子控件控制问题
- Kubeedge 1.5 部署指南
- java 连接不上数据库
- 【C++】十进制转化二进制,二进制转化十进制
- vuepress的初始化中的heroImage在哪
- 潮流品牌TakiTaki 定义年轻人的新潮流
- 单片机怎么通过按键控制计时器的开始和停止_学习电路仿真:基于proteus电路仿真软件的交通灯控制电路设计...
- YOLOV6网络结构
热门文章
- 关于HTML5中hash部分API在历史管理,选项卡自动跳转中的一点使用
- Xampp PHPStorm XDebug配置
- c# 程序调试出现“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。”...
- 捕鱼分鱼、出售鱼、平分七筐鱼
- lighttpd + php for android
- SQLite B/S使用(一)
- Factory Method 抽象工厂模式(创建型)
- Cocos2d-xJson数据解析(读取和写入)
- HCIE Security IPv6基础与安全技术 备考笔记(幕布)
- Linux硬链接与软链接的区别