搜索文档
数据库 jar 包
下载
搜索数据库

搜索后我们选择 -java 版

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

点击 jar 即可下载

导入
在项目根目录中创建 lib 资源包文件夹。
将上面下载的 jar 包放到 lib 文件夹里。
在 jar 包上右键,选择 Add as Library

访问数据库流程
加载 JDBC 驱动程序。
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();
}
}
}连接数据库
三要素:url、username、password
代码
// 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();
}查询数据
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 工具类
在项目根目录中创建一个存放工具类的包,一般命名为 util
在 util 中创建 DB 类
代码
javapackage 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(); } } }
查询数据
MySQL 查询语句关键字 select,详细请看 MySQL 笔记
查询数据的结果集存到 ResultSet 类型的变量中,可通过循环打印数据。
执行查询语句使用 .executeQuery,增删改使用 .executeUpdate
代码
javapublic 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); } }
添加数据
MySQL 添加语句关键字 insert into table() values,详细请看 MySQL 笔记
student 表结构

代码
javapublic 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); } }
修改数据
MySQL 修改语句关键字 updata table set …… where ……,详细请看 MySQL 笔记
代码
javapublic 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); } }
删除数据
MySQL 修改语句关键字 delete from table where ……,详细请看 MySQL 笔记
代码
javapublic 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); } }
面向对象操作数据库
准备工作
准备一个数据库 javaDB,创建一张 user 表
SQLcreate 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 );
创建一个新的项目,并引入数据库 jar 包
在项目中创建以下几个包:
- dao 存放数据的增删改查逻辑类和接口。
- dao.impl 数据表对应类的逻辑,实现了 dao 中的接口。
- entity 保存实体类。每张表对应一个 java 类。
- util 工具包,将上面封装的 DB 工具类复制到这个包里,修改数据库配置。
- main 程序入口包。
创建一个 User 类
创建 User 表的实体类
javapackage 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 + '}'; } }创建 User 数据的逻辑接口作为规范
javapackage 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); // 查询数据 }创建 UserDI 类实现 UserDao 接口。关于 User 的增删改查逻辑都可以写到这里。
javapackage 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; } }
添加数据
在此之前一直用的 sql 都是静态的,这里引出一个动态 sql 的概念。
一个 sql 语句中的变量或者说是动态数据我们用 ? 问号来占位,最后根据占位的数据类型去填充占位符。
UserDI.java
javapackage 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; } }main.java
javapackage 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); } }
修改数据
UserDI.java
javapackage 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; } }main.java
javapackage 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); } }
获取数据
UserDI.java
javapackage 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; } }main.java
javapackage 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()); } } }

删除数据
UserDI.java
javapackage 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; } }main.java
javapackage main; import dao.impl.UserDI; public class main { public static void main(String[] args) { UserDI userDI = new UserDI(); userDI.delete(1); } }
获取所有数据
重定义接口
javapackage 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(); // 查询所有数据 }在 user 表中插入数据
SQLinsert into user(account,password,nickname,age) values ('13100001111','123456','AAA',22), ('13100002222','123456','BBB',26), ('13100003333','123456','CCC',29);UserDI.java
javapackage 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; } }main.java
javapackage 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()); } } } }
数据库配置文件
说明
- 在此之前,我们的数据库配置都是写在 DB.java 文件中的,编译之后会生成一个 .class 文件,如果后期我们升级数据库需要改配置,这种写法相对麻烦。
- 解决这个问题可以在 src 目录下创建一个数据库的配置文件,便于后期维护。
创建配置文件
在 src 文件夹中直接创建一个 .properties 文件,命名随意。

.properties 文件是一个特殊的 Map 集合,文件内包含多组赋值语句。
复制语句中等号前面的是集合的 Key,等号后面的是集合的 Value
等号左右不能有空格。
注释以 # 开头。
文件代码
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=
应用配置文件
数据库的配置文件自然是在数据库工具类中使用,也就是 uril/DB.java 中。
修改 uril/DB.java 文件
javapackage 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(); } } }
数据库连接池
操作步骤
将下面文件复制到项目的 lib 目录中。

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

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