写点什么

JDBC 访问数据库的一些小技巧

  • 2022 年 5 月 15 日
  • 本文字数:1847 字

    阅读完需:约 6 分钟

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


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




public class JdbcPoolUtil {


private static ComboPooledDataSource cpds;


static{


cpds = new ComboPooledDataSource();// 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 默认读取 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;

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
JDBC访问数据库的一些小技巧_程序员_爱好编程进阶_InfoQ写作社区