1. 概述
在Web应用程序中,后端使用数据库来存储和管理数据非常常见。当表单数据来自用户提交时,我们需要将数据保存到数据库中以便于查询和使用。这种将数据保存在数据库中的方式称为持久化,在Java中实现表单数据的持久化需要使用一些持久化技术,比如JDBC和ORM框架。本文主要介绍如何使用JDBC和Hibernate来实现Java中表单数据的持久化。
2. JDBC实现表单数据的持久化(基础版)
2.1 准备工作
在使用JDBC之前,我们需要在项目中引入JDBC驱动器。这里我们以MySQL为例,先去MySQL官网下载合适的驱动器。
public class JDBCTest {
private static final String URL = "jdbc:mysql://localhost:3306/test";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private static Connection conn;
static {
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 建立连接
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 关闭连接资源
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
其中URL格式为:jdbc:mysql://主机地址:端口号/数据库名,USERNAME和PASSWORD为连接数据库的用户名和密码。
2.2 插入数据
下面我们演示如何使用JDBC实现表单数据的持久化。这里以向用户表中插入数据为例子。首先,我们需要创建一个包含用户信息的JavaBean:
public class User {
private int id;
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
// getter和setter省略
}
然后,我们创建一个UserDao类,该类包含向用户表中插入数据的方法:
public class UserDao {
private Connection conn;
public UserDao(Connection conn) {
this.conn = conn;
}
public void addUser(User user) {
String sql = "insert into user(name, email) values(?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getEmail());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在这个方法中,我们使用PreparedStatement来向用户表中插入数据。这里使用了try-with-resources语句,可以避免手动关闭资源。
最后,在主函数中执行插入数据的代码:
public static void main(String[] args) {
User user = new User("小明", "xiaoming@test.com");
UserDao userDao = new UserDao(conn);
userDao.addUser(user);
}
以上代码完成了向用户表中插入数据的操作。当我们查看数据库中的user表时,会发现该表中多了一条记录。
2.3 查询数据
除了插入数据,我们也需要能够查询数据库中的数据。下面我们演示如何使用JDBC来查询用户表中的数据。首先,我们在UserDao中添加查询用户表中所有数据的方法:
public List<User> getAllUser() {
String sql = "select id, name, email from user";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
List<User> userList = new ArrayList<>();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
User user = new User(name, email);
user.setId(id);
userList.add(user);
}
return userList;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
在该方法中,我们使用PreparedStatement查询用户表中的所有数据,并且将查询结果映射到User实体类中的属性。最后,该方法返回一个包含所有User对象的List集合。
然后,在主函数中调用查询数据的代码:
public static void main(String[] args) {
UserDao userDao = new UserDao(conn);
List<User> userList = userDao.getAllUser();
for (User user : userList) {
System.out.println(user.getName() + " " + user.getEmail());
}
}
以上代码完成了查询用户表中所有数据的操作。当我们运行该程序时,会输出所有用户的名称和邮箱。
3. Hibernate实现表单数据的持久化(进阶版)
3.1 准备工作
在使用Hibernate之前,我们需要在项目中引入Hibernate依赖。这里我们使用Maven来管理依赖,并且以MySQL为例:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.30.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
创建一个Hibernate的配置文件hibernate.cfg.xml:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<mapping class="User"/>
</session-factory>
</hibernate-configuration>
其中,hibernate.connection.url,hibernate.connection.username和hibernate.connection.password为连接MySQL数据库所需的URL、用户名和密码。hibernate.dialect为MySQL数据库的方言,hbm2ddl.auto为自动生成数据库表结构,show_sql为输出执行的SQL语句,mapping class为映射实体类。
3.2 插入数据
使用Hibernate时,我们需要定义持久化实体类,并使用Hibernate的API操作实体类。首先,我们创建一个实体类User,它与JDBC中的User实体类相同:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
// getter和setter省略
}
然后,我们创建一个UserDao类,该类包含向用户表中插入数据的方法:
public class UserDao {
private SessionFactory sessionFactory;
private Session session;
public UserDao(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void addUser(User user) {
session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}
}
在该方法中,我们使用Session对象的save方法保存用户信息,session.beginTransaction()开启事务,session.getTransaction().commit()提交事务。
最后,在主函数中执行插入数据的代码:
public static void main(String[] args) {
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
UserDao userDao = new UserDao(sessionFactory);
User user = new User("小红", "xiaohong@test.com");
userDao.addUser(user);
}
以上代码完成了向用户表中插入数据的操作。当我们查看数据库中的user表时,会发现该表中多了一条记录。
3.3 查询数据
除了插入数据,我们也需要能够查询数据库中的数据。下面我们演示如何使用Hibernate来查询用户表中的数据。首先,我们在UserDao中添加查询用户表中所有数据的方法:
public List<User> getAllUser() {
session = sessionFactory.getCurrentSession();
session.beginTransaction();
List<User> userList = session.createQuery("from User").getResultList();
session.getTransaction().commit();
return userList;
}
在该方法中,我们使用Session对象的createQuery方法查询用户表中的所有数据,然后返回一个包含所有User对象的List集合。
然后,在主函数中调用查询数据的代码:
public static void main(String[] args) {
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
UserDao userDao = new UserDao(sessionFactory);
List<User> userList = userDao.getAllUser();
for (User user : userList) {
System.out.println(user.getName() + " " + user.getEmail());
}
}
以上代码完成了查询用户表中所有数据的操作。当我们运行该程序时,会输出所有用户的名称和邮箱。
4. 结论
本文主要介绍了如何使用JDBC和Hibernate来实现Java中表单数据的持久化。JDBC是一种基础的持久化技术,使用较为灵活。而Hibernate是一种ORM框架,使用更加方便,可以帮助我们实现更多的持久化操作。不同情况下选择不同的技术,既要考虑开发效率,又要考虑性能等因素。