diff --git a/media/dev-language/dev-golang1.png b/media/dev-language/dev-golang1.png
new file mode 100644
index 0000000000000000000000000000000000000000..52abda985f938bfc31e3c7508e98326369357bba
Binary files /dev/null and b/media/dev-language/dev-golang1.png differ
diff --git a/media/dev-language/dev-java0.png b/media/dev-language/dev-java0.png
new file mode 100644
index 0000000000000000000000000000000000000000..e894bb127cc1508bfa416c5b81bcb89f84082d6d
Binary files /dev/null and b/media/dev-language/dev-java0.png differ
diff --git a/media/dev-language/dev-java1.png b/media/dev-language/dev-java1.png
new file mode 100644
index 0000000000000000000000000000000000000000..78ef4ef51c819748af282b0c5656d3387e762e2c
Binary files /dev/null and b/media/dev-language/dev-java1.png differ
diff --git a/media/dev-language/dev-language-question.png b/media/dev-language/dev-language-question.png
new file mode 100644
index 0000000000000000000000000000000000000000..213564466b88b33e6bbdf74f3929ef0c1c6e7912
Binary files /dev/null and b/media/dev-language/dev-language-question.png differ
diff --git a/media/dev-language/dev-python1.png b/media/dev-language/dev-python1.png
new file mode 100644
index 0000000000000000000000000000000000000000..fda09516478f7c602897f9fa7b5f21b122f4f6c7
Binary files /dev/null and b/media/dev-language/dev-python1.png differ
diff --git "a/\345\274\200\345\217\221\350\277\220\347\273\264-\345\220\204\347\247\215\350\257\255\350\250\200\345\246\202\344\275\225\350\277\236\346\216\245\345\210\260OceanBase.md" "b/\345\274\200\345\217\221\350\277\220\347\273\264-\345\220\204\347\247\215\350\257\255\350\250\200\345\246\202\344\275\225\350\277\236\346\216\245\345\210\260OceanBase.md"
new file mode 100644
index 0000000000000000000000000000000000000000..d19cf923001b75a92a890f636d7feca622cca63b
--- /dev/null
+++ "b/\345\274\200\345\217\221\350\277\220\347\273\264-\345\220\204\347\247\215\350\257\255\350\250\200\345\246\202\344\275\225\350\277\236\346\216\245\345\210\260OceanBase.md"
@@ -0,0 +1,685 @@
+本篇文章想跟大家分享一下,各种主流开发语言如何连接到 OceanBase 社区版数据库,进行日常开发。这个问题也是社区群里面问的比较多的一个问题之一,希望通过本篇文章,能给各位参与开发的小伙伴提供一些指导。
+
+
+
+# 0. 前置条件
+
+首先我们在 OceanBase test 数据库中创建一个 t1 表,并向里面插入 2 条数据,用作后面所有语言的测试基础表:
+
+
+
+# 1. Java 数据库连接驱动(JDBC)
+
+首先上来肯定要说一下 Java,说 Java 是第一大应用开发语言应该不为过吧?OceanBase 社区版对 MySQL 5.7 的兼容性最好,所以您可以使用 MySQL 5.7 的 JDBC 包(建议使用 mysql-connector-java-5.1.47 版本,MySQL 5.7 对应的 JDBC 版本为 5.1.x),也可以使用 OceanBase 提供的自有 JDBC 包,下面我们分别用代码演示一个简单的示例。
+
+> Java 数据库连接(JDBC)是一种 API,它使 Java 能够将 SQL 语句发送到对象关系数据库,如 Oracle、MySQL 数据库。JDBC 支持为 Java 暴露 SQL 数据类型,并快速访问 SQL 数据。
+
+## 1.1 MySQL JDBC 连接 Demo
+
+我们首先从 https://downloads.mysql.com/archives/c-j/ 下载对应的 5.1.47 的 jar 包,创建一个新的 Demo 项目,把刚才的 jar 包加载到类库中,然后用最朴素的 Java 代码执行增删改查操作,如下:
+
+```java
+import java.sql.*;
+public class JavaDemo {
+ public static void main(String[] args) throws ClassNotFoundException,SQLException {
+ //1.加载驱动
+ Class.forName("com.mysql.jdbc.Driver");//固定写法,加载驱动
+ //2.用户信息和url
+ String url="jdbc:mysql://10.211.55.73:2883/test?useUnicode=true&characterEncoding=utf8&&useSSL=true";
+ String username = "root";
+ String password = "observer";
+ //3.连接成功,连接数据库对象 Connection
+ Connection connection = DriverManager.getConnection(url,username,password);
+ //4.执行SQL对象 Statement
+ Statement statement = connection.createStatement();
+
+ //5.执行SQL可能存在的结果,查看返回的结果
+ System.out.println("-------------------当前查询到的数据如下-------------------");
+ ResultSet resultSet = statement.executeQuery("SELECT * FROM t1");//返回的结果集,封装了查询出来的全部结果
+ while(resultSet.next()) {
+ System.out.println("id="+resultSet.getObject("id"));
+ System.out.println("name="+resultSet.getObject("NAME"));
+ }
+
+ System.out.println("-------------------当前数据库的行数如下-------------------");
+ ResultSet curCount = statement.executeQuery("select count(*) from t1");
+ while(curCount.next()) {
+ System.out.println("当前数据库有数据 "+curCount.getInt(1)+" 行!");
+ }
+
+ System.out.println("-------------------向该数据库中插入数据-------------------");
+ String insertSql = "insert into t1 values(3,'c')";
+ statement.execute(insertSql);//返回的结果
+
+ System.out.println("-------------------插入数据后的行数如下-------------------");
+ ResultSet afinCount = statement.executeQuery("select count(*) from t1");
+ while(afinCount.next()) {
+ System.out.println("当前数据库有数据 "+afinCount.getInt(1)+" 行!");
+ }
+
+ System.out.println("-------------------尝试更新插入进去的数据-------------------");
+ Integer updCount = statement.executeUpdate("update t1 set id=4 where name='c'");
+ System.out.println("更新了 "+updCount+" 行数据!");
+
+ System.out.println("-------------------尝试进行数据删除-------------------");
+ Boolean del = statement.execute("delete from t1 where name = 'c'");
+ ResultSet afdelCount = statement.executeQuery("select count(*) from t1");
+ while(afdelCount.next()) {
+ System.out.println("当前数据库有数据 "+afdelCount.getInt(1)+" 行!");
+ }
+
+ //6.释放连接
+ resultSet.close();
+ statement.close();
+ connection.close();
+ }
+}
+```
+
+执行结果也一目了然,没问题:
+
+
+
+## 1.2 OB 自研 JDBC 连接 Demo
+
+OceanBase 官方提供了自研的 JDBC 包,名字叫做:oceanbase-client-1.1.10.jar。选用这个包的话,整体的操作方法跟 1.1 部分类似,**主要区别为驱动加载和 url 部分的定义**:
+
+```java
+ //1.加载驱动
+ Class.forName("com.alipay.oceanbase.jdbc.Driver");//固定写法,加载驱动
+ //2.用户信息和url
+ String url="jdbc:oceanbase://10.211.55.73:2883/test";
+```
+
+按照惯例来说,官方自研的 JDBC 驱动在性能和语法兼容性上肯定会更好,当然我没有真正测过性能,大家可以自己测测试试。下面是一个完整 Demo 的增删改查代码:
+
+```java
+import java.sql.*;
+
+public class JavaOBDemo {
+ public static void main(String[] args) throws ClassNotFoundException,SQLException {
+ //1.加载驱动
+ Class.forName("com.alipay.oceanbase.jdbc.Driver");//固定写法,加载驱动
+ //2.用户信息和url
+ String url="jdbc:oceanbase://10.211.55.73:2883/test";
+ String username = "root";
+ String password = "observer";
+ //3.连接成功,连接数据库对象 Connection
+ Connection connection = DriverManager.getConnection(url,username,password);
+ //4.执行SQL对象 Statement
+ Statement statement = connection.createStatement();
+
+ //5.执行SQL可能存在的结果,查看返回的结果
+ System.out.println("-------------------当前查询到的数据如下-------------------");
+ ResultSet resultSet = statement.executeQuery("SELECT * FROM t1");//返回的结果集,封装了查询出来的全部结果
+ while(resultSet.next()) {
+ System.out.println("id="+resultSet.getObject("id"));
+ System.out.println("name="+resultSet.getObject("NAME"));
+ }
+
+ System.out.println("-------------------当前数据库的行数如下-------------------");
+ ResultSet curCount = statement.executeQuery("select count(*) from t1");
+ while(curCount.next()) {
+ System.out.println("当前数据库有数据 "+curCount.getInt(1)+" 行!");
+ }
+
+ System.out.println("-------------------向该数据库中插入数据-------------------");
+ String insertSql = "insert into t1 values(3,'c')";
+ statement.execute(insertSql);//返回的结果
+
+ System.out.println("-------------------插入数据后的行数如下-------------------");
+ ResultSet afinCount = statement.executeQuery("select count(*) from t1");
+ while(afinCount.next()) {
+ System.out.println("当前数据库有数据 "+afinCount.getInt(1)+" 行!");
+ }
+
+ System.out.println("-------------------尝试更新插入进去的数据-------------------");
+ Integer updCount = statement.executeUpdate("update t1 set id=4 where name='c'");
+ System.out.println("更新了 "+updCount+" 行数据!");
+
+ System.out.println("-------------------尝试进行数据删除-------------------");
+ Boolean del = statement.execute("delete from t1 where name = 'c'");
+ ResultSet afdelCount = statement.executeQuery("select count(*) from t1");
+ while(afdelCount.next()) {
+ System.out.println("当前数据库有数据 "+afdelCount.getInt(1)+" 行!");
+ }
+
+ //6.释放连接
+ resultSet.close();
+ statement.close();
+ connection.close();
+ }
+}
+```
+
+有关 OB 自研 JDBC 的参数调优,请参考官方文档:https://open.oceanbase.com/docs/observer-cn/V3.1.4/10000000000450598
+
+## 1.3 对常用框架的支持
+
+这也是个经常被问到的问题,我在社区群中不止一次看到有人问 OceanBase 对通用框架/连接池支持怎么样?大家想想,OB 在阿里内部及很多企业级客户都有很深入的应用了,对通用框架的支持已经不会是一个大问题了,**简言之:支持的很不错**。下面我列举几个官方给出的常用框架支持方式,供大家参考:
+
+### 1.3.1 MyBatis 连接示例
+
+MyBatis 作为一款应用量排名靠前的框架,深受大家的喜爱。下面给出了一些常用的配置信息,供您参考:
+
+#### 配置依赖
+
+```xml
+
+ com.alipay.oceanbase
+ oceanbase-client
+ 3.2.3
+
+
+ org.mybatis
+ mybatis
+ 3.5.4
+
+```
+
+#### mybatis-config.xml 配置文件
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+#### mapper.xml 配置文件
+
+```xml
+
+
+
+
+
+
+
+ delete from user;
+
+
+```
+
+### 1.3.2 HiKariCP 连接池配置示例
+
+HiKariCP 以代码轻量且速度非常快著称,以下信息展示了 OceanBase 与该框架的集成方法:
+
+#### 配置依赖 pom.xml
+
+```xml
+
+ com.alipay.oceanbase
+ oceanbase-client
+ 3.2.3
+
+
+ com.zaxxer
+ HikariCP
+ 3.3.1
+
+```
+
+#### 配置文件 jdbc.properties
+
+```conf
+jdbcUrl=jdbc:oceanbase://10.100.xxx.xxx:18817/test?useSSL=false&useServerPrepStmts=true&serverTimezone=UTC
+username=admin@mysql
+password=admin
+dataSource.cachePrepStmts=true
+dataSource.prepStmtCacheSize=250
+dataSource.prepStmtCacheSqlLimit=2048
+dataSource.useServerPrepStmts=true
+dataSource.useLocalSessionState=true
+dataSource.rewriteBatchedStatements=true
+dataSource.cacheResultSetMetadata=true
+dataSource.cacheServerConfiguration=true
+dataSource.elideSetAutoCommits=true
+dataSource.maintainTimeStats=false
+```
+
+#### 示例代码
+
+```java
+ @Test
+ public void hikariTest() throws SQLException {
+ HikariConfig config = new HikariConfig("/jdbc.properties");
+ Connection conn = new HikariDataSource(config).getConnection();
+ PreparedStatement drop_table_data_test = conn.prepareStatement("drop table data_test");
+ Statement stmt = conn.createStatement();
+ try {
+ drop_table_data_test.execute();
+ } catch (SQLException e) {
+ }
+ conn.prepareStatement("create table data_test(test1 int)").execute();
+ for (int i = 0; i <= 10; i++) {
+ stmt.executeUpdate("insert into data_test values("+i+")");
+ }
+ ResultSet rs = conn.prepareStatement("select * from data_test;").executeQuery();
+ while (rs.next()){
+ System.out.print(rs.getObject(1)+"\t");
+ }
+ System.out.println();
+ System.out.println("------------------------");
+ stmt.executeUpdate("update data_test set test1 = 100;");
+ ResultSet rs1 = conn.prepareStatement("select * from data_test;").executeQuery();
+ while (rs1.next()){
+ System.out.print(rs1.getObject(1)+"\t");
+ }
+ System.out.println();
+ System.out.println("------------------------");
+ stmt.executeUpdate("delete from data_test");
+ ResultSet rs2 = stmt.executeQuery("select * from data_test;");
+ if (!rs2.next()){
+ System.out.println("数据删除成功");
+ }
+ stmt.close();
+ drop_table_data_test.execute();
+ drop_table_data_test.close();
+ rs.close();
+ conn.close();
+ }
+```
+
+### 1.3.3 SpringJDBC 连接示例
+
+SpringJDBC 是老牌的持久层框架了,下面也来一个简单的 Demo:
+
+#### 配置依赖
+
+```xml
+
+ com.alipay.oceanbase
+ oceanbase-client
+ 3.2.3
+
+
+ org.springframework
+ spring-jdbc
+ 5.0.9.RELEASE
+
+```
+
+#### 示例代码
+
+预加载静态代码块(为方便测试,此处使用 druid 连接池):
+
+```java
+static {
+ Map map = new HashMap();
+ map.put("url", "jdbc:oceanbase://10.100.xxx.xxx:18815/test");
+ map.put("driverClassName", "com.alipay.oceanbase.jdbc.Driver");
+ map.put("username", "admin@mysql");
+ map.put("password", "admin");
+ try {
+ Class.forName(map.get("driverClassName"));
+ jdbcTemplate = new JdbcTemplate(DruidDataSourceFactory.createDataSource(map));
+ //防止异常语句,没有这两句,会出错
+ jdbcTemplate.execute("set transaction_isolation = 'READ-COMMITTED';");
+ jdbcTemplate.execute("set tx_isolation = 'READ-COMMITTED';");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+}
+```
+
+```java
+ @Test
+ public void createByOrcTypeDate(){
+ sql ="create table D_DPRECORD(DEV_ID VARCHAR2(50),"+
+ "CAR_SPEED NUMBER(3),"+
+ "CAP_DATE TIMESTAMP WITH LOCAL TIME ZONE," +
+ "DEV_CHNID VARCHAR2(50) not null," +
+ "TRSFMARK NUMBER(1) default 0," +
+ "CREATE_TIME DATE default sysdate" +
+ ");";
+ jdbcTemplate.execute(sql);
+ }
+```
+
+```java
+ @Test
+ public void addTest(){
+ int i = 1;
+ for (;i<=100;i++){
+ sql = "insert into orc_type_test values ("+i+",'测试数据"+i+"');";
+ jdbcTemplate.execute(sql);
+ }
+ }
+```
+
+```java
+ @Test
+ public void selectTest(){
+ sql = "select * from orc_type_test;";
+ List