[关闭]
@wuxin1994 2019-03-21T11:01:39.000000Z 字数 7078 阅读 32

数据库(3)-JDBC

数据库 JAVA


JDBC概述

Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。它JDBC是面向关系型数据库的。
即用于执行SQL语句的JAVA API。

一、安装和配置

直接按照教程,话不多说。
MySQL安装图解

二、下载数据库对应的jar包

(1)在MySQL官网页面,选择对应系统的文件。如果是windows系统,选择Platform Independent对应的jar包即可。

(2)复制mysql-connector-java-8.0.15.jar包到你的\jre1.8.0_181\lib\ext文件夹下。

三、JDBC基本操作

(1)使用的基本步骤

a.注册驱动

  1. DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  2. //上面这种方法相当于注册两次驱动,因此没有必要,最好用下面这种代码:
  3. Class.forName("com.mysql.jdbc.Driver");//deprecated
  4. Class.forName("com.mysql.cj.jdbc.Driver");

b.建立连接

  1. //1. 一个参数,用&隔开
  2. DriverManager.getConnection("jdbc:mysql://localhost/database_name?user=user&password=password");
  3. //2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
  4. conn = DriverManager.getConnection("jdbc:mysql://localhost/database_name", "user", "password");

c.创建statement

  1. //3. 创建statement对象 ,很重要的一个类
  2. st = conn.createStatement();

d.执行sql ,得到ResultSet

  1. //4. 执行查询 , 得到结果集
  2. String sql = "select * from table_name";
  3. rs = st.executeQuery(sql);

e.遍历结果集

  1. //5. 遍历查询每一条记录
  2. while(rs.next()){
  3. int id = rs.getInt("id");
  4. String name = rs.getString("name");
  5. int age = rs.getInt("age");
  6. System.out.println("id="+id + "===name="+name+"==age="+age);
  7. }

f.释放资源

  1. if (rs != null) {
  2. try {
  3. rs.close();
  4. } catch (SQLException sqlEx) { } // ignore
  5. rs = null;
  6. }

(2)JDBC数据库CURD对应的SQL语句

通过代码示例了解如何通过JDBC对数据库进行增删改查的任务。

A. Insert

  1. // 1. 获取连接对象
  2. conn = JDBCUtil.getConn();
  3. // 2. 根据连接对象,得到statement对象
  4. st = conn.createStatement();
  5. // 3. 执行添加
  6. String sql = "insert into t_stu values(null , 'wufan' , 99)";
  7. //返回影响的行数,如果大于0表明操作成功。否则失败
  8. int result = st.executeUpdate(sql);
  9. if(result >0 ){
  10. System.out.println("添加成功");
  11. }else{
  12. System.out.println("添加失败");
  13. }

B. Delete

  1. // 1. 获取连接对象
  2. conn = JDBCUtil.getConn();
  3. // 2. 根据连接对象,得到statement
  4. st = conn.createStatement();
  5. // 3. 执行删除
  6. String sql = "delete from t_stu where name='wufan'";
  7. //返回影响的行数,如果大于0表明操作成功。否则失败
  8. int result = st.executeUpdate(sql);
  9. if(result >0 ){
  10. System.out.println("删除成功");
  11. }else{
  12. System.out.println("删除失败");
  13. }

C. Query

  1. // 1. 获取连接对象
  2. conn = JDBCUtil.getConn();
  3. // 2. 根据连接对象,得到statement
  4. st = conn.createStatement();
  5. // 3. 执行返回ResultSet.
  6. String sql = "select * from t_stu";
  7. rs = st.executeQuery(sql);
  8. // 4. 遍历结果集
  9. while (rs.next()) {
  10. String name = rs.getString("name");
  11. int age = rs.getInt("age");
  12. System.out.println(name + " " + age);
  13. }

D. Update

  1. // 1. 获取连接对象
  2. conn = JDBCUtil.getConn();
  3. // 2. 根据连接对象,得到statement
  4. st = conn.createStatement();
  5. // 3. 执行更新
  6. String sql = "update t_stu set age = 16 where name ='wufan'";
  7. //返回影响的行数,如果大于0表明操作成功。否则失败
  8. int result = st.executeUpdate(sql);
  9. if(result >0 ){
  10. System.out.println("删除成功");
  11. }else{
  12. System.out.println("删除失败");
  13. }

四、使用properties配置文件

(1)关于Properties

在JDBC中,Properties()是一种很方便的方法,不需要将url、user、password、driverClass写在代码方法中,而是写入配置文件,并通过调用配置文件实现。

(2)使用properties链接数据库

1.在src声明一个配置文件XXX.properties,内容如下:

  1. driverClass=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8
  3. username=root
  4. password=root

2.在工具类中,使用静态代码块读取属性。

  1. private static String driverClass;
  2. private static String url;
  3. private static String name;
  4. private static String password;
  5. static{
  6. try {
  7. //1. 创建一个属性配置对象
  8. Properties properties = new Properties();
  9. InputStream is = new FileInputStream("jdbc.properties"); //对应文件位于工程根目录
  10. //方法1:使用当前类加载器,读取src底下的资源文件。
  11. //InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
  12. //方法2:导入输入流。
  13. properties.load(is);
  14. //读取属性
  15. driverClass = properties.getProperty("driverClass");
  16. url = properties.getProperty("url");
  17. name = properties.getProperty("name");
  18. password = properties.getProperty("password");
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }

获取连接:

  1. public static Connection getConnection() {
  2. Connection conn = null;
  3. try {
  4. Class.forName(driverClass);
  5. conn = DriverManager.getConnection(url, username, password);
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. }
  9. return conn;
  10. }

释放资源:

  1. public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
  2. if (rs != null) {
  3. try {
  4. rs.close();
  5. } catch (SQLException e) {
  6. e.printStackTrace();
  7. }
  8. }
  9. if (pstmt != null) {
  10. try {
  11. pstmt.close();
  12. } catch (SQLException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. if (conn != null) {
  17. try {
  18. conn.close();
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

可以发现,这种方式能降低代码维护成本,解决了数据库更换的麻烦。

五、DAO模式

DAO: Data Access Object 数据访问对象

作用:

(1).隔离业务逻辑代码和数据访问代码,位于业务逻辑和持久化数据之间,实现对持久化数据的访问。
(2).隔离不同数据库的实现。

组成部分:

(1).DAO接口
(2).DAO实现类
(3).实体类
(4).数据库连接和关闭工具类

直接上代码

(1).DAO接口

  1. package jdbc;
  2. public interface DAO {
  3. void findeAll();
  4. }

(2).DAO实现类(实体类略去)

  1. package jdbc;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. /**
  6. * @Author: wufan
  7. */
  8. public class UerDao implements DAO {
  9. @Override
  10. public void findeAll() {
  11. Connection conn = null;
  12. Statement st = null;
  13. ResultSet rs = null;
  14. try {
  15. //1. 获取连接对象
  16. conn = JDBCUtil.getConnection();
  17. //2. 创建statement对象
  18. st = conn.createStatement();
  19. String sql = "select * from user";
  20. rs = st.executeQuery(sql);
  21. while(rs.next()){
  22. String phone = rs.getString("phone");
  23. int id = rs.getInt("uid");
  24. System.out.print(id+"\t"+phone);
  25. System.out.println("");
  26. }
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }finally {
  30. JDBCUtil.release(conn, st, rs);
  31. }
  32. }
  33. public static void main(String[] args) {
  34. UerDao ud = new UerDao();
  35. ud.findeAll();
  36. }
  37. }

(4).数据库连接和关闭工具类

  1. package jdbc;
  2. import java.io.FileInputStream;
  3. import java.io.InputStream;
  4. import java.sql.*;
  5. import java.util.Properties;
  6. /**
  7. * @Author: wufan
  8. */
  9. public class JDBCUtil {
  10. private static String driverClass;
  11. private static String url;
  12. private static String username;
  13. private static String password;
  14. static{
  15. try {
  16. Properties properties = new Properties();
  17. //InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("JDBC.properties");
  18. InputStream is = new FileInputStream("P:\\Java\\Database\\src\\JDBC.properties"); //对应文件位于工程根目录
  19. properties.load(is);
  20. driverClass = properties.getProperty("driverClass");
  21. url = properties.getProperty("url");
  22. username = properties.getProperty("username");
  23. password = properties.getProperty("password");
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. //获取连接
  29. public static Connection getConnection() {
  30. Connection conn = null;
  31. try {
  32. Class.forName(driverClass);
  33. conn = DriverManager.getConnection(url, username, password);
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. return conn;
  38. }
  39. //释放资源
  40. public static void release(Connection conn, Statement pstmt, ResultSet rs) {
  41. if (rs != null) {
  42. try {
  43. rs.close();
  44. } catch (SQLException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. if (pstmt != null) {
  49. try {
  50. pstmt.close();
  51. } catch (SQLException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. if (conn != null) {
  56. try {
  57. conn.close();
  58. } catch (SQLException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. }

六、PrepareStatement

在需要传入参数的SQL语句中,替换Statement对象。

相比较以前的Statemen, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用?占位符来替代后续要传递进来的变量。后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。

  1. String sql = "insert into table_name values(? , ? , ?)";
  2. PrepareStatement ps = conn.prepareStatement(sql);
  3. //给占位符赋值
  4. //注意从左到右数过来,1 代表第一个问号, 永远从1开始。
  5. ps.setInt(1,id);
  6. ps.setString(2, userName);
  7. ps.setString(3, phone);

七、遇到的错误

(1)time zone错误

  1. SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
  2. SQLState: 01S00
  3. VendorError: 0

这是由于数据库和系统时区差异所造成的,简单的方法是再url后面加上

  1. serverTimezone=GMT

比如:

  1. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/database_name?"+"user=root&password=root"+"&serverTimezone=GMT");

(2) java.io.FileNotFoundException: JDBC.properties (系统找不到指定的文件。)
解决办法1:使用类加载

  1. InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("JDBC.properties");

办法2:改用全路径

  1. InputStream is = new FileInputStream("P:\\Java\\Database\\src\\JDBC.properties");

参考链接:
1.mysql-8.0.13使用jdbc与java连接教程
2.通过JDBC进行简单的增删改查(以MySQL为例)
3.《高性能MySQL》

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注