Oracle数据库从12c开始支持插拔式数据库。这是一个独特的架构,让Oracle数据库本身形成了二级架构:

  1. 容器数据库,CDB$ROOT,随服务器启动而自动启动并可用。
  2. 插拔式数据库,可在安装时可选创建,或者启动服务后自行创建。创建方式支持:(1)直接创建;(2)基于pdbseed(插拔式数据库模板)创建。

要连接Oracle 19c,需要配置好网络或者IPC。一般Oracle 19c装好后默认就有可用的网络和IPC。
Oracle 19c的网络管理
要查看Oracle 19c的网络配置,可以使用两种方式:(1)Net Manager图形化界面;(2)命令行工具lsnrctl和配置文件C:\oracle\inventory\network\admin*.ora。
我们采用方法(2)。配置时,可参考C:\oracle\inventory\network\admin\sample*.ora进行配置。Listener在listener.ora里定义,服务名和SID在tnsnames.ora里定义。修改listener.ora、tnsnamesora和sqlnet.ora后,在cmd下输入lsnrctl,输入start可启动所有listener,输入stop关闭所有listener。关闭再启动所有listener,即可通过输入status查看当前监听的Listener。

下面采用网络连接。有几种方式进行网络连接:
(1)SID和Service Name;(2)URL Only;(3)TNS。Oracle 19c支持多种语言如Java、C#、Python、PHP等等。对Java语言,Oracle提供的支持有jdbc、oracle jdbc、wallet。jdbc又叫thin模式,支持所有jdbc驱动提供商。oracle jdbc又叫OCI模式,Oracle提供驱动。支持Oracle的客户端包括:SQLDeveloper(Oracle的图形IDE),SQLPlus(Oracle命令行工具),VSCode(Microsoft)和PL/SQL插件(Oracle ),DataGrip(IntelliJ),NavCat(国内厂家)。

由于Oracle在2020年末搬去德克萨斯州之前曾经在硅谷收购了Sun Microsystem,所以Oracle持有Java商标,故本文关注Java程序如何连接Oracle 19c。
Oracle Java SDK
Oracle Java SDK Doc

最简单的部署Oracle 19c的方法是下载并安装一个Oracle。在Oracle官网可注册账号(只需邮箱),然后可下载JDK、JRE、Oracle数据库、Virtualbox。Oracle数据库自12c开始,部署方式如下:
(1)注册
(2)下载Oracle 19c到本地。
(3)解压(可以不是C盘)到目录inventory。
(4)双击inventory下的setup.exe,图形界面安装(支持windows和linux,本文用windows)。Oracle实例可以安装在非C盘。
除此以外,用Oracle账号可注册Oracle Cloud,用信用卡激活后可使用Oracle自治数据库。

由于Java社区的发展,开发主流从JavaEE逐渐向Spring发展。JavaEE原本主要支持XML配置文件,Spring发展并带热了资源依赖注入后,Java社区开始支持XML配置和标注配置。后来又有AOP编程。故本文连接Oracle时采用Spring boot,一种全标注的Spring框架。

Oracle本地部署和Oracle自治数据库都支持wallet认证。wallet是一种基于Java加密协议的强加密认证,一个wallet包含了密钥、证书、ojdbc配置文件,以及可选的sqlnet.ora和tnsnames.ora。一个支持wallet认证的Oracle jdbc url(又叫Easy Connect形式)是这样的:

jdbc:oracle:thin:@tcps://host:port/dbname?wallet_location=absolute_path_to_oracle_wallet&oracle.net.ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com,OU=Oracle ADB TOKYO,O=Oracle Corporation,L=Redwood City,ST=California,C=US\

jdbc:oracle:thin表示这是一个jdbc url,驱动连接的是oracle数据库,驱动是通用jdbc(非Oracle专有驱动,专有的是OCI)。

连接数据库有若干种方法,包括直接操作数据库的JDBC API,ORM(如Hibernate),映射(将方法映射到SQL语句)。其中后两者可以搭配,也可以独立使用。下面介绍映射。

映射和ORM的区别是这样的:ORM工具一般要求开发者建立模型(Java对象),每个模型对象对应数据库ER模型中的一个实体或者关系,ORM负责自动生成操作这些实体和关系的Java API供开发者使用。映射则是,要求开发者指定操作数据库ER模型中实体或关系的Java API以及对应的SQL 语句,映射负责自动生成数据库实体和关系。在Java中,允许ORM和映射独立使用,ORM的代表是Hibernate(遵循Java JPA),映射的代表是MyBatis。而在DotNET中(Java竞品),一般要求ORM(DAO)和映射(Linq)一起使用。有些作者认为MyBatis基于XML提供的功能更完整,而MyBatis.NET基于标注提供的功能比MyBatis的Java标注完整,可能和Linq和ORM的分工有关。

基于MyBatis的Java标注的功能比较简单,优先介绍下。对于一个数据库,它如果只有一个操作对象Account

public class Account {
    private int id;
    private int balance;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }
}

Mybatis映射是这么实现的:

@Mapper
public interface AccountMapper {
    @Delete("delete from accounts")
    int deleteAllAccounts();

    @Update("CREATE TABLE accounts (id INT PRIMARY KEY, balance INT, CONSTRAINT balance_gt_0 CHECK (balance >= 0))")
    void createAccountsTable();
}

这里只实现了创建和删除Account的操作。首先,实现的是接口,其次接口标注为@Mapper,最后Java API上通过标注嵌入SQL实现。强调一下,MyBatis是映射,将SQL实现映射到Java方法。下面是使用方式:

@Service
public class MyBatisAccountService {
    @Autowired
    private AccountMapper mapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void createAccountsTable() {
        mapper.createAccountsTable();
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public int deleteAllAccounts() {
        return mapper.deleteAllAccounts();
    }
}

@Autowired是告诉Spring自动将MyBatis接口注入到节点里,上面的代码里节点是变量mapper。@Transactional是告诉Spring,改方法需要Spring Transaction,即该方法要么成功,要么回滚到方法执行前的状态。如果调用MyBatisAccountService.createAccountsTable,数据库若没有accounts 表则自动创建一个。如果调用MyBatisAccountService.deleteAllAccounts,数据库若有accounts表该表会被drop掉(删掉)。
MyBatis

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐