湖北商城网站建设多少钱,网站建设速成班培训,青岛seo建站,益阳房产网站建设实验十 JDBC连接MySQL
本次实验没有代码补全#xff0c;以下都是完整过程#xff0c;详细关注连接过程的问题
一、实验目的#xff1a;
1、掌握JDBC连接数据库的一般操作。 2、理解JavaBean的基本作用。 3、理解分层设计的思想。
二、 实验内容#xff1a;
实现学生信…实验十 JDBC连接MySQL
本次实验没有代码补全以下都是完整过程详细关注连接过程的问题
一、实验目的
1、掌握JDBC连接数据库的一般操作。 2、理解JavaBean的基本作用。 3、理解分层设计的思想。
二、 实验内容
实现学生信息的增删改查操作。 注通过以下提供的实验步骤最终得到的项目结构如下所示
【实验步骤】
1将jar包“mysql-connector-java-5.0.8-bin.jar”拷贝到tomcat的lib文件夹中。 个人使用的是mysql8.0版本若有相同文末自提驱动 2在MySQL中创建名为“my_db”的数据库并在数据库中创建student表。
create database my_db;use my_db;create table student
(sno char(5) primary key,
sname varchar(50),
sage int);insert into student
values(99001,张三,20),(99002,李四,21);3新建一个名为”web10”的项目Web应用程序。在项目中新建“Java包”命名为“model”。 4在model包中新建“Java类”命名为“Student”。Student.java为封装student表的JavaBean。
/*** 与学生表对应的实体类封装数据的JavaBean目的是方便数据传输以及代码维护。* JavaBean的要求 * 1、是一个Java 类* 2、必须存在无参数构造方法 * 3、所有成员变量都是private * 4、私有化的属性必须通过public类型的方法暴露给其它程序 并且方法的命名也必须遵守一定的命名规范。* 即如果想private成员变量被外界访问提供public的get和set方法。*/
package model;public class Student {private String sno;private String sname;private int sage;public Student(String sno, String sname, int sage) {this.sno sno;this.sname sname;this.sage sage;}public Student() {}public String getSno() {return sno;}public void setSno(String sno) {this.sno sno;}public String getSname() {return sname;}public void setSname(String sname) {this.sname sname;}public int getSage() {return sage;}public void setSage(int sage) {this.sage sage;}}5在项目中新建“Java包”命名为“dal”Data Access Layer。该包中存储的文件主要用于数据库访问。 6在dal包中创建“Java类”命名为“Dbutils”。该文件中定义了访问数据库的通用读写方法。
package dal;
import java.sql.*;
public class Dbutils {protected Connection conn null;protected PreparedStatement pstmt null;protected ResultSet rs null;/*** 获取连接对象* return 连接对象*/public Connection getConnection() {try {//1、加载驱动类Class.forName(com.mysql.jdbc.Driver);//2、创建连接对象String url jdbc:mysql://localhost:3306/my_db?useUnicodetruecharacterEncodingutf-8;String user root;String password ;conn DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}/*** 关闭资源** param conn* param pstmt* param rs*/public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs ! null) {rs.close();}if (pstmt ! null) {pstmt.close();}if (conn ! null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增删改操作** param sql* param params* return */public int executeUpdate(String sql, Object[] params) {this.getConnection();int result 0;try {//3、创建prepareStatement对象pstmt conn.prepareStatement(sql);//4、为占位符赋值if (null ! params) {for (int i 0; i params.length; i) {pstmt.setObject(i 1, params[i]);}}//5、调用方法执行sql语句result pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll(conn, pstmt, null);}return result;}/*** 查询方法** param sql* param params* return*/public ResultSet executeQuery (String sql, Object[] params) {this.getConnection();try {//3、创建prepareStatement对象pstmt conn.prepareStatement(sql);//4、为占位符赋值if (null ! params) {for (int i 0; i params.length; i) {pstmt.setObject(i 1, params[i]);}}//5、调用方法执行sql语句rs pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}//后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流return rs;}
}7在dal包中创建“Java类”命名为“StudentDAO”。该文件中定义了对Student表进行增删改查操作的方法。该类中需使用model包中的Student类。
package dal;import model.Student;
import java.util.List;
import java.util.ArrayList;
import java.sql.*;/*** 对Student表进行增删改查的方法*/
public class StudentDAO {Dbutils dbutils new Dbutils();//返回所有的学生信息public ListStudent findAllStudents() {String sql select sno,sname,sage from student;Object[] params null;ListStudent list new ArrayList();ResultSet rs dbutils.executeQuery (sql, params);try {if (null ! rs) {while (rs.next()) {Student student new Student();student.setSno(rs.getString(sno));student.setSname(rs.getString(sname));student.setSage(rs.getInt(sage));list.add(student);}}} catch (SQLException ex) {ex.printStackTrace();} finally {dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);}return list;}//根据学号查找学生信息public Student findBySno(String sno) {Student student new Student();String sql select sno,sname,sage from student where sno?;Object[] params {sno};ResultSet rs dbutils.executeQuery (sql, params);try {if (null ! rs) {if (rs.next()) {student.setSno(rs.getString(sno));student.setSname(rs.getString(sname));student.setSage(rs.getInt(sage));}}} catch (SQLException ex) {ex.printStackTrace();} finally {dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);}return student;}//判断学号在student表中是否存在public boolean isSnoExist(String sno) {boolean flag false;String sql select sno,sname,sage from student where sno?;Object[] params {sno};ResultSet rs dbutils.executeQuery (sql, params);try {if (rs ! null rs.next()) {flag true;}} catch (SQLException ex) {ex.printStackTrace();}return flag;}//插入一条学生记录public boolean insert(Student student) {boolean flag false;String sql insert into student(sno,sname,sage) values(?,?,?);Object[] params {student.getSno(), student.getSname(), student.getSage()};return (dbutils.executeUpdate(sql, params) 1);}//根据学号更新该生的其他属性public boolean update(Student student) {String sql update student set sname?,sage? WHERE sno?;Object[] params {student.getSname(), student.getSage(), student.getSno()};return dbutils.executeUpdate(sql, params) 1;}//根据学号删除学生信息public boolean deleteBySno(String sno) {String sql delete from student where sno?;Object[] params {sno};return dbutils.executeUpdate(sql, params) 1;}
}8在项目中新建“JSP文件”命名为“student”。该文件为“学生信息管理”的首页。 在该文件中使用了model包中的Student类以及dal包中的StudentDAO类。其中通过dal.StudentDAO类的findAllStudents()方法返回了student表中的全部记录。
%page importdal.StudentDAO%
%page importjava.util.List%
%page importmodel.Student%
%page contentTypetext/html pageEncodingUTF-8%
!DOCTYPE html
htmlheadmeta http-equivContent-Type contenttext/html; charsetUTF-8title学生信息管理/title/headbodydiv aligncenterh1学生信息管理/h1%StudentDAO studentDAO new StudentDAO();//获取所有学生信息ListStudent students studentDAO.findAllStudents();%table border1 width80% trth width20%编号/thth width20%学生学号/thth width20%姓名/thth width20%年龄/thth width20%操作/th/tr%int rowNum 0;//行编号for (int i 0; i students.size(); i) {rowNum;String sno students.get(i).getSno();String sname students.get(i).getSname();int sage students.get(i).getSage();String deleteLink delete?sno sno;String editLink editPage.jsp?sno sno;%trtd% rowNum%/tdtd% sno%/tdtd% sname%/tdtd% sage%/td!--点击“删除”链接使用javascript脚本弹出确认对话框单击“确定”后才执行删除操作--tda href%deleteLink% onClickreturn confirm(您确定要删除吗);删除/aa href%editLink%修改/a/td /tr%}%/tablebr/form actionadd method get学号 input namesno姓名 input namesname年龄 input namesageinput typesubmit value增加/br/form/div/body
/html9在项目中新建“JSP文件”命名为“editPage”。该文件为编辑文件的页面。 该文件中同样使用了model包的Student类以及dal包的StudentDAO类。其中通过调用dal.studentDAO类的findBySno(Sring sno)方法返回被选中的学生的基本信息。
%page importmodel.Student%
%page importdal.StudentDAO%
%page contentTypetext/html pageEncodingUTF-8%
!DOCTYPE html
htmlheadmeta http-equivContent-Type contenttext/html; charsetUTF-8titleJSP Page/title/headbodyh1编辑学生信息/h1% StudentDAO studentDAO new StudentDAO();String sno request.getParameter(sno);Student student studentDAO.findBySno(sno);String sname student.getSname();int sage student.getSage(); %form actionedit method get!--通过readonlytrue设置学号文本框不能修改--学号 input namesno readonlytrue value%sno%br/姓名 input namesname value%sname%br/年龄 input namesage value%sage%br/br/input typesubmit value提交/br/form/body
/html10在项目中新建“Java包”命名为“servlet”。该包中存储项目的servlet文件。 11在“servlet”包中新建“Java类”命名为“AddServlet”实现学生记录的添加。 如果用户输入的学号在学生表存在则提示“学号重复添加失败”否则将学生记录插入到学生表中并提示“添加成功”。最后跳转到首页“student.jsp”中。 该文件中调用了dal.StudentDAO类的insert(Student student)方法实现学生记录的添加。
package servlet;import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Student;WebServlet(/add)
public class AddServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求对象的编码方案为utf-8req.setCharacterEncoding(utf-8);//设置响应对象以及浏览器的字符方案为utf-8resp.setContentType(text/html;charsetutf-8);StudentDAO studentDAO new StudentDAO();//获取用户输入的学号,判断学号在学生表中是否存在String sno req.getParameter(sno);if (studentDAO.isSnoExist(sno)) {resp.getWriter().println(scriptalert(学号重复添加失败);window.location.hrefstudent.jsp/script);} else {//获取用户输入的姓名、年龄String sname req.getParameter(sname);String sageStr req.getParameter(sage);Integer sage Integer.parseInt(sageStr);Student student new Student(sno, sname, sage);studentDAO.insert(student);//使用javascript脚本输出提示对话框并跳转到student.jsp页面中resp.getWriter().println(scriptalert(添加成功);window.location.hrefstudent.jsp/script);}//不能使用resp.sendRedirect(student.jsp);否则javascript对话框无法显示。}
}12在“serlvet”包中新建“Java类”命名为“DeleteServlet”。 该文件通过调用dal.StudentDAO类的deleteBySno(String sno)实现根据学号删除学生记录的操作。
package servlet;import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;WebServlet(/delete)
public class DeleteServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {StudentDAO studentDAO new StudentDAO();String sno req.getParameter(sno);//根据用户输入的学号删除学生记录studentDAO.deleteBySno(sno);//重定向到首页student.jspresp.sendRedirect(student.jsp);}
}13在“serlvet”包中新建“Java类”命名为“EditServlet”。 该文件通过调用dal.StudentDAO类的update(Student student)实现了根据学号修改学生记录的操作。
package servlet;import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Student;WebServlet(/edit)
public class EditServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding(utf-8);resp.setContentType(text/html;charsetutf-8);StudentDAO studentDAO new StudentDAO();String sno req.getParameter(sno);String sname req.getParameter(sname);String sageStr req.getParameter(sage);int sage Integer.parseInt(sageStr);Student student new Student(sno, sname, sage);if (studentDAO.update(student)) {resp.getWriter().println(scriptalert(修改成功);window.location.hrefstudent.jsp/script);} else {resp.getWriter().println(scriptalert(程序发生了未知的错误修改失败);window.location.hrefstudent.jsp/script);}}
}三、先看实验效果 四、具体连接时的错误只提供mysql8.0的问题–个人使用的是MySQL8.0
1、先提供mysql-connector-java-8.0.11 jar包
链接https://pan.baidu.com/s/1I_iES9J2EmjRfYjr3ujlOA?pwd2vyg 提取码2vyg
2、将下载好的jar包放在tomcat的lib文件夹中
3、遇到的问题
1、数据库连接问题 主要原因是 在Dbutils类中的mysql密码配置中没有正确填写你自己的所对应的数据库连接密码。 解决方法正确填写密码 修改后的代码
package dal;import java.sql.*;/*** Auther zg* Date 2023/12/26* Version 1.0*/
public class Dbutils {protected Connection conn null;protected PreparedStatement pstmt null;protected ResultSet rs null;/*** 获取连接对象* return 连接对象*/public Connection getConnection() {try {//1、加载驱动类Class.forName(com.mysql.jdbc.Driver);//2、创建连接对象String url jdbc:mysql://localhost:3306/my_db_web10?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai;String user root;String password root; // 修改处conn DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}/*** 关闭资源** param conn* param pstmt* param rs*/public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs ! null) {rs.close();}if (pstmt ! null) {pstmt.close();}if (conn ! null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增删改操作** param sql* param params* return*/public int executeUpdate(String sql, Object[] params) {this.getConnection();int result 0;try {//3、创建prepareStatement对象pstmt conn.prepareStatement(sql);//4、为占位符赋值if (null ! params) {for (int i 0; i params.length; i) {pstmt.setObject(i 1, params[i]);}}//5、调用方法执行sql语句result pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll(conn, pstmt, null);}return result;}/*** 查询方法** param sql* param params* return*/public ResultSet executeQuery (String sql, Object[] params) {this.getConnection();try {//3、创建prepareStatement对象pstmt conn.prepareStatement(sql);//4、为占位符赋值if (null ! params) {for (int i 0; i params.length; i) {pstmt.setObject(i 1, params[i]);}}//5、调用方法执行sql语句rs pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}//后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流return rs;}
}2、mysql8.0在创建连接对象的时候需要配置时区 错误原因 主要是没有在url中配置时区 解决方法添加时区配置 修改好的代码
package dal;import java.sql.*;/*** Auther zg* Date 2023/12/26* Version 1.0*/
public class Dbutils {protected Connection conn null;protected PreparedStatement pstmt null;protected ResultSet rs null;/*** 获取连接对象* return 连接对象*/public Connection getConnection() {try {//1、加载驱动类Class.forName(com.mysql.jdbc.Driver);//2、创建连接对象String url jdbc:mysql://localhost:3306/my_db_web10?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai; // 修改处String user root;String password root;conn DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}/*** 关闭资源** param conn* param pstmt* param rs*/public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs ! null) {rs.close();}if (pstmt ! null) {pstmt.close();}if (conn ! null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增删改操作** param sql* param params* return*/public int executeUpdate(String sql, Object[] params) {this.getConnection();int result 0;try {//3、创建prepareStatement对象pstmt conn.prepareStatement(sql);//4、为占位符赋值if (null ! params) {for (int i 0; i params.length; i) {pstmt.setObject(i 1, params[i]);}}//5、调用方法执行sql语句result pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll(conn, pstmt, null);}return result;}/*** 查询方法** param sql* param params* return*/public ResultSet executeQuery (String sql, Object[] params) {this.getConnection();try {//3、创建prepareStatement对象pstmt conn.prepareStatement(sql);//4、为占位符赋值if (null ! params) {for (int i 0; i params.length; i) {pstmt.setObject(i 1, params[i]);}}//5、调用方法执行sql语句rs pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}//后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流return rs;}
}4、总结
以上就是这个实验的我所遇到的连接错误两个错误都出现在Dbutils最终的修改的代码就是的若还有其他问题请留言。