目录
1、开发需求
2、环境配置
2.1、配置jar包
2.2、配置jdbc.properties文件
2.3、创建MVC三层包
2.4、存放JDBCUtil类
2.5、mysql创建
3、代码开发
3.1、web层开发
3.2、service层开发
3.3、dao层开发
3.4、登录功能测试
3.5、注册功能测试
1、完成登录功能。
2、完成注册功能。
3、完成注册的同时不能注册相同的用户名。
首先我们需要创建一个web项目工程,然后在web包下的WEB-INF下创建一个lib包,里面放入mysql连接jar包,这里提供了mysql5版本和mysql8版本的jar包,对应的就是mysql的版本,如果是mysql5系列版本的就用5.16的jar包,如果是mysql8系列的版本就用8.0.16版本jar包。
链接:https://pan.baidu.com/s/1loxaN41BXlfdePT_8DDBDw
提取码:388i
如下图配置
注意:放入后一定要记得导入,右击jar包点击ADD Library进行导入。
新建jdbc.properties文件到src目录中,添加以下内容
jdbc.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test5
jdbc.username=root
jdbc.password=xxx
因为开发需要使用MVC三层架构,需要创建相对应的包,如图所示
三层为dao层、service层、web层,bean层用来存放实体类即JavaBean,util是工具类存放的包。
把下面代码放到util包的JDBCUtil类中
public class JDBCUtil {
public JDBCUtil() {
}
private static String className;
private static String url;
private static String username;
private static String password;
private static Connection conn = null;
static {
Properties pro = null;
InputStream is = null;
try {
is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
pro = new Properties();
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
className = pro.getProperty("jdbc.className");
url = pro.getProperty("jdbc.url");
username = pro.getProperty("jdbc.username");
password = pro.getProperty("jdbc.password");
//加载驱动
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取连接
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return conn;
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null) {
rs.close();
rs = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stmt, Connection conn) {
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
创建表t_user
CREATE TABLE `t_user` (
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据请自行添加
为了模拟前端发送数据,我这里用scanner对进行获取数据,实际开发中web层是用servlet技术来获取前端数据的。
public class UserWeb {
public static void main(String[] args) {
//创建service对象
UserService userService=new UserServiceImpl();
System.out.println("请选择选项");
System.out.println("1-----登录");
System.out.println("2-----注册");
Scanner sc =new Scanner(System.in);
int i = sc.nextInt();
switch (i){
case 1:
System.out.println("请输入账号");
Scanner sc1=new Scanner(System.in);
String username = sc1.nextLine();
System.out.println("请输入密码");
Scanner sc2=new Scanner(System.in);
String password = sc2.nextLine();
//创建user对象 把用户输入的账号密码封装对象
User user=new User();
user.setUsername(username);
user.setPassword(password);
boolean flag1 = userService.login(user);
if(flag1==true){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
break;
case 2:
System.out.println("请输入注册账号");
Scanner register1=new Scanner(System.in);
String s1 = register1.nextLine();
System.out.println("请输入注册密码");
Scanner register2=new Scanner(System.in);
String s2 = register2.nextLine();
User user1=new User();
user1.setUsername(s1);
user1.setPassword(s2);
boolean register = userService.register(user1);
if(register){
System.out.println("注册成功");
}else{
System.out.println("注册失败,用户已存在");
}
break;
default:
System.out.println("你输入的有误");
}
}
}
service层和dao层一样,也是一个接口和一个实现类
UserService接口
public interface UserService {
//登录功能
public boolean login(User user);
//注册功能
public boolean register(User user);
}
UserServiceImpl实现类
public class UserServiceImpl implements UserService {
//登录功能
@Override
public boolean login(User user) {
//创建userDao对象
UserDao userDao=new UserDaoImpl();
//调用login方法把参数user传递过去,得到一个返回值为user_data
User user_data = userDao.login(user);
//判断user_data是否为空
if(user_data!=null){
//不为空 证明查询出了用户 登录成功
return true;
}
//否则登录失败
return false;
}
//注册功能
@Override
public boolean register(User user) {
UserDao userDao=new UserDaoImpl();
//调用userDao中的queryByName方法里面传递一个用户名 得到返回值user1
User user1 = userDao.queryByName(user.getUsername());
//判断user1是否为空
if(user1!=null){
//不为空 证明用户存在 不能注册
return false;
}else{
//为空 则可以注册 调用注册方法
Boolean register = userDao.register(user);
//判断返回值是否注册成功
if(register){
//成功则返回true
return true;
}else{
//否则返回false
return false;
}
}
}
}
创建UserDao接口
public interface UserDao {
//登录方法
public User login(User user);
//注册方法
public Boolean register(User user);
//查询用户方法
public User queryByName(String username);
}
在dao层创建一个impl包,用来存放接口的实现类
实现类代码
public class UserDaoImpl implements UserDao {
//登录功能
@Override
public User login(User user) {
//调用工具类获取连接对象
Connection conn = JDBCUtil.getConnection();
//初始化对象
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// Statement stmt = conn.createStatement();
// String sql="select * from t_user where username='"+user.getUsername()+"' and password='"+user.getPassword()+"'";
// ResultSet rs = stmt.executeQuery(sql);
//解决sql注入问题
String sql = "select * from t_user where username= ? and password = ?";
//把sql语句传递给pstmt对象
pstmt = conn.prepareStatement(sql);
//给占位符赋值
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
//调用查询方法
rs = pstmt.executeQuery();
//对结果进行遍历
while (rs.next()) {
String username = rs.getString("username");
String password = rs.getString("password");
User user1 = new User();
user1.setUsername(username);
user1.setPassword(password);
//返回结果
return user1;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(rs, pstmt, conn);
}
return null;
}
//注册功能
@Override
public Boolean register(User user) {
Connection conn = JDBCUtil.getConnection();
// Statement stmt = null;
PreparedStatement pstmt= null;
// stmt = conn.createStatement();
// String sql = "select * from t_user where username='" + user.getUsername() + "'";
// rs = stmt.executeQuery(sql);
try {
// String sql = "insert into t_user value('" + user.getUsername() + "','" + user.getPassword() + "')";
String sql2 = "insert into t_user value(?,?)";
pstmt = conn.prepareStatement(sql2);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
int i;
i = pstmt.executeUpdate();
if (i == 1) {
return true;
} else {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(pstmt, conn);
}
//以上try里面出现错误直接返回false
return false;
}
@Override
public User queryByName(String username) {
Connection conn = JDBCUtil.getConnection();
ResultSet rs;
PreparedStatement pstmt;
String sql1 = "select * from t_user where username=?";
try {
pstmt = conn.prepareStatement(sql1);
pstmt.setString(1, username);
rs = pstmt.executeQuery();
while(rs.next()){
String username1 = rs.getString("username");
String password = rs.getString("password");
User user=new User();
user.setUsername(username1);
user.setPassword(password);
return user;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
运行UserWeb