本篇記錄使用mybatis鏈接oracle數據庫實現基本的CURD操做。java
因爲oracle收費, 所以maven沒有oracle庫包,須要咱們本身導入,能夠手工導入外部包,也能夠將oracle的jar導入到maven庫種。具體導入步驟能夠查看Maven添加Oracle的依賴及驅動sql
導入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文件,配置以下session
<?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數據源。mybatis
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
是密碼。oracle
在value中能夠填寫如${變量名}
的配置引用,經過在properties/propertie
添加對應的實際的配置值。app
<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語句以及與類之間的映射關係。maven
<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"));
另外一種方案能夠經過傳入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的參數大小寫一致。
經過類參數和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