java监控jdbc connect,JDBC编程 - 获取Connection及常见问题

使用JDBC连接Oracle

实现思路:

使用一个名为oracle.properties的文件,里面写有Oracle的URL,User,Password和driver类,通过ClassLoader的输入流,输入流中有输入进程序的Oracle连接初始化参数,输入流在Properties中load中得到加载。通过getProperty(String key)得到文件信息。

JdbcUtils.java

package exer.jdbcutils;

import java.io.IOException;

import java.io.InputStream;

import java.sql.*;

import java.util.Properties;

import java.io.IOException;

import java.io.InputStream;

import java.sql.*;

import java.util.Properties;

/**

* @author mmengyiyu

* @date 2019/11/15 16:47

*/

public class JdbcUtils {

private static String url;

private static String user;

private static String pwd;

private static String driverClass;

// 加载mysql.properties资源

static {

InputStream resource = JdbcUtils.class.getClassLoader().getResourceAsStream("exer\jdbcutils\oracle.properties");

Properties prop = new Properties();

try {

prop.load(resource);

url = prop.getProperty("jdbc.url");

user = prop.getProperty("jdbc.user");

pwd = prop.getProperty("jdbc.pwd");

driverClass = prop.getProperty("jdbc.driverClass");

Class.forName(driverClass);

} catch (IOException | ClassNotFoundException e) {

e.printStackTrace();

}

}

/**

* 释放数据库连接和其JDBC资源

* @author mmengyiyu

* @date 2019-11-15 19:27

* @param conn 要释放的资源引用

*/

public static void release(Connection conn) {

if (conn != null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

/**

* 释放预编译语句和其JDBC资源

* @author mmengyiyu

* @date 2019-11-15 19:27

* @param ps 要释放的SQL语句

*/

public static void release(PreparedStatement ps) {

if (ps != null) {

try {

ps.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

/**

* 释放语句和其JDBC资源

* @author mmengyiyu

* @date 2019-11-15 19:27

* @param st 要释放的SQL语句

*/

public static void release(Statement st) {

if (st != null) {

try {

st.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

/**

* 释放结果集和其JDBC资源

* @author mmengyiyu

* @date 2019-11-15 19:27

* @param rs 要释放的SQL结果集

*/

public static void release(ResultSet rs) {

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

/**

* 返回MySQL数据库连接

* @author mmengyiyu

* @date 2019-11-15 19:28

* @return 数据库连接

*/

public static Connection getConnection() {

Connection conn = null;

try {

conn = DriverManager.getConnection(url,user,pwd);

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

}

oracle.properties

# oracle 11

jdbc.url = jdbc:oracle:thin:@//127.0.0.1:1521/orcl

jdbc.user = scott

jdbc.pwd = 123456

jdbc.driverClass = oracle.jdbc.driver.OracleDriver

常见问题 - Java字符串如何转换成Oracle Date类型

解决这个问题的思路如下:

Oracle Date是不同于Java String类型的。Java想要写入一个Oracle Date数据,需要把字符串转为java.sql.Date。字符串转换为java.sql.Date需要经过以下几步:

将字符串转化为JDK1.8提供的java.time.LocalDate,或java.time.LocalTime或java.time.LocalDateTime类型。

使用java.sql.Date.valueOf()将java.time.LocalDate,或java.time.LocalTime或java.time.LocalDateTime类型转为java.sql.Date

Oracle Date类型

Date值的格式为NLS_DATE_FORMAT,其具体格式如下:

DD-MON-RR

在这里我们使用java.sql.Date和java.time.LocalDate,源码部分如下

import java.sql.Date;

import java.time.LocalDate;

...

System.out.println("生日(格式要求:\"yyyy-MM-dd\"):");

String birthday = sc.next();

String[] split = birthday.split("-");

Date date = Date.valueOf(LocalDate.of(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2])));

这样就能把从屏幕上输入的字符串转换为java.sql.Date。

常见问题 - 使用JDBC对Oracle DML操作后一定要调用事务提交方法

由于Oracle数据库事务默认不自动提交。那么一旦编程中涉及增删改数据库(DML),一定要conn.commit(),不然的话,数据库结果无法持久化!

最直观的感受就是:明明我的insert/update/delete了表中的记录,为什么使用数据库软件查询表时表中没任何变化呢。

当然,如果一次事务中DML操作失败了,那么进入catch块就需要回滚事务了。

部分源码如下:

Connection conn = null;

try {

...

conn = JdbcUtils.getConnection();

...(使用连接进行数据库操作)

...

// 如果数据库操作涉及DML操作,一定要提交事务,因为Oracle默认不自动提交事务。

conn.commit();

conn.close();

} catch (SQLException e) {

// 能走到这步,是因为try块中出错了,根据事务ACID,回滚来结束事务。

try {

conn.rollback();

} catch (SQLException ex) {

ex.printStackTrace();

}

e.printStackTrace();

} finally {

JdbcUtils.release(conn);

}

在Jdbc哪些编程内容需要掌握

写一个Jdbc工具类,里面涉及数据库连接的加载和与Jdbc资源相关的释放操作。

怎么对表进行CRUD

对表添加一个标记(用于标记是否删除,0 - 已删除, 1 - 正常使用,暂且命名为status),删除表的操作转化为UPDATE表中的status标记,而不是使用DELETE

如何根据主键所在字段的多个字段值删除多个记录。

比如,使用DBUtils中的QueryRunner.query()和QueryRunner.update()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值