前言
本篇記錄使用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