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
参考文献
微信扫一扫二维码关注订阅号杰哥技术分享
出处:https://www.cnblogs.com/Jack-Blog/p/13179382.html
作者:杰哥很忙
本文使用「CC BY 4.0」创作共享协议。欢迎转载,请在明显位置给出出处及链接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步