MyBatis入门学习-连接oracle实现CURD基本操作
前言
本篇记录使用mybatis连接oracle数据库实现基本的CURD操作。
导入oracle库
由于oracle收费, 因此maven没有oracle库包,需要我们自己导入,可以手工导入外部包,也可以将oracle的jar导入到maven库种。具体导入步骤可以查看Maven添加Oracle的依赖及驱动
导入mybatis库包,我本地使用的是3.5.5版本。最后的配置如下所示
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
配置
准备mybatis的配置,在resources目录下新建一个mybatis-config.xml文件,配置如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 -->
<configuration>
<properties>
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@10.60.45.239:1521:devdb" />
<property name="username" value="fgmain10001" />
<property name="password" value="test1" />
</properties>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="test">
<!-- id:唯一标识 -->
<environment id="test">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@10.60.45.239:1521:devdb" />
<property name="username" value="fgmain10001" />
<property name="password" value="test1" />
</dataSource>
</environment>
<environment id="development">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" /> <!-- 配置了properties,所以可以直接引用 -->
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="singleTransMapper.xml" />
</mappers>
</configuration>
环境配置
<environment id="test">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@10.60.45.239:1521:devdb" />
<property name="username" value="fgmain10001" />
<property name="password" value="test1" />
</dataSource>
</environment>
其中environments
可以配置多个环境的oracle数据源。
id
是环境变量的编号,在<environments>
的default
中可以设置当前的环境值。
dataSource
中设置数据源。类型有3种。包括:POOLED
池化,UNPOOLED
非池化和JNDI
从其他配置元加载。
driver
配置的类名,oracle填写oracle.jdbc.driver.OracleDriver
。
url
为配置的数据源,使用239测试库jdbc:oracle:thin:@10.60.45.239:1521:devdb
。
username
是用户名。
password
是密码。
配置引用
在value中可以填写如${变量名}
的配置引用,通过在properties/propertie
添加对应的实际的配置值。
<configuration>
<properties>
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
</properties>
<environments default="test">
...
<environment id="test">
...
<dataSource type="POOLED">
<property name="driver" value="${driver}" /> <!-- 配置了properties,所以可以直接引用 -->
...
</dataSource>
</environment>
</environments>
</configuration>
配置映射
配置好数据源后,需要添加对应的表映射,映射包括CRUD对应的SQL语句以及与类之间的映射关系。
<configuration>
...
<mappers>
<mapper resource="singleTransMapper.xml" />
</mappers>
</configuration>
在resources目录下新建一个singleTransMapper.xml
文件,MyBatis会将singleTransMapper.xml
映射到对应的类
除了resources
以外MyBatis还支持class
、url
和package
共四种配置
class
可以配置具体类名,如com.mybatistest.DAO.SingleTransMapper
。
url
可以配置完整的文件路径,如file:///var/mappers/PostMapper.xml
。
package
可以配置package
名称,注册所有接口。
查询
public class SingletransDTO {
public String EnterpriseNum;
public String TransNo;
public String CommandCode;
public int State;
}
单条件查询
增加一个查询单笔的语句,通过输入流水号,返回查询到的单笔信息。
<?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="DAO.SingleTransMapper">
<select id="selectSingle" parameterType="String" resultType="DTO.SingletransDTO">
select * from se_singletrans where transno = #{transno}
</select>
</mapper>
namespace
需要对应到java中的类,参数和返回类型也需要一致。
在mapper节点下添加select表示select语句
parameterType
为输入的参数
resultType
为返回的类型,返回类型需要对应java中的类
public interface SingleTransMapper {
SingletransDTO selectSingle(String transNo);
}
String resource = "mybatis-config.xml";
//加载资源
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建session
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
//获取单笔映射对象
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
//根据流水号查询
SingletransDTO blog = mapper.selectSingle("642EHDCS899XKF8P");
if(blog != null) {
System.out.println(blog.ENTERPRISENUM);
System.out.println(blog.TRANSNO);
System.out.println(blog.COMMANDCODE);
}else{
System.out.println("not found");
}
}catch (Exception exception)
{
System.out.println(exception.getMessage());
}
多条件查询
通过类字段传递参数
添加一个查询配置selectSingleByParam
<?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="DAO.SingleTransMapper">
...
<select id="selectSingleByClass" resultType="DTO.SingletransDTO">
select * from se_singletrans where transno = #{TransNo} and commandCode= #{CommandCode}
</select>
</mapper>
对应的映射类添加方法对应的方法,MyBatis可以通过反射将类的字段映射到SQL的参数,需要注意的是类的字段名和sql中配置的大小写需要一致。
public interface SingleTransMapper {
...
SingletransDTO selectSingleByClass(SingleCondition singleCondition);
}
public class SingleCondition {
/**
* 流水号
*/
public String TransNo;
/**
* 指令类型
*/
public String CommandCode;
public SingleCondition(String transNo, String commandCode)
{
TransNo = transNo;
CommandCode = commandCode;
}
}
调用构造函数类的多条件查询方案
...
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
SingletransDTO blog = mapper.selectSingleByClass(new SingleCondition( "642EHDCS899XKF8P","10009"));
通过Map接口传参
另一种方案可以通过传入HashMap,MayBatis会根据key自动映射到对应的参数。
下面实现通过流水号和指令类型查询。
添加一个查询配置selectSingleByMultCondition
<?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="DAO.SingleTransMapper">
...
<select id="selectSingleByMultCondition" resultType="DTO.SingletransDTO">
select * from se_singletrans where transno = #{transNo} and commandCode= #{commandCode}
</select>
</mapper>
添加对应的方法,传入参数为HashMap<String,Object> param
public interface SingleTransMapper {
...
SingletransDTO selectSingleByMultCondition(HashMap<String,Object> param);
}
修改调用新的多条件查询方法
...
//获取单笔映射对象
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
//根据流水号查询
HashMap<String,Object> param = new HashMap<String,Object>();
param.put("transNo","642EHDCS899XKF8P");
param.put("commandCode","10009");
SingletransDTO blog = mapper.selectSingle2(param);
...
需要注意的是,由于HashMap的key是不区分大小写的,因此需要和配置文件sql的参数大小写一致。
Param注解
通过类参数和Map进行多条件查询都需要创建额外的对象,另一种比较好的方式可以通过在方法参数上添加Param注解的方式配置方法参数和SQL参数的映射关系。
添加一个查询配置selectSingleByParam
<?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="DAO.SingleTransMapper">
...
<select id="selectSingleByParam" resultType="DTO.SingletransDTO">
select * from se_singletrans where transno = #{param1} and commandCode= #{param2}
</select>
</mapper>
对应的映射类添加方法对应的方法,这样MyBatis就知道参数映射规则,就会自动映射,需要注意的数参数和sql中配置的大小写也需要一致。
public interface SingleTransMapper {
SingletransDTO selectSingle(String transNo);
SingletransDTO selectSingleByMultCondition(HashMap<String,Object> param);
SingletransDTO selectSingleByParam(@Param("param1")String transNo, @Param("param2") String commandCode);
}
调用注解传参方法
...
//获取单笔映射对象
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
SingletransDTO blog = mapper.selectSingleByParam("642EHDCS899XKF8P","10009");
...
插入
在mapper下添加insert表示插入的sql映射。
<?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="DAO.SingleTransMapper">
...
<insert id="insert" parameterType="DTO.SingletransDTO">
insert into se_singletrans(ENTERPRISENUM,TRANSNO,COMMANDCODE,STATE) values(#{EnterpriseNum},#{TransNo},#{CommandCode},#{State})
</insert>
</mapper>
添加类对应的insert方法
public interface SingleTransMapper {
...
int insert(SingletransDTO singletransDTO);
}
SqlSession默认会开启事务,在insert完成后需要调用SqlSession
的commit()
方法提交事务。
try (SqlSession session = sqlSessionFactory.openSession()) {
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
SingletransDTO singletransDTO = new SingletransDTO();
singletransDTO.EnterpriseNum = "QT330001";
singletransDTO.TransNo = "MYBATIS.INSERT";
singletransDTO.CommandCode = "10009";
int count = mapper.insert(singletransDTO);
session.commit();
System.out.println("insert result:" +count);
}catch (Exception exception)
{
System.out.println(exception.getMessage());
}
我们也可以调用
SqlSession openSession(boolean autoCommit)
传入参数,自动提交。
更新
在mapper下添加update节点表示插入,插入时可以对插入的字段设置条件,达成某条件是该字段才需要更新。
<?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="DAO.SingleTransMapper">
...
<update id="update" parameterType="DTO.SingletransDTO">
update se_singletrans
<set>
<if test="State != null and State!=''"></if>
STATE=#{State}
</set>
where transno = #{TransNo} and commandCode= #{CommandCode}
</update>
</mapper>
添加类对应的update方法
public interface SingleTransMapper {
...
int update(SingletransDTO singletransDTO);
}
SqlSession默认会开启事务,和insert一样,在update完成后需要调用SqlSession
的commit()
方法提交事务。
try (SqlSession session = sqlSessionFactory.openSession()) {
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
SingletransDTO singletransDTO = new SingletransDTO();
singletransDTO.EnterpriseNum = "QT330001";
singletransDTO.TransNo = "MYBATIS.INSERT";
singletransDTO.CommandCode = "10009";
singletransDTO.State = 2;
int count = mapper.update(singletransDTO);
session.commit();
System.out.println("update result:" +count);
}catch (Exception exception)
{
System.out.println(exception.getMessage());
}
删除
在mapper下添加delete节点表示删除。
<?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="DAO.SingleTransMapper">
...
<delete id="delete">
delete from se_singletrans where transno = #{TransNo} and commandCode= #{CommandCode}
</delete>
</mapper>
添加类对应的delete方法,可以通过参数注解的方式指定参数。
public interface SingleTransMapper {
...
int delete(@Param("TransNo")String transNo, @Param("CommandCode") String commandCode);
}
SqlSession默认会开启事务,在delete完成后需要调用SqlSession
的commit()
方法提交事务。
try (SqlSession session = sqlSessionFactory.openSession()) {
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
int count = mapper.delete("MYBATIS.INSERT","10009");
session.commit();
System.out.println("delete result:" +count);
}catch (Exception exception)
{
System.out.println(exception.getMessage());
}
字段映射
若字段名和数据库的字段名不一致,可以通过配置进行映射。添加resultMap
节点,配置类字段和数据库字段的映射关系,若没有配置的字段,则根据默认MyBatis的映射关系处理,即字段名一样的自动映射,MyBatis会尝试进行类型转换,若转换异常,则可能抛错。我们也可以通过typeHandler
自定义自己的类型处理器。
<?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="DAO.SingleTransMapper">
<resultMap id="singleResultMap" type="DTO.SingletransDTO">
<result property="TransNo" column="transNo" />
<result property="CommandCode" column="commandCode"/>
<result property="SpecialProperty" typeHandler="CustomTypeHandle" column="SpecialColumn"/>
</resultMap>
<select id="selectSingleToReusltMap" resultMap="singleResultMap">
select * from se_singletrans where transno = #{param1} and commandCode= #{param2}
</select>
</mapper>
关于TypeHandle这里不做具体阐述,有兴趣的可以看下MyBatis自定义类型处理器 TypeHandler
参考文献
MyBatis入门学习-连接oracle实现CURD基本操作的更多相关文章
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
- MyBatis入门学习(二)
在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...
- MyBatis入门学习(一)
一.MyBatis入门简要介绍(百科) MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyB ...
- 记录21.08.04 — mybatis入门学习
mybatis入门 mybatis简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工 ...
- MyBatis入门学习教程-Mybatis3.x与Spring4.x整合
一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...
- mybatis入门学习记录(一)
过硬的技术本领,可以给我们保驾护航,飞得更高.今天开始呢.我们就一起来探讨使用mybatis的好处. 首先我们一起来先看看原生的JDBC对于数据库的操作,然后总结其中的利弊,为学习mybatis奠定基 ...
- MyBatis入门学习教程-优化MyBatis配置文件中的配置
一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version=" ...
- MyBatis入门学习教程-MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- MyBatis入门学习
所需要jar包:mybatis-3.x.x.jar .如果需要和spring整合,还需要加入相关的包 1:看项目目录 红颜色不要关心 2:按照步骤: 1:加入jar包 2:创建数据源(configur ...
随机推荐
- Docker scratch 无法正常运行golang二进制程序的问题
使用Docker构建容器能够极大的降低运维成本,提高部署效率,同时非常方便对服务的平行扩展.然而在构建容器镜像过程中的,存在着一个难以避免的问题,就是如果使用常见的发行版本作为程序运行的基础环境,那么 ...
- P1057 传球游戏 - 完美错解
//作者:pb2 博客:https://www.luogu.com.cn/blog/pb2/ 或 http://www.cnblogs.com/p2blog//博客新闻1:"WPS开机自启, ...
- 关于oauth安全
白话认证流程 A)用户打开客户端以后,客户端要求用户给予授权.(比如说你登陆淘宝,通过QQ这个第三方来登录时,这个时候淘宝将你引导至QQ的认证服务器) B)用户同意给客户端授权.(这个时候在你手机上弹 ...
- 认证(Authentication)和授权(Authorization)总结
身份认证是验证你的身份,一旦通过验证,即启用授权.你所拥有的身份可以进行哪些操作都是由授权规定.例如,任何银行客户都可以创建一个账户(如用户名),并使用该账户登录该银行的网上服务,但银行的授权政策必须 ...
- jchdl - RTL Block
https://mp.weixin.qq.com/s/pR6b6i98P9dRU8bhZkKaww 观察Verilog代码可以发现,对逻辑的描述中都是assign和always代码块.这正对应了硬 ...
- JAVASE(八) 数组: 一维数组、二维数组、动态数组、静态数组
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.一维数组 1.1 数组的声明和初始化声明方式: String str[]; //不建议使用 Stri ...
- Java实现 LeetCode 740 删除与获得点数(递推 || 动态规划?打家劫舍Ⅳ)
740. 删除与获得点数 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除每个等于 nums[ ...
- Java实现 LeetCode 543. 二叉树的直径(遍历树)
543. 二叉树的直径 给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过也可能不穿过根结点. 示例 : 给定二叉树 1 / \ 2 3 / ...
- Java实现 蓝桥杯算法提高金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元 ...
- Java实现蓝桥杯VIP算法训练 小生物的逃逸
试题 算法训练 小生物的逃逸 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 空间中有n个球,这些球不相交也不相切.有m个可以视为质点的小生物,可能在某些球内,也可能在所有球之外,但 ...