java数据库与JDBC
java数据库与JDBC
java与MYSQL
1.下载驱动
https://dev.mysql.com/downloads/connector/j/
https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.1.0.zip
2.导入mysql-connector-j.*.jar包
3.然后在src目录下新建一个java类
4.写入数据库连接测试代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Conn {
public static void main(String[] args) {
Connection con;
//jdbc驱动
String driver="com.mysql.cj.jdbc.Driver";
//数据库地址为localhost:3306,数据库名为security (sqli-labs的数据库)
String url="jdbc:mysql://localhost:3306/security?useSSL=false&serverTimezone=UTC";
String user="root";
String password="root";
try {
//注册JDBC驱动程序
Class.forName(driver);
//建立连接
con = DriverManager.getConnection(url, user, password);
if (!con.isClosed()) {
System.out.println("数据库连接成功");
}
con.close();
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动没有安装");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
5.然后利用JDBC进行查询
import java.sql.*;
public class Conn{
public static void main(String[] args){
Connection con;
//jdbc驱动
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/security?useSSL=false&serverTimezone=UTC";
String user="root";
String password="root";
try {
Class.forName(driver);
con = DriverManager.getConnection(url,user,password);
if(!con.isClosed()){
System.out.println("数据库连接成功");
Statement state = con.createStatement();
String query = "SELECT * FROM users";
ResultSet res = state.executeQuery(query);
while(res.next()){
int id = res.getInt("id");
String name = res.getString("username");
String pass = res.getString("password");
System.out.println("ID: "+id+", Username: "+name+", Password: "+pass);
}
res.close();
state.close();
con.close();
}
con.close();
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动没有安装");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
JDBC_事务特性ACID,隔离级别
JDBC(Java Database Connectivity)是Java程序与数据库进行交互的标准接口。在JDBC中,事务是一组数据库操作,作为一个单元要么全部成功,要么全部失败。JDBC遵循ACID原则和隔离级别来确保事务的可靠性和一致性。
ACID是指:
原子性(Atomicity):事务是一个原子操作单元,要么全部执行成功,要么全部执行失败。事务中的所有操作要么全部提交,要么全部回滚。
一致性(Consistency):事务在执行前后,数据库的状态必须保持一致。如果事务执行成功,数据库从一个一致的状态转换到另一个一致的状态。如果事务执行失败,数据库应该回滚到之前的一致状态。
隔离性(Isolation):事务之间应该是相互隔离的,即一个事务的操作不应该影响其他事务的操作。每个事务应该感觉自己是在独立运行的,即使有其他事务在同时执行。
持久性(Durability):一旦事务提交成功,其结果应该永久保存在数据库中,即使系统发生故障或重启。
隔离级别是指在多个事务并发执行时,数据库系统如何处理事务之间的相互影响。JDBC定义了四个隔离级别:
读未提交(Read Uncommitted):最低的隔离级别,事务可以读取其他事务未提交的数据。这种隔离级别可能导致脏读(Dirty Read)问题,即读取到了未提交的数据。
读已提交(Read Committed):事务只能读取其他事务已经提交的数据。这种隔离级别可以避免脏读问题,但可能导致不可重复读(Non-repeatable Read)问题,即在同一个事务中,多次读取同一数据可能得到不同的结果。
可重复读(Repeatable Read):事务在执行期间多次读取同一数据时,保证能够读取到一致的数据。这种隔离级别可以避免脏读和不可重复读问题,但可能导致幻读(Phantom Read)问题,即在同一个事务中,多次查询同一范围的数据,结果集合的行数可能不同。
串行化(Serializable):最高的隔离级别,事务依次执行,相当于将并发执行的事务串行化。这种隔离级别可以避免脏读、不可重复读和幻读问题,但会降低并发性能。
在JDBC中,可以使用Connection对象的setTransactionIsolation()方法设置事务的隔离级别,例如:
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
需要注意的是,隔离级别越高,事务的并发性能越低,因为需要加锁和保证事务的一致性。因此,在选择隔离级别时,需要权衡并发性能和数据一致性的需求。
JDBC封装资源文件以及如何存出一到多条记录
JDBC是Java Database Connectivity的缩写,是Java语言访问数据库的标准接口。JDBC封装资源文件可以通过使用Properties类来实现。
1.创建一个名为"db.properties"的资源文件,其中包含数据库连接所需的配置信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/security
username=root
password=root
2.创建一个DBconfig.java文件 可以在Java代码中使用Properties类来加载并读取这个资源文件
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class DBConfig {
private static Properties properties;
static {
properties = new Properties();
try {
properties.load(new FileInputStream("F:/db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getProperty(String key) {
return properties.getProperty(key);
}
}
3.可以使用JDBC连接数据库并执行SQL语句来存储一到多条记录
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Conn2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
// 加载数据库驱动
Class.forName(DBConfig.getProperty("driver"));
// 建立数据库连接
conn = DriverManager.getConnection(DBConfig.getProperty("url"),
DBConfig.getProperty("username"), DBConfig.getProperty("password"));
// 执行SQL语句
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1, "value1");
stmt.setString(2, "value2");
stmt.executeUpdate();
// 存储多条记录
sql = "INSERT INTO users (username, password) VALUES (?, ?), (?, ?), (?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1, "value1");
stmt.setString(2, "value2");
stmt.setString(3, "value3");
stmt.setString(4, "value4");
stmt.setString(5, "value5");
stmt.setString(6, "value6");
stmt.executeUpdate();
System.out.println("成功插入数据");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
然后idea运行Conn2
成功插入数据
总结起来,JDBC封装资源文件可以通过使用Properties类来实现,而存储一到多条记录可以使用PreparedStatement对象执行SQL语句,并通过setString等方法设置参数。
数据库与JDBC手写对象和SQL自动映射框架
手写对象和SQL自动映射框架可以简化数据库操作的代码,提高开发效率和代码可维护性。下面是一个简单的手写对象和SQL自动映射框架的示例:
1.定义一个User类表示数据库中的用户表
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
2.创建一个UserDao类来完成数据库操作:
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 UserDao {
private Connection conn;
public UserDao(Connection conn) {
this.conn = conn;
}
public User findById(int id) throws SQLException {
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
return null;
}
public List<User> findAll() throws SQLException {
String sql = "SELECT * FROM users";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
List<User> userList = new ArrayList<>();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
userList.add(user);
}
return userList;
}
public void save(User user) throws SQLException {
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, user.getUsername());
stmt.setString(2, user.getPassword());
stmt.executeUpdate();
}
public void update(User user) throws SQLException {
String sql = "UPDATE users SET username = ?, password = ? WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, user.getUsername());
stmt.setString(2, user.getPassword());
stmt.setInt(3, user.getId());
stmt.executeUpdate();
}
public void delete(int id) throws SQLException {
String sql = "DELETE FROM users WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, id);
stmt.executeUpdate();
}
}
在上述代码中,UserDao类封装了数据库的增删改查操作。通过传入Connection对象来进行数据库连接,并使用PreparedStatement对象执行SQL语句。在查询操作中,通过ResultSet对象获取查询结果,并将结果映射到User对象中。
3.使用示例代码来演示如何使用UserDao类进行数据库操作:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
public class Conn3 {
public static void main(String[] args) {
try {
// 建立数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/security","root","root");
// 创建UserDao对象
UserDao userDao = new UserDao(conn);
// 查询用户
User user = userDao.findById(1);
System.out.println(user);
// 查询所有用户
List<User> userList = userDao.findAll();
System.out.println(userList);
// 新增用户
User newUser = new User();
newUser.setUsername("test");
newUser.setPassword("123456");
userDao.save(newUser);
// 更新用户
user.setUsername("newUsername");
userDao.update(user);
// 删除用户
userDao.delete(user.getId());
// 关闭数据库连接
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在上述代码中,首先通过DriverManager.getConnection建立数据库连接,然后创建UserDao对象。接下来,可以使用UserDao对象进行数据库操作,例如查询用户、查询所有用户、新增用户、更新用户和删除用户。
总结起来,手写对象和SQL自动映射框架可以通过定义对象类和封装数据库操作的DAO类来实现。通过传入Connection对象来进行数据库连接,并使用PreparedStatement对象执行SQL语句。在查询操作中,通过ResultSet对象获取查询结果,并将结果映射到对象中。