MyBatis入门学习-连接oracle实现CURD基本操作

目录
  • 前言
  • 导入oracle库
  • 配置
    • 环境配置
    • 配置引用
    • 配置映射
  • 查询
    • 单条件查询
    • 多条件查询
      • 通过类字段传递参数
      • 通过Map接口传参
      • Param注解
  • 插入
  • 更新
  • 删除
  • 字段映射
  • 参考文献

前言

本篇记录使用mybatis连接oracle数据库实现基本的CURD操作。

导入oracle库

由于oracle收费, 因此maven没有oracle库包,需要我们自己导入,可以手工导入外部包,也可以将oracle的jar导入到maven库种。具体导入步骤可以查看Maven添加Oracle的依赖及驱动

导入mybatis库包,我本地使用的是3.5.5版本。最后的配置如下所示



  org.mybatis
  mybatis
  3.5.5



  com.oracle.jdbc
  ojdbc6
  11.2.0.1.0

配置

准备mybatis的配置,在resources目录下新建一个mybatis-config.xml文件,配置如下

 



    
        
        
        
        
    

    
    
        
        
            
            
            
            
                
                
                
                
            
        
        
            
            
            
            
                 
                
                
                
            
        
    
    
        
    


环境配置

 
      
      
      
      
          
          
          
          
      
  

其中environments可以配置多个环境的oracle数据源。

id是环境变量的编号,在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添加对应的实际的配置值。


    
        
    
    
    
        ...
        
            ...
            
                 
                ...
            
        
    

配置映射

配置好数据源后,需要添加对应的表映射,映射包括CRUD对应的SQL语句以及与类之间的映射关系。



  ...
    
        
    

在resources目录下新建一个singleTransMapper.xml文件,MyBatis会将singleTransMapper.xml映射到对应的类

除了resources以外MyBatis还支持classurlpackage共四种配置

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;
}

单条件查询

增加一个查询单笔的语句,通过输入流水号,返回查询到的单笔信息。




    


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




   
   ...
    

对应的映射类添加方法对应的方法,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




    ...
    

添加对应的方法,传入参数为HashMap param

public interface SingleTransMapper {
  ...
    SingletransDTO selectSingleByMultCondition(HashMap param);
}

修改调用新的多条件查询方法

...
//获取单笔映射对象
SingleTransMapper mapper = session.getMapper(SingleTransMapper.class);
//根据流水号查询
HashMap param = new HashMap();
param.put("transNo","642EHDCS899XKF8P");
param.put("commandCode","10009");
SingletransDTO blog = mapper.selectSingle2(param);
...

需要注意的是,由于HashMap的key是不区分大小写的,因此需要和配置文件sql的参数大小写一致。

Param注解

通过类参数和Map进行多条件查询都需要创建额外的对象,另一种比较好的方式可以通过在方法参数上添加Param注解的方式配置方法参数和SQL参数的映射关系。

添加一个查询配置selectSingleByParam




   
   ...
    

对应的映射类添加方法对应的方法,这样MyBatis就知道参数映射规则,就会自动映射,需要注意的数参数和sql中配置的大小写也需要一致。


public interface SingleTransMapper {
    SingletransDTO selectSingle(String transNo);
    SingletransDTO selectSingleByMultCondition(HashMap 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映射。




  
  ...
  
    insert into se_singletrans(ENTERPRISENUM,TRANSNO,COMMANDCODE,STATE) values(#{EnterpriseNum},#{TransNo},#{CommandCode},#{State})
  

添加类对应的insert方法


public interface SingleTransMapper {

    ...
    int insert(SingletransDTO singletransDTO);
}

SqlSession默认会开启事务,在insert完成后需要调用SqlSessioncommit()方法提交事务。


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节点表示插入,插入时可以对插入的字段设置条件,达成某条件是该字段才需要更新。




  
  ...
   
    update se_singletrans
    
        
        STATE=#{State}
    
    where transno = #{TransNo} and commandCode= #{CommandCode}
  

添加类对应的update方法


public interface SingleTransMapper {

    ...
    int update(SingletransDTO singletransDTO);
}

SqlSession默认会开启事务,和insert一样,在update完成后需要调用SqlSessioncommit()方法提交事务。


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节点表示删除。




  
  ...
   
  
    delete from se_singletrans where transno = #{TransNo} and commandCode= #{CommandCode}
  

添加类对应的delete方法,可以通过参数注解的方式指定参数。


public interface SingleTransMapper {

    ...
    int delete(@Param("TransNo")String transNo, @Param("CommandCode") String commandCode);
}

SqlSession默认会开启事务,在delete完成后需要调用SqlSessioncommit()方法提交事务。


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自定义自己的类型处理器。





  
    
    
    
  
  

关于TypeHandle这里不做具体阐述,有兴趣的可以看下MyBatis自定义类型处理器 TypeHandler

参考文献

  1. Maven添加Oracle的依赖及驱动
  2. MyBatis自定义类型处理器 TypeHandler

你可能感兴趣的:(MyBatis入门学习-连接oracle实现CURD基本操作)