教你一招!轻松使用Java代码操作数据库
1、什么是JDBC?
JDBC(Java DataBase Connectivity.java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组Java语言编写的类和接口组成。JDBC提供一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。
2、JDBC是怎样实现连接数据库并操作数据库的呢?
首先,我们需要导入一个jar包来加载建立数据库的连接的驱动
// 1.加载数据库提供商提供的驱动(反射机制) Class.forName("com.mysql.jdbc.Driver"); // DriverManager.registerDriver(new Driver()); // 2.获取数据库的连接对象 Connection conn = DriverManager.getConnection ("jdbc:mysql://127.0.0.1:3306/mydb", "root", "123456");//数据库URL // 3.获取处理命令(用于处理sql语句) Statement stmt = conn.createStatement(); // PreparedStatement ps = conn.prepareStatement(); // 4.发送执行sql语句 boolean b = stmt.execute("insert into tb_user values(1,"张三","123321")");//对数据库操作的sql语句 // 5.处理执行结果 System.out.println(b); // 6.回收资源 stmt.close(); conn.close(); 在我们要对数据库操作时,我们就需要通过这六个步骤来实现对数据库的连接与操作功能。简单地说,JDBC可做三件事:与数据库建立连接、发送操作数据库的语句并处理结果。
3、JDBC的简化代码工具类是如何产生的呢?
了解了JDBC的基本原理之后,想必也就知道了每次我们需要对数据库进行操作的时候就需要按照这六个步骤来实现。那么,我们是否能根据前面所学的Java基础知识来实现对JDBC代码的封装呢?
①首先要知道为什么要封装?
封装:封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。
②回忆一下,什么是封装?
封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
③封装的作用与用途有哪些?
(1)对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
(2)对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
4、DBUtils.java——JDBC的通用数据库连接工具类
我们可以将本地配置的信息放在jdbc.properties中,以便在不同的机器上工作时不同机器配置的修改简便。
示例代码:
####mysql connection info#### driver = com.mysql.jdbc.Driver url = jdbc:mysql://127.0.0.1:3306/mydb user = root password = 123456 ####MSSQLServer connection info#### #driver = com.microsoft.sqlserver.jdbc.SQLServerDriver #url = jdbc:sqlserver://127.0.0.1:1433;databaseName=test #user = sa #password = 123456 ####Oracle connection info#### #driver = com.oracle.driver.OracleDriver #url = jdbc:oracle:thin:@127.0.0.1:1521:orcl #user = scott #password = 123456 ##pool config### initSize = 10 maxSize = 50 maxIdle = 30 maxWait = 10000
package com.softeem.dbutils; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.Properties; import org.apache.commons.dbcp2.BasicDataSource; /** * DBCP数据库连接工具类 * 依赖 * 1> mysql驱动 * 2> dbcp相关插件 * @author lx * */ public class DBUtils { // 连接数据库基本属性 private static String driver; private static String url; private static String username; private static String password; private static BasicDataSource bds;// 数据源 // 连接池属性 private static int initSize; private static int maxSize; private static int maxIdle; private static long maxWait; static{ init(); } public static void init(){ try { // 创建数据源对象 bds = new BasicDataSource(); // 加载属性文件,获取属性信息 Properties props = new Properties(); props.load(DBUtils.class.getResourceAsStream("jdbc.properties")); driver = props.getProperty("driver"); url = props.getProperty("url"); username = props.getProperty("user"); password = props.getProperty("password"); initSize = Integer.parseInt(props.getProperty("initSize")); maxSize = Integer.parseInt(props.getProperty("maxSize")); maxIdle = Integer.parseInt(props.getProperty("maxIdle")); maxWait = Long.parseLong(props.getProperty("maxWait")); // 设置驱动类路径 bds.setDriverClassName(driver); bds.setUrl(url); bds.setUsername(username); bds.setPassword(password); bds.setInitialSize(initSize); // 初始连接数 bds.setMaxTotal(maxSize); // 最大连接数 bds.setMaxIdle(maxIdle); // 最大闲置连接数 bds.setMaxWaitMillis(maxWait);// 等待获取连接的最大时间(ms) } catch (IOException e) { e.printStackTrace(); } } // 获取连接 public static Connection getConn(){ if(bds == null || bds.isClosed()){ init(); } try { return bds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } //封装资源回收的方法 public static void close(ResultSet rs,Statement stat,Connection conn){ try { if(rs != null) rs.close(); if(stat != null) stat.close(); if(conn != null)conn.close(); } catch (SQLException e) { e.printStackTrace(); } } /** * 通用增删改 * @param conn * @param sql * @param objs * @return */ public static boolean execUpdate(Connection conn, String sql, Object ...objs){ try { PreparedStatement ps = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { ps.setObject(i+1, objs[i]); } int i = ps.executeUpdate(); return i > 0 ? true : false; } catch (SQLException e) { e.printStackTrace(); } return false; } // 封装查询操作 public static <T> List<T> execQuery(String sql,CallBack<T> call, Object ...params){ Connection conn = DBUtils.getConn(); PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i+1, params[i]); } ResultSet rs = ps.executeQuery(); return call.getDatas(rs); } catch (SQLException e) { e.printStackTrace(); } return null; } // 查询单个对象 public static <T> T execQueryOne(String sql,CallBack<T> call, Object ...params){ Connection conn = DBUtils.getConn(); PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i+1, params[i]); } ResultSet rs = ps.executeQuery(); return call.getData(rs); } catch (SQLException e) { e.printStackTrace(); } return null; } // JDK1.8+新特性 public interface CallBack<T>{ // public List<T> getDatas(ResultSet rs); default List<T> getDatas(ResultSet rs) { return null; } default T getData(ResultSet rs) { return null; } } // 低版本JDK 用抽象类实现 // public static abstract Callback<T>{ // default List<T> getDatas(ResultSet rs) { // return null; // } // default T getData(ResultSet rs) { // return null; // } // } }