一. 连接

1.使用try with resources关闭JDBC资源

示例代码如下:

public List<User> getUser(int userId) {
try (Connection con = DriverManager.getConnection(myConnectionURL);
PreparedStatement ps = createPreparedStatement(con, userId);
ResultSet rs = ps.executeQuery()) { // process the resultset here, all resources will be cleaned up } catch (SQLException e) {
e.printStackTrace();
}
} private PreparedStatement createPreparedStatement(Connection con, int userId) throws SQLException {
String sql = "SELECT id, username FROM users WHERE id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, userId);
return ps;
}

摘自:

How should I use try-with-resources with JDBC?

传统的关闭JDBC资源的方法,如下:

public static void realeaseAll(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try{
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

或者利用jdk1.7 AutoCloseable,代码如下。

/**
* 如需同时关闭resultset,statement与connection,请依次按顺序关闭,即按照r->s->c的顺序将参数放入closeAll
* @param obj
*/
public static void closeAll(AutoCloseable... obj) {
for (AutoCloseable item : obj) {
try {
if(item!=null){
item.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

在jdk1.7中因为所有的资源都要实现AutoCloseable接口,所以可以利用其进行关闭。当然,直接用try with resources语法是最好的。

2.使用C3P0连接数据库提示“Apparent Dead Lock”

一般都是因为用户名密码写错了(注意空格等)。不是这个原因的再查看其它地方。

3.使用C3P0连接数据的工具类JdbcPoolUtil

public class JdbcPoolUtil {
private static ComboPooledDataSource cpds; static{ cpds = new ComboPooledDataSource();//默认读取classpath下的c3p0.properties文件
/*Properties prop = new Properties();//另外一种读取配置文件的方法
try {
InputStream in = JdbcPoolUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
prop.load(in);
cpds.setDriverClass(prop.getProperty("jdbc.driverClass"));
cpds.setJdbcUrl(prop.getProperty("jdbc.jdbcUrl"));
cpds.setUser(prop.getProperty("jdbc.user"));
cpds.setPassword(prop.getProperty("jdbc.password"));
cpds.setInitialPoolSize(Integer.parseInt(prop.getProperty("jdbc.initialPoolSize")));
cpds.setMaxPoolSize(Integer.parseInt(prop.getProperty("jdbc.maxPoolSize")));
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
} */
} public static DataSource getDataSource() {
return cpds;
} public static Connection getConnection() throws SQLException{
Connection conn = cpds.getConnection();
return conn;
} //其他代码 }

这里默认读取classpath下的c3p0.properties文件,也可使用注释中的方法对指定配置文件读取。

二. 处理日期

1. 将指定格式的日期字符串转化为LocalDateTime

String timeStamp = "20170818103605"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime dateTime = LocalDateTime.parse(timeStamp, formatter);

三. 写入

1. 一种通用的插入方法

使用insert插入数据,一般格式如下:insert table1(col1, col2) values(?, ?)。各种插入业务所不同的是每列的数据类型和到底有多少列。可以使用如下方法进行统一插入:

public static int insert(Connection conn, String sql, Object[] params){
PreparedStatement pstmt = null;
int result = 0;
try{
pstmt = conn.prepareStatement(sql);
for(int i =0; i<params.length; i++){
pstmt.setString(i+1, params[i]!=null?params[i].toString():null);
}
result = pstmt.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally{
//关闭数据库相关资源的代码
}
return result;
}

注意:params中存储的对象的toString方法返回的值是否是你需要插入的值。

还可使用setObject(int parameterIndex, Object x)方法,更简单。不过这两种方法在处理null值的时候有兼容性问题,可使用setNullsetObject(int parameterIndex, Object x, int sqlType)

四. 读取

1. 当数据库中某列值NULL是,ResultSet的getDouble(任何get数值类型的操作)结果返回0.0

public class ReadData {

    public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test1";
String userName = "root";
String password = "123456";
String sql = "select id,stuno,age,birthdate,major from students"; try (Connection con = DriverManager.getConnection(url, userName, password);
PreparedStatement pStatement = con.prepareStatement(sql);
ResultSet rs = pStatement.executeQuery()) {
while (rs.next()) {
/*注意:getInt的返回值*/
System.out.printf("id=%s stuno=%s age=%s bd=%s major=%s%n", rs.getInt("id"), rs.getString("stuno"), rs.getInt("age"),
rs.getDate("birthdate"), rs.getString("major"));
/*可以全用getString返回数据*/
System.out.printf("id=%s stuno=%s age=%s bd=%s major=%s%n", rs.getString("id"), rs.getString("stuno"), rs.getString("age"),
rs.getString("birthdate"), rs.getString("major"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

对于记录:2 20150112 吴京 m null null null返回结果如下:

id=2 stuno=20150112 age=0 bd=null major=null
id=2 stuno=20150112 age=null bd=null major=null

可以看到age虽然为Null但是返回0。那么如何返回null值呢?参考如下代码:

Integer age = rs.getInt("age");
Object oAge = rs.getObject("age");
System.out.printf("age=%s, oAge=%s%n",age, oAge);

打印结果为age=0, oAge=null。还可使用如下方法:

Integer age = rs.getInt("age");
if (rs.wasNull())
age = null;

2. 使用getString可以以字符串形式返回任何类型的数据

数据同上,使用如下代码:

/*可以全用getString以字符串形式返回数据*/
System.out.printf("id=%s stuno=%s age=%s bd=%s major=%s%n", rs.getString("id"), rs.getString("stuno"), rs.getString("age"), rs.getString("birthdate"), rs.getString("major"));

返回结果为:id=2 stuno=20150112 age=null bd=null major=null。注意:数据库中的null值被转化为null。

JDBC访问数据库的一些小技巧的更多相关文章

  1. 如何通过JDBC访问数据库

    Java数据库连接(JDBC)用与在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC操作数据库 ...

  2. java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)

    一.Jdbc访问数据库步骤通俗解释(吃饭) 1)加载驱动 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServer”); 2) 与数据库建立连接 Co ...

  3. Jdbc访问数据库篇

    一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...

  4. 2017.10.3 JDBC访问数据库的建立过程

    1·JDBC访问数据库,其访问流程: (1)注册驱动 (2)建立连接(Connection) (3)创建数据库操作对象用于执行SQL语句 (4)执行语句 (5)处理执行结果 (6)释放资源 2·注册驱 ...

  5. JDBC访问数据库的具体步骤(MySql + Oracle + SQLServer)

    * 感谢DT课堂颜群老师的视频讲解(讲的十分仔细,文末有视频链接) import java.sql.Connection; import java.sql.DriverManager; import ...

  6. Spring实战6:利用Spring和JDBC访问数据库

    主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...

  7. 【jdbc访问数据库获取执行sql转换json】

    Talk is cheap.Show me your code. import java.sql.*; import java.util.HashMap; import java.util.Map; ...

  8. javaweb三、JDBC访问数据库

    JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的 ...

  9. java之连接数据库之JDBC访问数据库的基本操作

    1.将数据库的JDBC驱动加载到classpath中,在基于JavaEE的web应用实际开发过程中通常要把目标数据库产品的JDBC驱动复制到WEB—INF/lib下. 2.加载JDBC驱动并将其注册到 ...

随机推荐

  1. scrapy.Spider的属性和方法

    scrapy.Spider的属性和方法 属性: name:spider的名称,要求唯一 allowed_domains:允许的域名,限制爬虫的范围 start_urls:初始urls custom_s ...

  2. SQL基础-----DDL

    1 (My)SQL入门 这里用了(My)SQL这样的标题,目的是介绍标准SQL的同时,也将MySQL在标准SQL上的扩展一同介绍给读者. 2:SQL分类 SQL语句主要可以划分为以下3个类别 .DDL ...

  3. ls-dyna基础教程

    刚刚开始使用ls-dyna,几天前还只知道点开dyna界面,然后就没有然后了,没人带,资料也没多少,但是科研还得继续往下做呀(手动滑稽),通过在仿真论坛上搜索相关的资料,并通过自己的一步步操作,做了大 ...

  4. jQuery系列 第六章 jQuery框架事件处理

    第六章 jQuery框架事件处理 JavaScript以事件驱动来实现页面的交互,其核心是以消息为基础,以事件来驱动.虽然利用传统的JavaScript事件处理方式也能够完成页面交互,但jQuery框 ...

  5. 【推荐】CentOS修复OpenSSH用户枚举漏洞

    注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #漏洞说明# OpenSSH(OpenBSD Secure Shell)是OpenBSD计划组所维护的一套用于安全访问远程计算机的 ...

  6. springaop——AspectJ不可不知的细节

    springaop简介 springaop是spring对AOP技术的具体实现,它是spring框架的核心技术.springaop底层使用JDK动态代理或CGLIB动态代理技术实现. 应用场景: 在多 ...

  7. SpringMVC 自定义类型转换器

    先准备一个JavaBean(Employee) 一个Handler(SpringMVCTest) 一个converters(EmployeeConverter) 要实现的输入一个字符串转换成一个emp ...

  8. 页面中引入mui 地址选择,点击页面中其他input时页面回到顶部

    问题:在页面中引入mui地址选择时,点击页面中的input页面会滚到顶部(谷歌浏览器中出现的bug),在手机上点击input会出现跳动.开始的时候是想修改mui.min.js里的滚动事件,但是后来找到 ...

  9. [SDOI2016]排列计数

    Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...

  10. 17.10.31&11.01

    10.31模拟考试 Prob.1(AC)裸的矩阵幂 Prob.2(WA)(类似括号匹配求合法方案数) 卡特兰数的一个模型运用.可以推出一个式子(推导方法一个erge讲的,一个骚猪讲的) Prob.3( ...