一步步学Mybatis-实现单表情况下的CRUD操作 (3)
今天这一章要紧接上一讲中的东西,本章中创建基于单表操作的CRUD与GetList操作,此示例中以Visitor表为范例,为了创建一点测试数据我们先弄个Add方法吧
继续在上次的IVisitorOperation接口类中添加add,delete,update,query与getList接口方法,如下所示:
/*
* 基础查询
*/
public Visitor basicQuery(int id); /*
* 添加访问者
*/
public int add(Visitor visitor); /*
* 删除访问者
*/
public int delete(int id); /*
* 更新访问者
*/
public int update(Visitor visitor); /*
* 查询访问者
*/
public Visitor query(int id); /*
* 查询访问者List
*/
public List<Visitor> getList();
对于相应的CRUD操作,在VisitorMapper.xml的<mapper>节点下分别对应insert,update,delete,select节点,具体配置详情参数说明课参照官网 http://mybatis.github.io/mybatis-3/sqlmap-xml.html
这个示例中要的配置如下,传递的参数用#{parameter_name},当然也可直接用${parameter_name},
前者的方式,Mybatis会把它转化为参数化的形式例如 insert into table (name) values (#{name}) => insert into table (name) values ( ? ) (Mysql情况下)
后者的方式,Mybatis会原封不动的不做任何操作把参数传过来,例如 insert into table (name) values (${name}) => insert into table (name) values ( [你所传的值] ),传aa,这里就是aa,传'aa'这里就是'aa'。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="david.mybatis.demo.IVisitorOperation">
<!--
useGeneratedKeys="true"代表是否使用自增长序列,
keyProperty="Id"指定自增长列是哪一列,
parameterType="Visitor"指定IVisitorOperation接口类中定义中所传的相应类型
resultType 表示返回的类型,例如query中的visitor
resultMap 自定义的返回类型,是返回复杂类型是的最佳首选,也是mybatis里最强大的武器
-->
<insert id="add" parameterType="Visitor" useGeneratedKeys="true"
keyProperty="Id">
insert into Visitor (Name, Email, Status, CreateTime)
values (#{name}, #{email}, #{status}, #{createTime})
</insert>
<delete id="delete" parameterType="int">
delete from Visitor where
status>0 and id = #{id}
</delete>
<update id="update" parameterType="Visitor">
update Visitor set Name =
#{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;
</update>
<select id="query" parameterType="int" resultType="Visitor">
select Id,
Name, Email, Status, CreateTime from visitor where id=#{id} and
Status>0 order by Id
</select>
<select id="basicQuery" parameterType="int" resultType="Visitor">
select * from visitor where id=#{id} and
Status>0 order by Id
</select>
<select id="getList" resultMap="visitorRs">
<include refid="getListSql" />
</select>
<resultMap type="Visitor" id="visitorRs">
<id column="Id" property="id" />
<result column="Name" property="name" />
<result column="Email" property="email" />
<result column="Status" property="status" />
<result column="CreateTime" property="createTime" />
</resultMap>
<sql id="getListSql">
select * from Visitor where
status>0
</sql>
</mapper>
VisitorMapper
此处注意的一点是:操作节点中的ID要对应接口定义中的接口名字,参数类型也要相应对应,例如接口里是add(Visitor visitor),那么在配置insert节点的时候id="add",parameterType="Visitor"
否则会报相应的异常,例如id节点不对应接口名称会出现如下异常:
大家可以注意到在VisitorMapper.xml这个配置文件中在获取list的时候,使用的是resultMap,使用resultMap的情况下你可以指定你自己的sql语句与哪些字段相映射,因为有时候你可以不需要那么多列,那你在配置映射的时候也不需要配置那么多映射,或者说你的列有起过别名,那么就不能直接使用resultType="Visitor"的方式进行映射,因为Mybatis默认映射方式是通过Javabean的属性名与表的字段是否一致来匹配的,也可以通过配置<configuration>节点下的<settings>属性值来控制是否映射的时候以Javabean中的驼峰命名方式配置如下。
<settings>
<setting name="mapUnderscoreToCamelCase" value="false" />
</settings>
具体其他修改Mapper的其他配置可以通过 http://mybatis.github.io/mybatis-3/configuration.html#settings 查看。
对于Visitor的Mapper类如下:
<mapper namespace="david.mybatis.demo.IVisitorOperation">
<sql id="getListSql">
select id as visitor_id, name, email, status, createtime from Visitor where
status>0
</sql>
<select id="getList" resultMap="visitorRs">
<include refid="getListSql" />
</select>
<!--
这里指的注意的地方是property属性,里面的字段一定要和你在实体里面定义的属性一样,此处区分大小写
否则会出现默认setter为属性赋值的时候找不到相应属性的异常,大家可以试下
column属性对应于查询语句返回结果集的名字,如果有为相应字段起过别名例如吧id变为了visitor_id
那么相应的column名字也要对应上
-->
<resultMap type="Visitor" id="visitorRs">
<id column="visitor_id" property="id" />
<result column="Name" property="name" />
<result column="Email" property="email" />
<result column="Status" property="status" />
<result column="CreateTime" property="createTime" />
</resultMap>
</mapper>
这里要大家还会注意到有一个节点<sql>节点,这个的用处就是提取公用的sql语句或者说字段,以便其他地方复用,其他详细说明用法可以参照 http://mybatis.github.io/mybatis-3/sqlmap-xml.html。
剩下的就是和刚刚一样的操作了,大家可以在demo程序里建立一个DemoRun的类存放各类测试方法,如下:
package david.mybatis.demo; import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import david.mybatis.model.BasicQueryArgs;
import david.mybatis.model.CRUD_Enum;
import david.mybatis.model.Channel;
import david.mybatis.model.PagenateArgs;
import david.mybatis.model.Visitor;
import david.mybatis.model.Website; public class DemoRun { public static void testBasicQuery(int id) {
SqlSession session = MybatisUtils.getSqlSession();
try {
/*
* 此处的david.mybatis.demo.IVisitorOperation.basicQuery必须和下图中配置里面的namespace对应
*/
Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id);
MybatisUtils.closeSession(session);
System.out.println(visitor);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} public static void testBasicQueryByInterfaceWay(int id) {
SqlSession session = MybatisUtils.getSqlSession();
try {
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
Visitor visitor = vOperation.basicQuery(id);
MybatisUtils.closeSession(session);
System.out.println(visitor);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} /*
* 批量添加访问者记录
*/
public static void addVisitors() {
SqlSession session = MybatisUtils.getSqlSession();
List<Visitor> visitors = Arrays.asList(new Visitor[] { new Visitor("mongodb", "mongodb@gmail.com"),
new Visitor("redis", "redis@gmail.com"), new Visitor("memcached", "memcached@gmail.com"),
new Visitor("CouchDB", "CouchDB@gmail.com"), new Visitor("HBase", "HBase@gmail.com"),
new Visitor("Bigtable", "Bigtable@gmail.com"), new Visitor("Hive", "Hive@gmail.com"),
new Visitor("MapReduce", "MapReduce@gmail.com"), }); for (Visitor visitor : visitors) {
addVisitor(visitor, session);
}
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
} /*
* 添加访问者信息
*/
@SuppressWarnings("unused")
private static void addVisitor(Visitor visitor, SqlSession session) {
if (session == null)
session = MybatisUtils.getSqlSession();
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
int recordCount = vOperation.add(visitor);
session.commit();
if (session == null)
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Add, recordCount);
} /*
* 重载添加访问者
*/
public static void addVisitor(Visitor visitor) {
addVisitor(visitor, null);
} /*
* 删除访问者信息
*/
public static void deleteVisitor(int id) {
SqlSession session = MybatisUtils.getSqlSession();
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
int recordCount = vOperation.delete(id);
session.commit();
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Delete, recordCount);
} /*
* 更新访问者信息
*/
public static void updateVisitor(int id) {
SqlSession session = MybatisUtils.getSqlSession();
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
Visitor visitor = vOperation.query(id);
System.out.println("原始对象:" + visitor);
String name = visitor.getName();
if (name.contains("updated")) {
visitor.setName(name.substring(0, name.indexOf("updated")));
} else {
visitor.setName(name + "updated");
}
int recordCount = vOperation.update(visitor);
session.commit();
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Update, recordCount);
System.out.println("更新后对象:" + visitor);
} /*
* 查询访问者信息
*/
public static void queryVisitor(int id) {
SqlSession session = MybatisUtils.getSqlSession();
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
Visitor visitor = vOperation.query(id);
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.Query, 1);
System.out.println(visitor);
} /*
* 查询访问者列表
*/
public static void queryVisitorList() {
SqlSession session = MybatisUtils.getSqlSession();
IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
List<Visitor> visitors = vOperation.getList();
for (Visitor visitor : visitors) {
System.out.println(visitor);
}
MybatisUtils.closeSession(session);
MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
}
}
DemoRun类
运行一下后一个简单的基于单表CRUD,DEMO就完成啦
下一章会讲述基于多表联合查询下的Mybatis用法~^0^
一步步学Mybatis-实现单表情况下的CRUD操作 (3)的更多相关文章
- Context连接和断开的情况下的CRUD操作
连续情况下的CRUD操作是一项相当容易的任务,因为默认情况下,上下文会自动跟踪实体在其生命周期中发生的更改,AutoDetectChangesEnabled为true. 以下示例显示如何添加,更新和删 ...
- SpringBoot整合Mybatis对单表的增、删、改、查操作
一.目标 SpringBoot整合Mybatis对单表的增.删.改.查操作 二.开发工具及项目环境 IDE: IntelliJ IDEA 2019.3 SQL:Navicat for MySQL 三. ...
- Oracle单实例情况下的library cache pin的问题模拟与问题分析
Oracle单实例情况下的library cache pin的问题模拟与问题分析 參考自: WAITEVENT: "library cache pin" Reference Not ...
- 一步步学Mybatis-实现多表联合查询(4)
上一章节中我们已经完成了对单表的CRUD操作,接下来今天这一讲讲述的是关于Mybatis在多表查询时候的应用,毕竟实际业务中也是多表的联合查询比较多嘛~ 还记得最一开始我们新建过一张Website表吗 ...
- mybatis入门--单表的增删改操作
单表的增加操作 前面我们看了如何搭建mybatis框架以及查询操作,这里我们说下如何使用mybatis进行增加用户的操作.首先是在user.xml文件中添加insert的方法.代码如下 <!-- ...
- java实战应用:MyBatis实现单表的增删改
MyBatis 是支持普通 SQL查询.存储过程和高级映射的优秀持久层框架.MyBatis 消除了差点儿全部的JDBC代码和參数的手工设置以及结果集的检索.MyBatis 使用简单的 XML或注解用于 ...
- MyBatis框架——单表查询
Mybatis单表查询,示例 1.创建数据库 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Versio ...
- 再学TSQL基础--单表查询
本内容是我学习tsql2008的阅读笔记 什么是关系模型? 若对列创建唯一约束,背后中的物理机制也是创建了一个唯一索引. SQL语句的逻辑解析顺序是FROM WHERE GROUP BY HAVING ...
- mybatis处理单表多表操作以及动态sql和批量操作
一.单表操作 建立了相应的mapper映射接口类后,在src/main/resources目录下的自己建立的mapper文件夹下创建映射类 select操作:用select标签 属性id为映射接口的方 ...
随机推荐
- 安卓 安装 platforms 的时候报错--访问 url 出错
强制使用http 访问连接,并在hosts中添加地址,即可 问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com ...
- 面积最大的全1子矩阵--九度OJ 1497
题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行是 ...
- (转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
- Linux下如何进行FTP设置
一.Redhat/CentOS安装vsftp软件 1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:http://help.aliyun.com/manual?spm=0.0.0.0.z ...
- Shell脚本文件中常用的操作语句
1. 清空文件中的内容 cat /dev/null >> /var/log/messages 2. 脚本中判断用户是不是root用户 ROOT_UID = 0 # ...
- 移动端rem布局
手机页面——分辨率特别乱: 1.定宽320px——优点:简单,缺点:不能适应 2.百分比——优点:能适应各种分辨率,缺点:太麻烦 3.rem——优点:方便.适应各种分辨率(首先定义一个“根大小”htm ...
- HDU 2040 亲和数 [补] 分类: ACM 2015-06-25 23:10 10人阅读 评论(0) 收藏
今天和昨天都没有做题,昨天是因为复习太累后面忘了,今天也是上午考毛概,下午又忙着复习计算机图形学,晚上也是忘了结果打了暗黑3,把暗黑3 打通关了,以后都不会玩太多游戏了,争取明天做3题把题目补上,拖越 ...
- poj 3216 Repairing Company(最短路Floyd + 最小路径覆盖 + 构图)
http://poj.org/problem?id=3216 Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Su ...
- Redis初步
Redis目录下文件: redis-server.exe:服务程序 redis-check-dump.exe:本地数据库检查 redis-check-aof.exe:更新日志检查 redis-benc ...
- Dubbo远程调用服务框架原理与示例
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...