Java后端开发——JDBC入门实验

JDBC(Java Database Connectivity)是Java编程语言中用于与数据库建立连接并进行数据库操作的API(应用程序编程接口)。JDBC允许开发人员连接到数据库,执行各种操作(如插入、更新、删除和查询数据),并检索结果。

JDBC提供了一个标准的方法,使Java应用程序能够与各种类型的数据库进行交互,使其在某种程度上与数据库无关。它是Java中用于数据库连接的基本技术,使开发人员能够构建与数据库交互的强大应用程序。

下面我们通过具体的实验来学习它,主要下面几个部分
内容:
一、JDBC快速入门实验
1.创建数据库db_myweb和account表,三个字段:id、name、money
2.创建eclipse项目导入MySQL驱动包
3.编写数据库操作7个步骤代码实现数据更新
4.查看结果
二、利用Junit实现JDBC的增晒改查实验
1.给项目添加JUnit单元测试,创建JDBCTest测试用例类
2.添加5个测试方法分别为:
public void testInsert(){}
public void testUpdate(){}
public void testDelete(){}
public void testFindAll(){}
public void testFind(){}
3.对5个方法测试,并查看测试结果
三、完成SQL注入实验,并对比结果
四、完成转账事务控制实验,并对比结果
五、自定义封装JDBC连接工具类
1.第一代JDBCUtils类封装与测试,查看结果
2.第二代JDBCUtils类封装与测试,查看结果
六、封装增删改查DAO
1.创建tb_user表,字段有:id username password email birthday
2.创建JavaBean:User.java
3.创建工具类JDBCUtils.java
4.创建数据库访问层DAO类封装增删改查代码:UserDao.java
5.利用JUnit对DAO的方法进行单元测试,并查看结果
七、完成网站登录程序实验
1.创建登录页面login.jsp
2.UserDao增加方法按用户名和密码查询方法
3.创建登录功能的LoginServlet.java
4.运行项目,查看效果

OK,话不多说,直接开始!

1.创建数据库db_myweb和account表,三个字段:id、name、money
创建db_myweb数据库:

 create database db_myweb charset=utf8;

使用db_myweb数据库:

use db_myweb;

创建表account表,三个字段:id、name、money:

CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `money` double DEFAULT NULL,
  PRIMARY KEY (`id`)
);

在这里插入图片描述
2.创建eclipse项目导入MySQL驱动包
创建JDBC web动态工程,lib目录下导入mysql-connector-java-5.1.48.jar 驱动包。在这里插入图片描述
Build Path把sql驱动包加到路径里面。
在这里插入图片描述
3.编写数据库操作7个步骤代码实现数据更新

package com.java5678.Demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;



 
public class JDBCDemo {

    public static void main(String[] args) throws Exception {
    	 //1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        /*2. 获取连接*/
        String url = "jdbc:mysql://localhost:3306/db_myweb";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        /*String sql = "insert into  account value('2','li','2')";*/
        String sql = " update account set money = 2000 where id = 1";
        /*4. 获取执行sql的对象 Statement*/
        Statement stmt = conn.createStatement();
        /*5. 执行sql*/
        int count = stmt.executeUpdate(sql);//受影响的行数
        /*6. 处理结果*/
        System.out.println(count);
        /*7. 释放资源*/
        stmt.close();
        conn.close();
    }
}

数据库账号密码都是root
在这里插入图片描述
4.查看结果
db_myweb数据库里面的account表里面id为一的信息成功从300更新2000:
在这里插入图片描述
在这里插入图片描述
利用Junit实现JDBC的增删改查实验
1.给项目添加JUnit单元测试,创建JDBCTest测试用例类
创建工具类JDBCUtils:

package chapter02.jdbc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
public static Connection getConnection() throws SQLException,ClassNotFoundException{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/db_myweb?serverTimezone=UTC";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
return conn;
}
public static void release(Statement stmt, Connection conn) {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stmt, conn);
}
}

在这里插入图片描述
2.添加5个测试方法:

package chapter02.jdbc.example;



import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import com.javaweb.bean.user;

public class UsersDao {
//添加用户的操作
public boolean insert(user user) {
Connection conn = null;
Statement stmt=null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
stmt = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String birthday = sdf.format(user.getBirthday());
String sql = "INSERT INTO tb_user(id,username,password,email,birthday)"+
"VALUES("
+user.getId()
+",'"
+user.getUsername()
+"','"
+user.getPassword()
+"','"
+user.getEmail()
+"','"
+birthday + "')";
System.out.println(sql);
int num = stmt.executeUpdate(sql);
if (num > 0) {
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs,stmt,conn);
}
return false;
}
public ArrayList<user> findAll(){
Connection conn = null;
Statement stmt=null;
ResultSet rs = null;
ArrayList<user> list = new ArrayList<user>();
try {
conn = JDBCUtils.getConnection();
stmt = conn.createStatement();
String sql = "SELECT * FROM tb_user";
rs = stmt.executeQuery(sql);
while(rs.next()) {
user user = new user();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setBirthday(rs.getDate("birthday"));
list.add(user);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);
}
return null;
}
public user find(int id) {
Connection conn=null;
Statement stmt=null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
stmt=conn.createStatement();
String sql = "SELECT * FROM tb_user WHERE id=" + id;
rs = stmt.executeQuery(sql);
while(rs.next()) {
user user = new user();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
return null;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs,stmt, conn);
}
return null;
}
public boolean delete(int id) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
stmt= conn.createStatement();
String sql = "DELETE FROM tb_user WHERE id=" + id;
int num =stmt.executeUpdate(sql);
if(num > 0) {
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt,conn);
}
return false;
}
public boolean update(user user) {
Connection conn =null;
Statement stmt = null;
ResultSet rs = null;
try {
conn= JDBCUtils.getConnection();
stmt = conn.createStatement();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String birthday =sdf.format(user.getBirthday());
String sql = "UPDATE tb_user set username='"+user.getUsername()
+"',password='"+user.getPassword() + "',email='"
+user.getEmail() + "',birthday='" + birthday
+"'WHERE id=" + user.getId();
int num = stmt.executeUpdate(sql);
if (num > 0) {
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(rs, stmt, conn);
}
return false;
}
}

在这里插入图片描述
3.对5个方法测试,并查看测试结果
添加测试类JDBCTest实现向tb_usr插入数据库:

package chapter02.jdbc.example;
import java.util.ArrayList;
import java.util.Date;

import com.javaweb.bean.user;

@Test
public class JDBCTest {
	public static void main(String[] args) {
		//向users表插入一个用户信息
		UsersDao ud = new UsersDao();
		user user=new user();
		user.setId(8);
		user.setUsername("hfdsdl");
		user.setPassword("12363");
		user.setEmail("hl6@sina.com");
		user.setBirthday(new Date());
		boolean b= ud.insert(user);
		System.out.println(b);
	}
	
}

在这里插入图片描述
成功插入数据:
在这里插入图片描述
编写测试类FindAllUsersTest,该类用于实现读取tb_user表中所有的数据:

package chapter02.jdbc.example;
import java.util.ArrayList;
import com.javaweb.bean.user;
 
public class FindAllUsersTest {
	public static void main(String[] args) {
		UsersDao usersDao = new UsersDao();
		ArrayList<user> list = usersDao.findAll();
		for (int i=0; i< list.size(); i++) {
			System.out.println("第" + (i+1) + "条数据的username的值为:"
					+list.get(i).getUsername());
		}
	}
 

在这里插入图片描述
最后成功读取tb_user表中所有的数据:
在这里插入图片描述
编写测试类UpdateUserTest,在该类中实现修改tb_user表中数据的操作:

package chapter02.jdbc.example;
import java.util.Date;
import com.javaweb.bean.user;

public class UpdateUserTest {
	public static void main(String[] args) {
		UsersDao usersDao = new UsersDao();
		user user = new user();
		user.setId(5);
		user.setUsername("zhaoxiaoliu");
		user.setPassword("456");
		user.setEmail("zhaoxiaoliu@sina.com");
		user.setBirthday(new Date());
		boolean b=usersDao.update(user);
		System.out.println(b);
	}
}

在这里插入图片描述
运行结果和查询结果如图所示:
在这里插入图片描述
编写测试类DeleteUserTest,该类实现了删除tb_user 表中数据的操作:

package chapter02.jdbc.example;
public class DeleteUserTest {
	public static void main(String[] args) {
		UsersDao usersDao = new UsersDao();
		boolean b = usersDao.delete(5);
		System.out.println(b);
	}
}

在这里插入图片描述
运行结果和sql查询结果如图所示:
在这里插入图片描述
从图中可以看出,users表中id为5的User对象已被成功删除了。至此,使用JDBC对数据库中数据进行增删改查的操作已经完成。
完成SQL注入实验,并对比结果
SQL注入模拟:正常登陆SQL查询:
新建testLogin单元测试:

package com.java5678.Demo;

import static org.junit.Assert.*;

import java.sql.DriverManager;
import java.sql.ResultSet;

import org.junit.Test;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class testLogin {

	@Test
    public void testLogin() throws  Exception {
	String url = "jdbc:mysql://localhost:3306/db_myweb";
       String username = "root";
       String password = "root";
       Connection conn = (Connection) DriverManager.getConnection(url, username, password);
       // 接收用户输入 用户名和密码
        String name = "zl";
        String pwd = "123456";
        String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
        // 获取stmt对象
        Statement stmt = (Statement) conn.createStatement();
        // 执行sql
        ResultSet rs = stmt.executeQuery(sql);
        // 判断登录是否成功
        if(rs.next()){
            System.out.println("登录成功~");
        }else{
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

}

测试成功 :
在这里插入图片描述
QL注入模拟:SQL注入SQL查询:
新建单元测试testLogin2单元测试:

package com.java5678.Demo;

import static org.junit.Assert.*;

import java.sql.DriverManager;
import java.sql.ResultSet;

import org.junit.Test;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class testLogin2 {

@Test
public void testLogin_Inject() throws Exception {
//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
String url = "jdbc:mysql://localhost:3306/db_myweb";
String username = "root";
String password = "root";
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
// 接收用户输入 用户名和密码
String name = "hfkjsfhskj";
String pwd = "' or '1' = '1";
String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
System.out.println(sql);
// 获取stmt对象
Statement stmt = (Statement) conn.createStatement();
// 执行sql
ResultSet rs = stmt.executeQuery(sql);

// 判断登录是否成功
if(rs.next()){
System.out.println("登录成功~");
}else{
System.out.println("登录失败~");
}

//7. 释放资源
rs.close();
stmt.close();
conn.close();
}
}

运行testLogin2单元测试发现sql注入成功!
在这里插入图片描述
完成转账事务控制实验,并对比结果
创建JDBCDemo3_Connection java类:
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()

package com.java5678.Demo;

import java.sql.DriverManager;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class JDBCDemo3_Connection {
public static void main(String[] args) throws Exception {
//1. 注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
String url = "jdbc:mysql:///db_myweb?useSSL=false";
String username = "root";
String password = "root";
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql1 = "update account set money = 3000 where id = 1";
String sql2 = "update account set money = 3000 where id = 2";
//4. 获取执行sql的对象 Statement
Statement stmt = (Statement) conn.createStatement();
try {
// 开启事务
conn.setAutoCommit(false);
//5. 执行sql
int count1 = stmt.executeUpdate(sql1);//受影响的行数
//6. 处理结果
System.out.println(count1);
//5. 执行sql
int count2 = stmt.executeUpdate(sql2);//受影响的行数
//6. 处理结果
System.out.println(count2);

// 提交事务
conn.commit();
} catch (Exception throwables) {
// 回滚事务
conn.rollback();
throwables.printStackTrace();
}
//7. 释放资源
stmt.close();
conn.close();
}
}

在这里插入图片描述
运行结果:
成功完成转账事务:
在这里插入图片描述
自定义封装JDBC连接工具类
1.第一代JDBCUtils类封装与测试,查看结果
在包com.javaweb.utils下面创建testJdbcUtils1类:

package com.javaweb.utils;
import java.sql.*;
public class testJdbcUtils1 {
	public static void main(String[] args) throws Exception {
		Connection conn = JDBCUtils.getconnection();
		String sql="update account set money = ? where id = ?";
		PreparedStatement pstm = conn.prepareStatement(sql);
		pstm.setString(1, "20000");
		pstm.setString(2, "1");
		int count=pstm.executeUpdate();
		JDBCUtils.close( null,pstm, conn);
		System.out.println(count);
	}
}

在这里插入图片描述
2.第二代JDBCUtils类封装与测试,查看结果
在src下创建数据库连接配置文件:jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_myweb?useSSL=false
user=root
password=root

在这里插入图片描述
创建JDBCUtils2类:

package com.javaweb.utils;
import java.io.FileReader;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils2 {
  private static String driver;
  private static String url;
  private static String user;
  private static String password;
static {
  try {
    // 1. 创建Properties集合类。
      Properties properties = new Properties();
    // 2. 加载文件
    properties.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("jdbc.properties").getPath()));
 driver = properties.getProperty("driver");
 url = properties.getProperty("url");
 user = properties.getProperty("user");
 password = properties.getProperty("password");
 // 注册驱动
 Class.forName(driver);
 } catch (Exception e) {
   e.printStackTrace();
 }
 }
public static Connection getConnection() throws SQLException { 
	   return   DriverManager.getConnection(url, user, password);
	}

	// 释放资源
	public static void close(ResultSet rs, PreparedStatement pstm, Connection conn) {
	try {
	     if (rs != null) {
	       rs.close();
	     }
	     if (pstm != null) {
	        pstm.close();
	     }
	     if (conn != null) {
	        conn.close();
	     }
	     } catch (SQLException e) {
	         e.printStackTrace();
	    }
	}
}

第二代JDBCUtils测试:

package com.javaweb.utils;
import java.sql.*;
public class testJdbcUtils2 {
public static void main(String[] args) throws Exception {
Connection conn = JDBCUtils2.getConnection();
String sql = "update account set money = ? where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setDouble(1, 5000);
pstmt.setInt(2, 1);
int count = pstmt.executeUpdate();
System.out.println(count);
}
}

测试结果成功:
在这里插入图片描述
在这里插入图片描述
封装增删改查DAO
1.创建tb_user表,字段有:id username password email birthday
在MySQL中使用一个名称为db_myweb的数据库,然后在该数据库中创建一个tb_user表,再向表中插入3条数据。

Use db_myweb;
CREATE TABLE tb_user(
     id INT PRIMARY KEY AUTO_INCREMENT,
     username VARCHAR(40),
     password VARCHAR(40),
     email VARCHAR(60),
     birthday DATE 
)CHARACTER SET utf8 COLLATE utf8_general_ci;

插入数据:

INSERT INTO tb_user(username,password ,email,birthday) VALUES('zs','123456','zs@sina.com','1980-12-04');
INSERT INTO tb_user(username,password ,email,birthday) VALUES('lisi','123456','lisi@sina.com','1981-12-04');
INSERT INTO tb_user(username,password ,email,birthday) VALUES('wangwu','123456','wangwu@sina.com','1979-12-04');

在这里插入图片描述
2.创建JavaBean:User.java
在src目录下,新建一个名称为chapter02.jdbc.example的包
创建JavaBean,User类的具体实现方式如下:

package com.javaweb.bean;


import java.util.Date;
 
	public class user {
		private int id;
		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;
		}
		public String getEmail() {
			return email;
		}
		public void setEmail(String email) {
			this.email = email;
		}
		public Date getBirthday() {
			return birthday;
		}
		public void setBirthday(Date birthday) {
			this.birthday = birthday;
		}
		private String username;
		private String password;
		private String email;
		private Date birthday;
	}

在这里插入图片描述
3.创建数据库访问层DAO类封装增删改查代码:UserDao.java

package chapter02.jdbc.example;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import com.javaweb.bean.user;

 
public class UsersDao {
	//添加用户的操作
	public boolean insert(user user) {
		Connection conn = null;
		Statement stmt=null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			stmt = conn.createStatement();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String birthday = sdf.format(user.getBirthday());
			String sql = "INSERT INTO tb_user(id,username,password,email,birthday)"+
						"VALUES("
						+user.getId()
						+",'"
						+user.getUsername()
						+"','"
						+user.getPassword()
						+"','"
						+user.getEmail()
						+"','"
						+birthday + "')";
			System.out.println(sql);
			int num = stmt.executeUpdate(sql);
			if (num > 0) {
				return true;
			}
			return false;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs,stmt,conn);
		}
		return false;
	}
	
	public ArrayList<user> findAll(){
		Connection conn = null;
		Statement stmt=null;
		ResultSet rs = null;
		ArrayList<user> list = new ArrayList<user>();
		try {
			conn = JDBCUtils.getConnection();
			stmt = conn.createStatement();
			String sql = "SELECT * FROM tb_user";
			rs = stmt.executeQuery(sql);
			while(rs.next()) {
				user user = new user();
				user.setId(rs.getInt("id"));
				user.setUsername(rs.getString("username"));
				user.setPassword(rs.getString("password"));
				user.setEmail(rs.getString("email"));
				user.setBirthday(rs.getDate("birthday"));
				list.add(user);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, stmt, conn);
		}
		return null;
	}
	public user find(int id) {
		Connection conn=null;
		Statement stmt=null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			stmt=conn.createStatement();
			String sql = "SELECT * FROM tb_user WHERE id=" + id;
			rs = stmt.executeQuery(sql);
			while(rs.next()) {
				user user = new user();
				user.setId(rs.getInt("id"));
				user.setUsername(rs.getString("username"));
				user.setPassword(rs.getString("password"));
				user.setEmail(rs.getString("email"));
				user.setBirthday(rs.getDate("birthday"));
				return user;
			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs,stmt, conn);
		}
		return null;
	}
	public boolean delete(int id) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			stmt= conn.createStatement();
			String sql = "DELETE FROM tb_user WHERE id=" + id;
			int num =stmt.executeUpdate(sql);
			if(num > 0) {
				return true;
			}
			return false;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.release(rs, stmt,conn);
		}
		return false;
	}
	public boolean update(user user) {
		Connection conn =null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			conn= JDBCUtils.getConnection();
			stmt = conn.createStatement();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String birthday =sdf.format(user.getBirthday());
			String sql = "UPDATE tb_user set username='"+user.getUsername()
						+"',password='"+user.getPassword() + "',email='"
						+user.getEmail() + "',birthday='" + birthday
						+"'WHERE id=" + user.getId();
			int num = stmt.executeUpdate(sql);
			if (num > 0) {
				return true;
			}
			return false;
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.release(rs, stmt, conn);
		}
		return false;
	}
}

在这里插入图片描述
4.利用JUnit对DAO的方法进行单元测试,并查看结果
创建测试类JDBCTESTl,利用JUnit对DAO-insert方法添加tb_user表中的数据:

package chapter02.jdbc.example;


import java.util.Date;

import com.javaweb.bean.user;

@Test
public class JDBCTest {
	public static void main(String[] args) {
		//向users表插入一个用户信息
		UsersDao ud = new UsersDao();
		user user=new user();
		user.setId(4);
		user.setUsername("xiaoli");
		user.setPassword("00000");
		user.setEmail("h23526456@qq.com");
		user.setBirthday(new Date());
		boolean b= ud.insert(user);
		System.out.println(b);
	}
	
}

在这里插入图片描述
测试结果:
在这里插入图片描述
创建测试类JDBCTEST03,利用JUnit对DAO-findAll方法根据ID查询tb_user表中数据:

package chapter02.jdbc.example;


import java.util.ArrayList;

import com.javaweb.bean.user;
 
public class FindAllUsersTest {
	public static void main(String[] args) {
		UsersDao usersDao = new UsersDao();
		ArrayList<user> list = usersDao.findAll();
		for (int i=0; i< list.size(); i++) {
			System.out.println("第" + (i+1) + "条数据的username的值为:"
					+list.get(i).getUsername());
		}
	}
 
}

在这里插入图片描述
测试结果,成功查询出tb_user表中所有username值:
在这里插入图片描述
创建测试类JDBCTEST03,利用JUnit对DAO-find方法根据ID查询tb_user表中数据:
我们根据ID查询tb_user表中ID为13的数据库信息:

package chapter02.jdbc.example;

import static org.junit.Assert.*;

import org.junit.Test;

import com.javaweb.bean.user;

public class JDBCTEST03 {

	
	@Test
	public void testFind() throws Exception {
	UsersDao dao= new UsersDao();
	user user=dao.find(13);
	System.out.println("id为13的User对象的name值为:"+user.getUsername());
	}


}

在这里插入图片描述
测试结果:
成功通过ID查询rb_user表中ID为13的username信息
在这里插入图片描述
创建测试类JDBCTEST04,利用JUnit对DAO-update方法方法根据ID更新tb_user表中数据:

package chapter02.jdbc.example;

import java.util.Date;

import org.junit.Test;

import com.javaweb.bean.user;

public class JDBCTEST04 {

	@Test
	public void testUpdate() throws Exception {
	        UsersDao dao= new UsersDao();
	        user user=new user();
	        user.setId(13);
	        user.setUsername("项秀才让");
	        user.setPassword("abc");
	        user.setEmail("123456@sina.com");
	        user.setBirthday(new Date());
	        boolean b=dao.update(user);
	        System.out.println(b);
	}

}

在这里插入图片描述
测试结果:
成功修改ID为13的数据库记录信息!
在这里插入图片描述
创建测试类JdbcTest01,利用DAO-delete方法删除tb_user表中的数据

package chapter02.jdbc.example;
import org.junit.jupiter.api.Test;
class JdbcTest01 {

	@Test
	public void testDelete() {
	   UsersDao dao= new UsersDao();
	   boolean b=dao.delete(8);
	   System.out.println(b);
	}	
}

在这里插入图片描述
测试结果和sql查询结果:
在这里插入图片描述
完成网站登录程序实验
1.创建登录页面login.jsp
在web目录下创建一个名称为login的JSP文件,在该文件中添加用于用户登录时输入用户信息的表单元素。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/myweb/LoginServlet" method="post">
用户名:<input type="text" name="username">     <br>
密  码:<input type="password" name="password"> <br> 
<input type="submit" value="登录">
</form>
</body>
</html>

在这里插入图片描述
2.UserDao增加方法按用户名和密码查询方法

// 根据username,password查找指定的user
public boolean findByUsernameAndPassword(String username,String password){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获得数据的连接
conn = JDBCUtils.getConnection();
// 发送SQL语句
String sql = "select * from tb_user where username=? and password=?";
// 获得PreparedStatement对象
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
// 处理结果集
if (rs.next()) 
return true;
return false;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, pstmt, conn);
}
return false;
}

在这里插入图片描述
3.创建登录功能的LoginServlet.java

package com.javaweb.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     request.setCharacterEncoding("UTF-8");
     response.setContentType("text/html;charset=utf-8"); 
     PrintWriter out = response.getWriter();
     String username=request.getParameter("username");
     String password=request.getParameter("password");
     if(username!=null&&password!=null&&!username.equals("")&&!password.equals("")) {
          UserDao dao=new UserDao();
          boolean b=dao.findByUsernameAndPassword(username, password);
          if(b)
	  out.print("欢迎登录!");
          else
	  out.print("用户名或密码不正确!");	
          }else
	   out.print("用户名或密码不能为空!");	
    }

}

在这里插入图片描述
4.运行项目,查看效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不输入用户名和密码时候登录:
在这里插入图片描述
输入错误密码时:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126717.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数

前言 在今天的题目开始之前,让我们来回顾一下之前的知识,动规五部曲 1.确定dp数组含义 2.确定dp数组的递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组来排错 tips: 1.当求取物品有限的时候用0-1背包,求取物品无限的时候用完全背包 结果是排列还是组合也有说法,当结果是组…

如何选择最适合的知识付费小程序开发工具?

在选择适合的知识付费小程序开发工具时&#xff0c;需要考虑开发者的技能水平、项目需求、平台兼容性以及用户体验。下面将介绍一些常用的开发工具&#xff0c;并提供一些选择工具的考虑因素。 1. 微信小程序开发工具 微信小程序是知识付费小程序的一个常见平台&#xff0c;…

生活污水处理一体化处理设备有哪些

生活污水处理一体化处理设备有多种类型&#xff0c;包括但不限于以下几种&#xff1a; 鼓风机&#xff1a;提供曝气系统所需的气流。潜水污水提升泵&#xff1a;将污水从低处提升到高处。旋转式滚筒筛分机&#xff1a;对污水中的悬浮物进行分离和筛选。回旋式格栅&#xff1a;…

LVS NAT 模式

1.3.2. LVS DR 模式 模式&#xff08;局域网改写 &#xff08;局域网改写 mac 地址&#xff09; ①.客户端将请求发往前端的负载均衡器&#xff0c;请求报文源地址是 CIP&#xff0c;目标地址为 VIP。 ②.负载均衡器收到报文后&#xff0c;发现请求的是在规则里面存在的地址&am…

股票四倍杠杆什么意思?

股票四倍杠杆是指投资者通过借款或使用金融衍生品&#xff0c;以增加其投资股票的能力&#xff0c;达到放大投资回报的目的。具体来说&#xff0c;投资者可以通过向券商或银行等金融机构借入资金&#xff0c;或者使用融资融券等金融衍生品&#xff0c;以增加其购买股票的资本&a…

看李广的故事:发现团队管理之道

在漠北之战中&#xff0c;李广因迷失道路而延误了军期。因李广年事已高&#xff0c;无法承受幕府的责难&#xff0c;最终选择在军前自刎而死。 这一事件令人痛惜&#xff0c;不禁让人想起在工作中遇到的类似情况。有些同事因为突然离职&#xff0c;让领导感到愕然&#xff0c;…

【python小游戏】飞机大作战源码分享(附完整源码+图片资源可直接运行)

效果演示 源码 plane_main1.py import pygame from plane_sprites import * import timeclass PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")# 1. 创建游戏的窗口self.screen pygame.display.set…

WPF中数据绑定验证深入讲解

WPF中数据绑定验证深入讲解 WPF在用户输入时&#xff0c;提供了验证功能&#xff0c;通常验证使用以下两种方式来实现&#xff1a; 在数据对象中引发错误。通常是在属性设置过程中抛出异常&#xff0c;或者在数据类中实现INotifyDataErrorInfo或IDataErrorInfo接口。在绑定级…

epoll实现 IO复用

1、epoll实现 IO复用 epoll的提出--》它所支持的文件描述符上限是系统可以最大打开的文件的数目&#xff1b;eg&#xff1a;1GB机器上&#xff0c;这个上限10万个左右。 每个fd上面有callback(回调函数)函数&#xff0c;只有活跃的fd才有主动调用callback&#xff0c;不需要轮询…

【Python爬虫】网页抓取实例之淘宝商品信息抓取

之前我们已经说过网页抓取的相关内容 上次我们是以亚马逊某网页的产品为例 抓取价格、品牌、型号、样式等 该网页上价格、品牌、型号、样式等 都只有一个 如果网页上的目标内容 根据不同规格有多个 又该怎么提取呢&#xff1f; ▼如下图所示 当机身颜色、套餐、存储容量…

python3.8.10虚拟环境安装talib总报平台不匹配

目录 环境&#xff1a; 需求&#xff1a; 问题&#xff1a; 概述 过程及解决 解决方案总结 环境&#xff1a; 操作系统&#xff1a;window10、64位 开发工具&#xff1a;pycharm python版本&#xff1a;python3.8.10 需求&#xff1a; 在python3.8.10的虚拟环境中安…

神经网络遗传算法函数极值寻优

大家好&#xff0c;我是带我去滑雪&#xff01; 对于未知的非线性函数&#xff0c;仅仅通过函数的输入和输出数据难以寻找函数极值&#xff0c;这一类问题可以通过神经网络结合遗传算法求解&#xff0c;利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。 …

国内外PLC的差异化对比

在聊PLC的市场格局和国产发展现状之前&#xff0c;我们先来简单了解一下PLC的作用。所谓PLC&#xff0c;你可以把它当成是一台小型电脑&#xff0c;只不过这台电脑是专用于工业领域&#xff0c;用来控制各种机械或生产的过程。比如说我们身上穿的衣服&#xff0c;都是由机器缝制…

合成数据在医疗保健行业的案例研究

从机器人辅助手术到医学成像技术&#xff0c;人工智能在医疗保健领域的应用正在迅速改变医疗保健行业&#xff0c;并改善服务成本和服务质量。例如&#xff0c;埃森哲表示&#xff0c;到 150 年&#xff0c;人工智能临床健康应用每年可以为美国医疗保健行业节省 2026 亿美元。 …

Ubuntu22.04 下 NFS 相关问题与完整配置(客户机 MacOS)

categories: [Linux-Shell] tags: Linux NFS 写在前面 最近折腾一下 NFS, 先白嫖一顿华子云的 1 个月服务器, 2C4G 感觉不错了, 但NFS 配置起来还是有点难度, 主要还是随机分配的端口配置方面比较恶心. server环境: 华为云 2C4G Ubuntu22.04 client环境: MacOS M1 with brew …

个人网厅——销户

目录 需求文档 公积金销户类 controller层 service层 service层实现类 1.验证 &#xff08;个人账户&#xff09; 2.提交&#xff08;添加&#xff09; controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4. 详情查询…

2.【自动驾驶与机器人中的SLAM技术】左乘模型推导ESKF

目录 1. 证明题 证明&#xff1a;若某个高斯随机变量为零均值&#xff0c;协方差为对角线矩阵且大小相同&#xff08;各向同性&#xff09;&#xff0c;那么在乘任意旋转矩阵以后&#xff0c;其均值仍为零&#xff0c;且协方差不变&#xff1b; 2. 代码实现运动方程将F矩阵…

layui table合并相同的列

table.render({elem: #samples,url: /index/Develorderss/samplelists?od_idod_id //数据接口,page: { //支持传入 laypage 组件的所有参数&#xff08;某些参数除外&#xff0c;如&#xff1a;jump/elem&#xff09; - 详见文档layout: [prev, page, next, count,skip,limit]…

链表OJ题(1)

今天讲解两道链表OJ题目。 1.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个…

mac 安装使用svn教程

mac 安装使用svn教程 一、安装Homebrew 要在Mac OS上安装SVN&#xff0c;首先需要安装Homebrew。Homebrew是一个流行的包管理器&#xff0c;因此我们将使用它来安装SVN。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…