JSP链接数据库(代码优化及JavaBean初尝)

JSP链接数据库(代码优化及JavaBean初尝)

对之前的那个测试代码进行改进,JSP本身是在JS中嵌套Java代码,但是如果项目比较庞大,代码一多,放在一起就看着很繁杂,并且出错修改的话也很麻烦,那么我们就把Java代码放到.java文件中;
上代码:
首先是jsp文件:
Index.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="check.jsp" method="post">
		<input type="text" name="uname"><br>
		<input type="submit" name="提交"><br>
		</form>
</body>
</html>

其次是check.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

    <%@ page import="SQLweb.*" %><!-- 导包 -->
    <%@ page import="Entity.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%
			String names=request.getParameter("uname");
		//	Person person=new Person(names);//实例化一个Person对象
			findDao ch=new findDao();
			int num=1;
		//	num=ch.checks(person);//获取到返回的结果值;
			num=ch.checks(names);
			if(num>0)
			{
				out.print("查询成功!");
			}else if(num==0)
			{
				out.print("对不起,查无此人!");
			}else if(num<0)
			{
				out.print("系统异常!");
			}
			out.print(num);//用作查看返回的行号
		%>
</body>
</html>

最后在项目目录下的Java Resources下的src下创建java项目
在这里插入图片描述
注:对于本次实验,由于是实现查询功能,是对数据库进行动作,那么建议在创建java的时候,对数据库动作的文件名称命名为XxxDao.java;
findDao.java:

package SQLweb;

import java.sql.*;
import Entity.*;

public class findDao {
//	public int checks(Person person)
//	{
	public int checks(String name)
	{
		String driver = "com.mysql.cj.jdbc.Driver";
	       String url = "jdbc:mysql://localhost:3306/zxy?&useSSL=false&serverTimezone=UTF-8&useSSL=false&serverTimezone = GMT";
	       String username = "root";
	       String password = "zxy170518.";
	       Connection connection = null;//链接数据库
	       PreparedStatement pstmt=null;//执行sql语句 
	      // Statement stmt=null;
	       ResultSet rs=null;//存放结果集(查询使用)
	        try {
				Class.forName(driver);//建立连接mysql
				connection=DriverManager.getConnection(url,username,password);
				if(!connection.isClosed())
		        {System.out.print("数据库连接成功!");}//验证是否连接成功
				String sql="select * from tb1 where name = ?";
				pstmt=connection.prepareStatement(sql);//对sql语句进行预编译		
		//		String names=request.getParameter("uname");//获取到index中的uname,传递方法是post
				pstmt.setString(1, name);//对sql语句中的“?”进行定义
		//		pstmt.setString(1, person.getName());	
				rs=pstmt.executeQuery();//接收所查询到的结果集
				int count=0;//判断是否查询成功的变量
				if(rs.next())
				{
					count=rs.getInt(1);//这里要注意一下,这里只是将count获取到rs结果集里面的下标为1的属性的属性值,这个下标为1的对应我的数据库里面是id,所以并不是统计rs里面有多少个结果
				}
				return count;
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return -1;//因为有返回值,但是功能代码在try中,所以如果异常,就返回-1即可;
				
			}catch(SQLException e)
	        {
				e.printStackTrace();
				return -1;
	        }finally {
				try {
					if(rs!=null)
					{
						rs.close();
					}
					if(pstmt!=null)
					{
						pstmt.close();
					}
					if(connection!=null)
					{
						connection.close();
					}
				}catch(SQLException e)
				{
					e.printStackTrace();
					return -1;
				}
			}
	}
}

这样一来,代码的复杂程度就稍微减小了,并且把jsp和java分开,各司其职,也方便自己查看和修改,需要注意的是,在整个过程中,需要注意导包。
同时我自己在做的时候,也重新认识到了ResultSet的定义,之前一直认为在做查询功能的时候,ResultSet实例化的对象存放的结果集,在后面我进行判断的时候是直接对结果集的个数进行判断,就直接导致我第一次做的时候进行故意输入错误用户名的时候,一直返回的是-1,一直以为程序有问题,后来才明白虽然是存放的结果,但是不是直接进行对结果集的个数的操作,而是对每一行结果进行操作,比如存放了三个结果,那么本身的光标从最开始的第一行的上面开始往下移动,每指一行就是对应改行的数据。
但是如果在结果集为空的情况下,我自己做了几次测试,返回值我都不能拿到,按理说应该是为0的,我不知道为什么每次我都拿到的是空的,应该是0。这里就先留一个小问题。

结果:
首先看mysql:
在这里插入图片描述
接着看第一次和第二次查询:
1.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.

再看一下查询失败的:
在这里插入图片描述
这里会发现,后面输出了0,但是这个0不是结果集返回到的0,而是我findDao里面返回的count的值,因为count的值本事初始化的时候就是0,由于结果集里面没有东西,返回又为空(但应该是个0,因为i本身getInt返回值就是Int类型),所以在check中的num拿到的实际是count的初始化的值;
//-----------------------------------------------------------------------------------------------------------------------------------------

JavaBean:

JavaBean是一种可重用的Java组件,其本身满足两点:1.public 修饰的类;2.所有的属性都是private 并提供get/set方法;所以JavaBean可以理解为一个Java类;
JavaBean有两大类:
i.封装业务逻辑的JavaBean,诸如例子中的findDao这个类,封装查找逻辑;(处理逻辑)
ii.封装数据的JavaBean,现在进行对数据的封装;(处理数据)
上代码:
同样的,现在项目中新建一个包,分开放;
在这里插入图片描述
Person.java:

package Entity;

public class Person //跟数据库的属性一一对应
{
	private int id;
	private String name;
	public Person()
	{
		
	}
	public Person(String name)
	{
		this.name=name;
	}
	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;
	}
}

相比之下索要改动的地方:
check:
在这里插入图片描述
对于findDao:
把类方法的参数改成Person对象,下面对sql语句的定义改成Person对象.getname()即可;
结果:
在这里插入图片描述
在这里插入图片描述
同样能够实现;

总结:

只是对之前测试代码的一个小优化而已,通过JavaBean实现对代码的分类存储,各司其职,让代码的复用率更高,如Person类后面如果想使用增删改功能也只需实例对象,然后.方法就行。本次的学习过程中也遇到一些小问题,但都不是大问题,最主要的还是ResultSet的定义,在之后的学习过程中,自己会加深对其的理解和学习。
//----------------------------------------------------------------------------------------------------------------------------------------------
2019.11.2更新:
对于之前这个ResultSet,我这个代码在测试的时候,我自己有个误区,结果集的处理上,有一些欠妥,我的逻辑层在处理返回值的时候,我的判断条件为rs.next(),可想而知,如果rs本身就没有数据,那么这个rs.next()的返回值就是false,那肯定进不去啊,但是我的返回值count又是放在这个判断语句块里面的,所以导致我最后实现查不到某项信息的时候,count的值一直没拿到rs返回来的0,导致我以为为空的时候是返回的空而不是0,总的来说还是对ResultSet对象的定义不够清晰导致的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值