Skip to content

数据库 jar 包

下载

  1. 下载地址:https://mvnrepository.com/

  2. 搜索数据库


  3. 搜索后我们选择 -java 版


  4. 根据数据库的版本号下载 jar 包


  5. 点击 jar 即可下载

导入

  1. 在项目根目录中创建 lib 资源包文件夹。

  2. 将上面下载的 jar 包放到 lib 文件夹里。

  3. 在 jar 包上右键,选择 Add as Library

访问数据库流程

加载 JDBC 驱动程序。

java
public class Demo {
    public void join(){
        try {
            // Class.forName("com.mysql.jdbc.Driver");  // mysql 5.*
            Class.forName("com.mysql.cj.jdbc.Driver");  // mysql 8.*
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

连接数据库

  1. 三要素:url、username、password

  2. 代码

java
// String url = "jdbc:mysql://localhost:3306/xscj";    // mysql 5.*
String url = "jdbc:mysql://localhost:3306/xscj?serverTimezone=Asia/Shanghai&useSSL=false";   // mysql 8.*
String user = "root";
String password = "";
Connection con = null;
try {
    con = DriverManager.getConnection(url,user,password);
    System.out.println(con);
} catch (SQLException e) {
    e.printStackTrace();
}

查询数据

java
String sql = "select * from student where id=081101";
Connection con = null;
Statement st = null;
ResultSet rs = null;

try {
    con = DriverManager.getConnection(url,user,password);
    st = con.createStatement();
    rs = st.executeQuery(sql);
    while (rs.next()) {
        int uid = rs.getInt("id");
        String uname = rs.getString("name");
        String usex = rs.getString("sex");
        System.out.printf("id: %d, name: %s, sex: %s",uid,uname,usex);
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    try {
        if (rs != null) rs.close();
        if (st != null) st.close();
        if (con != null) con.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

封装工具类

创建 DB 工具类

  1. 在项目根目录中创建一个存放工具类的包,一般命名为 util

  2. 在 util 中创建 DB 类

  3. 代码

    java
    package util;
    
    import java.sql.*;
    
    public class DB {
        static {
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");  // mysql 8.*
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        // 获取数据库连接
        public static Connection getConnection() throws SQLException {
            String url = "jdbc:mysql://localhost:3306/xscj?serverTimezone=Asia/Shanghai&useSSL=false";   // mysql 8.*
            String user = "root";
            String password = "";
            return DriverManager.getConnection(url,user,password);
        }
    
        // 关闭数据库资源
        public static void close(Connection con, Statement st, ResultSet rs) {
            try {
                if (rs != null) rs.close();
                if (st != null) st.close();
                if (con != null) con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

查询数据

  1. MySQL 查询语句关键字 select,详细请看 MySQL 笔记

  2. 查询数据的结果集存到 ResultSet 类型的变量中,可通过循环打印数据。

  3. 执行查询语句使用 .executeQuery,增删改使用 .executeUpdate

  4. 代码

    java
    public void getData() {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        String sql = "select * from student where id=081101";
        try {
            con = DB.getConnection();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            while (rs.next()) {
                int uid = rs.getInt("id");
                String uname = rs.getString("name");
                String usex = rs.getString("sex");
                System.out.printf("id: %d, name: %s, sex: %s",uid,uname,usex);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DB.close(con,st,rs);
        }
    }

添加数据

  1. MySQL 添加语句关键字 insert into table() values,详细请看 MySQL 笔记

  2. student 表结构

  3. 代码

    java
    public void addData() {
        Connection con = null;
        Statement st = null;
        String sql = "insert into student(id,name,sex) values ('000111','SevenOne','男')";
        try {
            con = DB.getConnection();
            st = con.createStatement();
            st.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DB.close(con,st,null);
        }
    }

修改数据

  1. MySQL 修改语句关键字 updata table set …… where ……,详细请看 MySQL 笔记

  2. 代码

    java
    public void editData() {
        Connection con = null;
        Statement st = null;
        String sql = "update student set name = 'AAA',sex = '女' where id = '000111'";
        try {
            con = DB.getConnection();
            st = con.createStatement();
            st.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DB.close(con,st,null);
        }
    }

删除数据

  1. MySQL 修改语句关键字 delete from table where ……,详细请看 MySQL 笔记

  2. 代码

    java
    public void delData() {
        Connection con = null;
        Statement st = null;
        String sql = "delete from student where id = '000111';";
        try {
            con = DB.getConnection();
            st = con.createStatement();
            st.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DB.close(con,st,null);
        }
    }

面向对象操作数据库

准备工作

  1. 准备一个数据库 javaDB,创建一张 user 表

    SQL
    create database javaDB default character set = "utf8";
    use javaDB;
    create table user
    (
        id int(10) auto_increment not null primary key,
        account char(11) not null,
        password char(16) not null,
        nickname char(10) not null,
        age int(3) not null
    );

  2. 创建一个新的项目,并引入数据库 jar 包

  3. 在项目中创建以下几个包:

    • dao 存放数据的增删改查逻辑类和接口。
    • dao.impl 数据表对应类的逻辑,实现了 dao 中的接口。
    • entity 保存实体类。每张表对应一个 java 类。
    • util 工具包,将上面封装的 DB 工具类复制到这个包里,修改数据库配置。
    • main 程序入口包。

创建一个 User 类

  1. 创建 User 表的实体类

    java
    package entity;
    
    public class User {
        private int id;
        private String account;
        private String password;
        private String nickname;
        private int age;
    
        public User(){}
    
        public User(String account, String password, String nickname, int age) {
            this.account = account;
            this.password = password;
            this.nickname = nickname;
            this.age = age;
        }
    
        public User(int id, String account, String password, String nickname, int age) {
            this.id = id;
            this.account = account;
            this.password = password;
            this.nickname = nickname;
            this.age = age;
        }
    
        public int getId() { return id; }
    
        public void setId(int id) { this.id = id; }
    
        public String getAccount() { return account; }
    
        public void setAccount(String account) { this.account = account; }
    
        public String getPassword() { return password; }
    
        public void setPassword(String password) { this.password = password; }
    
        public String getNickname() { return nickname; }
    
        public void setNickname(String nickname) { this.nickname = nickname; }
    
        public int getAge() { return age; }
    
        public void setAge(int age) { this.age = age; }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", account='" + account + '\'' +
                    ", password='" + password + '\'' +
                    ", nickname='" + nickname + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
  2. 创建 User 数据的逻辑接口作为规范

    java
    package dao;
    
    import entity.User;
    
    public interface UserDao {
        public void save(User user);    // 新增数据(保存数据)
        public void delete(int id);     // 删除数据
        public void updata(User user);  // 修改数据
        public User get(int id);        // 查询数据
    }
  3. 创建 UserDI 类实现 UserDao 接口。关于 User 的增删改查逻辑都可以写到这里。

    java
    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    
    public class UserDI implements UserDao {
        @Override
        public void save(User user) {}
    
        @Override
        public void delete(int id) {}
    
        @Override
        public void updata(User user) {}
    
        @Override
        public User get(int id) { return null; }
    }

添加数据

  1. 在此之前一直用的 sql 都是静态的,这里引出一个动态 sql 的概念。

  2. 一个 sql 语句中的变量或者说是动态数据我们用 ? 问号来占位,最后根据占位的数据类型去填充占位符。

  3. UserDI.java

    java
    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    import util.DB;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class UserDI implements UserDao {
        @Override
        public void save(User user) {
            Connection con = null;
            PreparedStatement ps = null;
    
            // 动态 SQL,问号表示占位符
            String sql = "insert into user(account,password,nickname,age) values (?,?,?,?)";
            try {
                con = DB.getConnection();
                ps = con.prepareStatement(sql);
    
                // 取代占位符,占位符下标从 1 开始
                ps.setString(1,user.getAccount());
                ps.setString(2,user.getPassword());
                ps.setString(3,user.getNickname());
                ps.setInt(4,user.getAge());
    
                // 执行 SQL 语句
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DB.close(con,ps,null);
            }
        }
    
        @Override
        public void delete(int id) {}
    
        @Override
        public void updata(User user) {}
    
        @Override
        public User get(int id) { return null; }
    }
  4. main.java

    java
    package main;
    
    import dao.impl.UserDI;
    import entity.User;
    
    public class main {
        public static void main(String[] args) {
            UserDI userDI = new UserDI();
            User user = new User("15024820696","123456","SevenOne",22);
            userDI.save(user);
        }
    }

修改数据

  1. UserDI.java

    java
    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    import util.DB;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class UserDI implements UserDao {
        @Override
        public void save(User user) {}
    
        @Override
        public void delete(int id) {}
    
        @Override
        public void updata(User user) {
            Connection con = null;
            PreparedStatement ps = null;
            String sql = "update user set account = ?,password = ?,nickname = ?,age = ? where id = ?";
            try {
                con = DB.getConnection();
                ps = con.prepareStatement(sql);
                ps.setString(1,user.getAccount());
                ps.setString(2,user.getPassword());
                ps.setString(3,user.getNickname());
                ps.setInt(4,user.getAge());
                ps.setInt(5,user.getId());
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DB.close(con,ps,null);
            }
        }
    
        @Override
        public User get(int id) { return null; }
    }
  2. main.java

    java
    package main;
    
    import dao.impl.UserDI;
    import entity.User;
    
    public class main {
        public static void main(String[] args) {
            UserDI userDI = new UserDI();
            User user = new User(1,"13100001234","abcdef","AAA",23);
            userDI.updata(user);
        }
    }

获取数据

  1. UserDI.java

    java
    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    import util.DB;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class UserDI implements UserDao {
        @Override
        public void save(User user) {}
    
        @Override
        public void delete(int id) {}
    
        @Override
        public void updata(User user) {}
    
        @Override
        public User get(int id) {
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            User user = null;
            String sql = "select * from user where id = ?";
            try {
                con = DB.getConnection();
                ps = con.prepareStatement(sql);
                ps.setInt(1,id);
                rs = ps.executeQuery();
    
                while (rs.next()) {
                    user = new User(
                            rs.getInt("id"),
                            rs.getString("account"),
                            rs.getString("password"),
                            rs.getString("nickname"),
                            rs.getInt("age")
                    );
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DB.close(con,ps,rs);
            }
            return user;
        }
    }
  2. main.java

    java
    package main;
    
    import dao.impl.UserDI;
    import entity.User;
    
    public class main {
        public static void main(String[] args) {
            UserDI userDI = new UserDI();
            User user = userDI.get(1);
            if (user == null) {
                System.out.println("用户不存在");
            } else {
                System.out.println(user.toString());
            }
        }
    }

删除数据

  1. UserDI.java

    java
    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    import util.DB;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class UserDI implements UserDao {
        @Override
        public void save(User user) {}
    
        @Override
        public void delete(int id) {
            Connection con = null;
            PreparedStatement ps = null;
            String sql = "delete from user where id=?";
            try {
                con = DB.getConnection();
                ps = con.prepareStatement(sql);
                ps.setInt(1,id);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DB.close(con,ps,null);
            }
        }
    
        @Override
        public void updata(User user) {}
    
        @Override
        public User get(int id) { return null; }
    }
  2. main.java

    java
    package main;
    
    import dao.impl.UserDI;
    
    public class main {
        public static void main(String[] args) {
            UserDI userDI = new UserDI();
            userDI.delete(1);
        }
    }

获取所有数据

  1. 重定义接口

    java
    package dao;
    
    import entity.User;
    
    import java.util.List;
    
    public interface UserDao {
        public void save(User user);    // 新增数据(保存数据)
        public void delete(int id);     // 删除数据
        public void updata(User user);  // 修改数据
        public User get(int id);        // 查询数据
        public List<User> getUsers();   // 查询所有数据
    }
  2. 在 user 表中插入数据

    SQL
    insert into user(account,password,nickname,age) values
    ('13100001111','123456','AAA',22),
    ('13100002222','123456','BBB',26),
    ('13100003333','123456','CCC',29);
  3. UserDI.java

    java
    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    import util.DB;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class UserDI implements UserDao {
        @Override
        public void save(User user) {}
    
        @Override
        public void delete(int id) {}
    
        @Override
        public void updata(User user) {}
    
        @Override
        public User get(int id) { return null; }
    
        @Override
        public List<User> getUsers() {
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            List<User> users = new ArrayList<>();
            String sql = "select * from user";
            try {
                con = DB.getConnection();
                ps = con.prepareStatement(sql);
                rs = ps.executeQuery();
    
                while (rs.next()) {
                    users.add(new User(
                        rs.getInt("id"),
                        rs.getString("account"),
                        rs.getString("password"),
                        rs.getString("nickname"),
                        rs.getInt("age")
                    ));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DB.close(con,ps,rs);
            }
            return users;
        }
    }
  4. main.java

    java
    package main;
    
    import dao.impl.UserDI;
    import entity.User;
    
    import java.util.List;
    
    public class main {
        public static void main(String[] args) {
            UserDI userDI = new UserDI();
            List<User> users = userDI.getUsers();
            if (users.size() == 0) {
                System.out.println("暂无数据");
            } else {
                for (User user:users) {
                    System.out.println(user.toString());
                }
            }
        }
    }

数据库配置文件

说明

  1. 在此之前,我们的数据库配置都是写在 DB.java 文件中的,编译之后会生成一个 .class 文件,如果后期我们升级数据库需要改配置,这种写法相对麻烦。
  2. 解决这个问题可以在 src 目录下创建一个数据库的配置文件,便于后期维护。

创建配置文件

  1. 在 src 文件夹中直接创建一个 .properties 文件,命名随意。

  2. .properties 文件是一个特殊的 Map 集合,文件内包含多组赋值语句。

  3. 复制语句中等号前面的是集合的 Key,等号后面的是集合的 Value

  4. 等号左右不能有空格。

  5. 注释以 # 开头。

  6. 文件代码

    properties
    # mysql 5.*
    # driver=com.mysql.jdbc.Driver
    # url=jdbc:mysql://localhost:3306/xscj
    
    # mysql 8.*
    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/javaDB?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username=root
    password=

应用配置文件

  1. 数据库的配置文件自然是在数据库工具类中使用,也就是 uril/DB.java 中。

  2. 修改 uril/DB.java 文件

    java
    package util;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class DB {
        private static String driver,url,username,password;
    
        static {
            try {
                Properties prop = new Properties(); // 创建 Properties 对象
                // InputStream is = new FileInputStream("src/db.properties");  // 创建输入流加载配置文件,在 Web 项目中无法直接读取 src 目录下的文件。
                InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");   // 推荐做法
                prop.load(is);  // 读取配置文件
    
                // 开始读取配置文件中的数据
                driver = prop.getProperty("driver");
                url = prop.getProperty("url");
                username = prop.getProperty("username");
                password = prop.getProperty("password");
    
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        // 获取数据库连接
        public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url,username,password);
        }
    
        // 关闭数据库资源
        public static void close(Connection con, Statement st, ResultSet rs) {
            try {
                if (rs != null) rs.close();
                if (st != null) st.close();
                if (con != null) con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

数据库连接池

操作步骤

  1. 将下面文件复制到项目的 lib 目录中。

  2. 将这两个 jar 包导入到项目中

  3. 在 src 目录中创建 c3p0-config.xml 文件。

基于 MIT 许可发布