va Servlet 可以通过 JDBC 来操作数据库,实现多表查询。下面提供一个例子,通过用户表(User)和用户信息表(UserInfo)进行多表查询,返回符合条件的用户信息。
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDAO {
private Connection connection;
private String driverClass = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/test";
private String username = "root";
private String password = "password";
public UserDAO() throws Exception {
Class.forName(driverClass);
connection = DriverManager.getConnection(url, username, password);
}
public List<UserInfo> getUserInfo(String name, int age) throws Exception {
List<UserInfo> userInfos = new ArrayList<UserInfo>();
String sql = "SELECT * FROM User u JOIN UserInfo ui ON u.id = ui.user_id WHERE u.name=? AND u.age=?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2, age);
ResultSet rs = statement.executeQuery();
while (rs.next()) {
UserInfo userInfo = new UserInfo();
userInfo.setId(rs.getInt("id"));
userInfo.setUserId(rs.getInt("user_id"));
userInfo.setEmail(rs.getString("email"));
userInfo.setPhone(rs.getString("phone"));
userInfos.add(userInfo);
}
rs.close();
statement.close();
return userInfos;
}
public void close() throws Exception {
connection.close();
}
}
上面的例子中,UserDAO 类通过 JDBC 来连接 MySQL 数据库。getUserInfo 方法可以接收用户名和年龄两个参数,查询符合条件的用户信息,返回一个用户信息列表。
需要注意的是,在 getUserInfo 方法中,通过 u JOIN UserInfo ui ON u.id = ui.user_id 的方式进行了多表查询。这个 SQL 语句的含义是,在 User 表和 UserInfo 表中,如果两个表中的 user_id 和 id 字段相同,就把两个表中的数据拼接在一起返回。
如果需要对数据库进行插入操作,可以使用类似的方法进行操作,同时开启事务,如下所示:
public void addUserInfo(UserInfo userInfo) throws Exception {
connection.setAutoCommit(false);
String sql = "INSERT INTO UserInfo (user_id, email, phone) VALUES (?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, userInfo.getUserId());
statement.setString(2, userInfo.getEmail());
statement.setString(3, userInfo.getPhone());
statement.executeUpdate();
connection.commit();
statement.close();
}
上面的例子中,addUserInfo 方法会将一个用户信息对象插入到 UserInfo 表中。在这个过程中,需要开启事务,将多个 SQL 操作封装在一个事务中,保证数据的一致性。在本例中,通过 connection.setAutoCommit(false) 方法将自动提交关闭,然后通过 connection.commit() 方法手动提交事务,确保数据插入操作执行成功后才进行提交。
评论 (0)