文章目录
1. 在MySQL中创建一个用户表
2. 在IDEA中创建此项目
打开idea–>File–>New->Moudle–>JavaEnterprise–>勾选Web Application–>项目命名为logindemo
3. 对项目进行分层
在src目录下创建如下包,用于分层。
domain:实体类;servlet:控制层;dao:接口层;service:服务层;util:工具层;test:测试层
同时在WEB-INF目录下创建一个lib目录,先复制mysql-connector-java-5.1.6.jar包,并添加为Module jar包,用于连接数据库。
4. 测试数据库是否连接成功
- 在domain 实体层下创建实体类 Users
注意:实体类的名字尽量与数据库中的表名一致,此项目中都名为Users
package com.zz.domain;
import java.io.Serializable;
//实体层:用户表
//Serializable接口是启用其序列化功能的接口
public class Users implements Serializable {
private int id;
private String name;
private String gender;
private String password;
private String email;
private String birthday;
public Users() {
}
public Users(int id, String name, String gender, String password, String email, String birthday) {
this.id = id;
this.name = name;
this.gender = gender;
this.password = password;
this.email = email;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Users{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
- 在Util 工具层 下引入一个JDBC工具类,名为DBUtils, DBUtils中封装了对JDBC的操作
package com.zz.util;
import java.io.InputStream;
import java.sql.*;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
//DBUtils封装了对JDBC的操作
public class DBUtils {
//访问数据库的小帮手
public static PreparedStatement pstm;
// 数据库连接池封装对象
public static DataSource dataSource;
// 操作属性文件对象
public static Properties properties = new Properties();
//完成类中静态属性初始化,并且多次访问时,只有一次访问才会执行此静态块,而且只执行一次
static {
//让is输入流对象只想src目录下的jdbc.properties
InputStream is = DBUtils.class.getClassLoader().getResourceAsStream(
"jdbc.properties");
try {
//加载属性文件到properties对象中
properties.load(is);
//数据库连接加载配置文件,完成访问数据库的所有配置
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//保证线程安全的数据库访问,一个线程只绑定一个链接对象,多次访问时同一个连接对象
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//打开数据库连接
public static Connection getConnection() {
Connection conn = tl.get();// 从当前线程上获得链接
try {
if (conn == null || conn.isClosed() ) {
//从连接池中获取连接对象
conn = dataSource.getConnection();
// 把连接绑定到当前线程上
tl.set(conn);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//关闭所有数据库访问对象
public static void closeAll(Connection con, PreparedStatement pstm,
ResultSet rs) {
try {
if (rs != null)
rs.close();
if (pstm != null)
pstm.close();
if (con != null && !con.isClosed())
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭所有数据库访问对象
public static void closeAll() {
try {
if (pstm != null)
pstm.close();
if (DBUtils.getConnection() != null && !DBUtils.getConnection().isClosed())
DBUtils.getConnection().close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 所有的增删改的方法
public static int myExecuteUpdate(String sql, List list) throws Exception {
//添加第二个参数的意义是为了获得新增记录的主键。
pstm = getConnection().prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
if (list != null) {