版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章使用JDBC
技术访问数据库0208学习目标能识记JDBC和相关编程接口能掌握JDBC访问数据库的步骤能掌握验证用户信息的步骤能掌握添加用户信息进行注册的步骤能灵活添加其他网页的信息能掌握使用JDBC技术浏览数据库中表的内容能掌握显示信息的步骤课程思政形成自觉遵守规则,诚实守信的良好习惯重视数据库设计中的数据安全性,学习工匠精神,尊重软件开发的标准课堂教学中举一反三,引信案例:携程数据泄露事件,保护好自己的隐私,也要保护好家人。
8.1JDBC技术概述JDBC是⼀种可⽤于执⾏SQL语句的JavaAPI(ApplicationProgrammingInterface应⽤程序设计接⼝)。它由⼀些Java语⾔编写的类和界⾯组成。JDBC为数据库应⽤开发⼈员、数据库前台⼯具开发⼈员提供了⼀种标准的应⽤程序设计接⼝,使开发⼈员可以⽤纯Java语⾔编写完整的数据库应⽤程序。8.1JDBC技术概述JDBC体系结构8.1JDBC技术概述JDBC的作用8.1JDBC技术概述JDBC的具体工作原理8.1JDBC技术概述JDBCAPI是Java程序语言的应用程序接口,它提供数据访问的基本功能。使用JDBCAPI包中的类,开发者能够完成所有基本的数据库操作。使用JDBC技术操作数据库接口或类包括:1)java.sql.DriverManager:依据数据库的不同,管理JDBC驱动。2)java.sql.Connection:负责连接数据库并担任传送数据的任务。3)java.sql.Statement:由Connection产生,负责执行SQL语句。4)java.sql.ResultSet:负责保存Statement执行后所产生的查询结果。8.2使用JDBC技术进行数据库编程的步骤1、装载驱动程序;2、与一个数据库建立连接;3、向数据库发送SQL语句;4、处理数据库返回的结果。8.2使用JDBC技术进行数据库编程的步骤1、装载驱动程序为了与特定的数据库建立连接,JDBC必须加载相应的驱动程序。使用Class.forName()方法将驱动程序添加到java.lang.System的属性jdbc.drivers中。以下是加载MySQL驱动程序的方法:publicstaticStringdriver="com.mysql.jdbc.Driver";Class.forName(driver);8.2使用JDBC技术进行数据库编程的步骤2、建立与数据库的连接与数据库建立连接可以通过调用DriverManager.getConnection()方法实现,Connection接口代表与数据库的连接。以下是用纯的Java驱动连接方法连接MySQL数据库的方法:publicstaticStringurl="jdbc:mysql://localhost:3306/数据库名";publicstaticStringdbUser="root";publicstaticStringdbPwd="root";Connectioncon=DriverManager.getConnection(url,dbUser,dbPwd);8.2使用JDBC技术进行数据库编程的步骤为了将MyEclipse中开发的应用程序连接到MySQL数据库,需要从相关站点下载JDBCdriverforMySQL,得到一个文件mysql-connector-java-5.1.7-bin.jar。在MyEclipse的“JavaBulidPath”中,导入解压得到的mysql-connector-java-5.1.7-bin.jar文件,鼠标右健点击建工程,选择“Properties”。8.2使用JDBC技术进行数据库编程的步骤3、向数据库发送SQL语句一旦建立连接,就使用该连接创建Statement或者PreparedStatement,并将SQL语句传递给它所连接的数据库。(1)Statement获取Connection对象之后就可以进行数据库操作了,使用Connection对象可以生成Statement对象。Statementst=conn.createStatement();8.2使用JDBC技术进行数据库编程的步骤Statement接口中包含很多基本的数据库操作方法,最常用的两种如下:ResultSetrs=st.excuteQuery(sql)。其中sql仅仅是查询语句,例如“select*fromuserwherename=’aa’”。此方法返回的对象类型是ResultSet类型对象,它包含执行SQL查询的结果。inti=st.excuteUpdate(sql)。其中sql仅仅是更新语句,即update、insert、delete等SQL语句。此方法返回的是一个整数,表示成功执行更新的行数。没有更新成功,则返回-1。8.2使用JDBC技术进行数据库编程的步骤(2)PreparedStatementPreparedStatement接口继承自Statement接口,PreparedStatement接口比Statement接口用起来更加灵活,更有效率。PreparedStatement类型的对象其实已经包含预编译过的SQL语句,这个SQL语句可具有一个或者多个输入参数,这些输入参数的值在SQL语句创建时未被指定,而是为每个参数保留一个问号(“?”)作为占位符。例如:PreparedStatementps=conn.prepareStatement(“select*fromuserwherename=?andpassword=?”);ps.setString(1,”张杰”);ps.setInt(2,123);8.2使用JDBC技术进行数据库编程的步骤PreparedStatement接口中包含很多基本的数据库操作方法,和Statement类似,最常用的两种如下:①ResultSetrs=ps.excuteQuery();其中sql仅仅是查询语句,例如“select*fromuserwherename=’aa’“。此方法返回的对象类型是ResultSet类型对象,它包含执行SQL查询的结果。②inti=ps.excuteUpdate();其中sql仅仅是更新语句,即update、insert、delete等SQL语句。注意,PreparedStatement的这两个方法内是没有参数的。8.2使用JDBC技术进行数据库编程的步骤4、处理数据库返回的结果我们前面已经获取了rs对象,这样我们就可以通过rs对象来获取数据表中每一列的数据,如果该列数据是字符串类型,我们就可以调用rs.getString(序列号)来获取,第一列的序列号为1,其他按顺序获取。如果该列数据是整型变量,我们可以调用rs.getInt(序列号)来获取。8.3JDBC应用4、处理数据库返回的结果我们前面已经获取了rs对象,这样我们就可以通过rs对象来获取数据表中每一列的数据,如果该列数据是字符串类型,我们就可以调用rs.getString(序列号)来获取,第一列的序列号为1,其他按顺序获取。如果该列数据是整型变量,我们可以调用rs.getInt(序列号)来获取。8.3JDBC应用连接本机上的数据库my,访问该数据库中的user表,共字段name是主键,表的结构和内容如图:8.3JDBC应用1、创建“data”包,并在此包下创建一个类“UserDao.java”,如图:UserDao类packagedata;importjava.sql.*;public
classUserDao{
public
staticStringdriver="com.mysql.jdbc.Driver";//驱动名称
public
staticStringurl="jdbc:mysql://localhost:3306/my"; //my是数据库名称
public
staticStringdbUser="root";
public
staticStringdbPwd="root";
public
staticConnectionconn=null;
public
staticStatementst=null;
public
staticResultSetrs=null;public
staticPreparedStatementps=null;UserDao类publicUserDao(){try{ Class.forName(driver);//1-加载驱动
conn=DriverManager.getConnection(url,dbUser,dbPwd);//2-创建连接对象 System.out.println("数据库连接成功!"); }catch(ClassNotFoundExceptione){ System.out.println("驱动类未找到:"+e); }catch(SQLExceptione){ System.out.println("连接对象创建失败:"+e); } }UserDao类//查询所有的用户信息
public
voidfindAllUsers(){ Stringsql="select*fromuser";
try{
st=conn.createStatement();
rs=st.executeQuery(sql); System.out.println("有下列用户:");
while(rs.next()) { System.out.println("用户名:"+rs.getString("name")); System.out.println("用户密码:"+rs.getString(2)); /*System.out.println("性别:"+rs.getString(3)); System.out.println("爱好:"+rs.getString(4)); System.out.println("专业"+rs.getString(5)); System.out.println("照片:"+rs.getString(6)); System.out.println("个人简介:"+rs.getString7));*/ } }catch(SQLExceptione){ System.out.println("未找到任何用户:"+e); } }UserDao类
//根据用户名查找
publicResultSetfindByName(Stringname){ Stringsql="select*fromuserwherename=?";
try{
ps=conn.prepareStatement(sql);
ps.setString(1,name);
rs=ps.executeQuery(); }catch(SQLExceptione){ System.out.println("未找到该用户:"+e); }
return
rs; }UserDao类//根据用户名和密码查找
publicResultSetfindByNamePsw(Stringname,Stringpsw){ Stringsql="select*fromuserwherename=?andpassword=?";
try{
ps=conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,psw);
rs=ps.executeQuery(); }catch(SQLExceptione){ System.out.println("未找到该用户信息:"+e); }
return
rs; } UserDao类
//为某用户修改用户密码
public
voidchangePassword(StringnewPass,Stringname){ Stringsql="updateusersetpassword=?wherename=?";
try{
ps=conn.prepareStatement(sql);
ps.setString(1,newPass);
ps.setString(2,name);
inti=ps.executeUpdate();
if(i>0){System.out.println("用户密码修改成功!");}
else{ System.out.println("用户密码修改失败!");}}catch(SQLExceptione){e.printStackTrace();}}UserDao类
//添加一个新的用户信息的方法
public
intinsertUser(Stringname,Stringpsw,Stringsex, Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie){ Stringsql="insertintouservalues(?,?,?,?,?,?,?)";
inti=0;
try{
ps=conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,psw);
ps.setString(3,sex);
ps.setString(4,aihao);
ps.setString(5,zhuanye);
ps.setString(6,photo);
ps.setString(7,jianjie); i=ps.executeUpdate();
if(i>0){System.out.println("插入新用户成功!");}
else{ System.out.println("插入新用户失败!");}
}catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }
returni; }UserDao类
//根据用户名删除用户
public
voiddeleteUser(Stringname){ Stringsql="deletefromuserwherename=?";
try{
ps=conn.prepareStatement(sql);
ps.setString(1,name);
inti=ps.executeUpdate();
if(i>0){System.out.println("删除用户成功!");}
else{ System.out.println("删除用户失败!");}}catch(SQLExceptione){e.printStackTrace();}}UserDao类
//关闭数据库资源
public
voidcloseAll(){//如果rs不空,关闭rs
if(rs!=null){
try{rs.close();}catch(SQLExceptione){ e.printStackTrace(); }}//如果ps不空,关闭ps
if(ps!=null){
try{ps.close();}catch(SQLExceptione){ e.printStackTrace(); }}
if(st!=null){
try{ st.close(); }catch(SQLExceptione){ e.printStackTrace(); }}//如果conn不空,关闭conn
if(conn!=null){
try{
conn.close(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}}UserDao类
public
static
voidmain(Stringargs[]){ UserDaoud=newUserDao(); ud.findAllUsers(); ud.findByName("苏州托普学院"); ud.changePassword("aa","123456"); ud.insertUser("ee","55","女","读书,音乐,运动,","人工智能技术","my.png","我喜欢利用人工智能来改变生活!"); ud.deleteUser("dd"); ud.closeAll();}}UserDao类运行UserDao.java,结果出现下面错误,如图:“驱动类未找到”错误,是什么原因呢?可以将MySQL数据库的JDBC驱动包复制到项目WebRoot/WEB-INF/lib文件夹中,即可解决问题运行结果如图8.4使用JDBC技术实现用户登录、注册及修改8.4.1开发任务开发任务:使用JDBC技术升级新闻发布系统,实现对数据库的读写操作:任务一:创建新闻发布系统数据库和数据库表;任务二:优化UserDao.java数据库访问类,从中抽取公共代码封装于BaseDao.java类中,用于连接、关闭数据库,执行SQL语句;任务三:定义UserDao用户访问数据的接口;任务四:利用数据库连接类,实现DAO接口UserDao8.4使用JDBC技术实现用户登录、注册及修改8.4.1开发任务训练技能点:1)会使用JDBC的方式连接数据库;2)会使用PreparedStatement执行数据库表的增、删、改、查操作;3)会采用面向接口的编程方式进行编程;4)会使用ResultSet处理查询结果。8.4使用JDBC技术实现用户登录、注册及修改创建了user表8.4使用JDBC技术实现用户登录、注册及修改创建了news表BaseDao类packagedata;importjava.sql.*;public
classBaseDao{
public
staticStringdriver="com.mysql.jdbc.Driver";//驱动名称
public
staticStringurl="jdbc:mysql://localhost:3306/my"; //my是数据库名称
public
staticStringdbUser="root";
public
staticStringdbPwd="root"; public
staticConnectionconn=null;
public
staticStatementst=null;
public
staticResultSetrs=null;
public
staticPreparedStatementps=null;BaseDao类publicConnectiongetConn(){
try{ Class.forName(driver);//1-加载驱动 conn=DriverManager.getConnection(url,dbUser,dbPwd);//2-创建连接对象 System.out.println("数据库连接成功!"); }catch(ClassNotFoundExceptione){ System.out.println("驱动类未找到:"+e); }catch(SQLExceptione){ System.out.println("连接对象创建失败:"+e); }
returnconn; }BaseDao类//执行SQL语句,实现增、删、改的操作。注意:不能执行查询。
public
intexecuteSQL(Stringsql,String[]param){Connectionconn=null;PreparedStatementps=null;
intnum=0;try{/*处理SQL,执行SQL*/conn=getConn();//获取连接数据库的对象ps=conn.prepareStatement(//得到PreparedStatement对象
if(param!=null){
for(inti=0;i<param.length;i++){ps.setString(i+1,param[i]);//为预编译SQL设置参数}}num=ps.executeUpdate();//执行SQL语句}catch(SQLExceptione){e.printStackTrace();//处理SQLException异常}finally{closeAll();//释放资源}
returnnum;}}UserDao类packageutil;public
interfaceUserDao{
public
abstract
intdeleteUser(Stringname);
public
abstract
intinsertNewUser(Stringname,Stringpassword,Stringsex,Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie);
public
abstract
intupdateUserPassword(Stringpassword,Stringname);
public
abstract
intupdateUser(Stringpassword,Stringsex,Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie,Stringname);
public
abstract
booleanuserLogin(Stringname,Stringpassword);
public
abstractResultSetfindAllUsers();public
abstractResultSetfindName(Stringname);}UserDaoImpl类packageutil;importdata.BaseDao;public
classUserDaoImplextendsBaseDaoimplementsUserDao{
public
intdeleteUser(Stringname){
return0; }
public
intinsertNewUser(Stringname,Stringpassword,Stringsex,Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie){
return0; }
public
intupdateUserPassword(Stringpassword,Stringname){
return0; }public
intupdateUser(Stringpassword,Stringsex,Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie,Stringname){return0;}
public
booleanuserLogin(Stringname,Stringpassword){
return
false; }public
abstractResultSetfindAllUsers(){return
false;}}UserDaoImpl类//用户登录验证用户名和密码是否匹配
publicResultSetuserLogin(Stringname,Stringpassword){ //TODOAuto-generatedmethodstub Stringsql="select*fromuserwherename=?andpassword=?";
try {
conn=this.getConn();
ps=conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,password); rs=ps.executeQuery();//执行SQL语句
}catch(Exceptione) { e.printStackTrace(); }
returnrs;} UserDaoImpl类//根据用户名,删除用户信息
public
intdeleteUser(Stringname){ //TODOAuto-generatedmethodstub Stringsql="deletefromuserwherename=?"; Stringparam[]={name};
inti=0;
try{ i=this.executeSQL(sql,param); //直接使用父类中的executeSQL方法执行查询
if(i>0){System.out.println("删除用户成功!");}
else{ System.out.println("删除用户失败"); }}catch(Exceptione){e.printStackTrace();}
returni; }UserDaoImpl类//添加用户信息
public
intinsertNewUser(Stringname,Stringpassword,Stringsex,Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie){ Stringsql="insertintouservalues(?,?,?,?,?,?,?)"; Stringparam[]={name,password,sex,aihao,zhuanye,photo,jianjie};
inti=0;
try{ i=this.executeSQL(sql,param); //直接使用父类中的executeSQL方法执行查询
if(i>0){System.out.println("添加用户成功!");}
else{ System.out.println("添加用户失败!"); }}catch(Exceptione){e.printStackTrace();}
returni; }UserDaoImpl类//根据用户名来修改用户密码
public
intupdateUserPassword(Stringpassword,Stringname){ Stringsql="updateusersetpassword=?wherename=?"; Stringparam[]={password,name};
inti=0;
try{ i=this.executeSQL(sql,param); //直接使用父类中的executeSQL方法执行查询
if(i>0){System.out.println("修改用户密码成功!");}
else{ System.out.println("修改用户密码失败!"); }}catch(Exceptione){e.printStackTrace();}
returni; }UserDaoImpl类//根据用户名更新用户信息
public
intupdateUser(Stringpassword,Stringsex,Stringaihao,Stringzhuanye,Stringphoto,Stringjianjie,Stringname){ Stringsql="updateusersetpassword=?,sex=?,aihao=?,zhuanye=?,photo=?,jianjie=?wherename=?"; Stringparam[]={password,sex,aihao,zhuanye,photo,jianjie,name};
inti=0;
try{ i=this.executeSQL(sql,param); //直接使用父类中的executeSQL方法执行查询
if(i>0){System.out.println("修改用户密码成功!");}
else{ System.out.println("修改用户密码失败!");}}catch(Exceptione){e.printStackTrace();}
returni; }UserDaoImpl类//查找所有的用户信息
publicResultSetfindAllUsers(){ Stringsql="select*fromuser";
try {
conn=this.getConn();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();//执行SQL语句
}catch(Exceptione) { e.printStackTrace(); }
return
rs; } UserDaoImpl类publicResultSetfindName(Stringname){ Stringsql="select*fromuserwherename=?";
try {
conn=this.getConn();
ps=conn.prepareStatement(sql);
ps.setString(1,name);
rs=ps.executeQuery();//执行SQL语句
}catch(Exceptione) { e.printStackTrace(); }
return
rs; }publicResultSetfindName(Stringname){ Stringsql="select*fromuserwherename=?";
try {
conn=this.getConn();
ps=conn.prepareStatement(sql);
ps.setString(1,name);
rs=ps.executeQuery();//执行SQL语句
}catch(Exceptione) { e.printStackTrace(); }
return
rs; }UserDaoImpl类packageutil;importjava.sql.ResultSet;importjava.sql.SQLException;public
classTest{
public
static
voidmain(String[]args){ UserDaouser=newUserDaoImpl(); user.userLogin("bb","22");//用户登录 ResultSetrs=user.findAllUsers();
try{
while(rs.next()){ System.out.println("用户名:"+rs.getString(1)); System.out.println("密码:"+rs.getString(2)); } }catch(SQLExceptione){ e.printStackTrace(); } user.insertNewUser("dd","44","男","运动,读书","软件技术","big.png","他是一个上进有远大理想的好学生!"); user.updateUserPassword("12345","aa"); user.updateUser("8888","女","读书,音乐","软件2101","big.png","","苏州托普学院"); user.deleteUser("cc");//删除用户 }}UserDaoImpl类8.4使用JDBC技术实现用户登录、注册及修改4.3前台实现任务一:创建用户登录和用户验证页面用户验证页面:dlyz.jsp
<body>
<% request.setCharacterEncoding("utf-8"); Stringname=request.getParameter("username"); Stringmima=request.getParameter("mima"); UserDaouser=newUserDaoImpl();ResultSetrs=user.userLogin(name,mima);
if(rs.next()){ response.sendRedirect("zhuye.jsp"); }
else{ out.println("<center><h1>用户名或密码有误,请重新输入!</h1></center>");
%>
<%@include
file="denglu.jsp"
%>
<%
}
%>
</body>8.4使用JDBC技术实现用户登录、注册及修改登录失败页面8.4使用JDBC技术实现用户登录、注册及修改登录成功进行主页8.4使用JDBC技术实现用户登录、注册及修改任务二:创建用户注册和注册验证页面用户注册验证页面:zcyz.jsp
<body>
<%
request.setCharacterEncoding("utf-8"); Stringusername=request.getParameter("username"); Stringmima=request.getParameter("mima"); Stringsex=request.getParameter("sex"); String[]aihao=request.getParameterValues("aihao"); Stringstr="";
if(aihao!=null){
for(inti=0;i<aihao.length;i++){ str=str+aihao[i]+","; } } Stringzhuanye=request.getParameter("zhuanye"); Stringphoto=request.getParameter("photo"); Stringjianjie=request.getParameter("jianjie"); 用户注册验证页面:zcyz.jsp
UserDaouser=newUserDaoImpl(); ResultSetrs=user.findName(username);
if(rs.next()){ out.println("<center><h1>用户名已存在,请重新注册!</h1></center>");
%>
<%@include
file="zhuce.jsp"
%>
<% }
else{
inti=user.insertNewUser(username,mima,sex,str,zhuanye,photo,jianjie);
if(i>0){ out.println("<center><h1>注册成功,请登录!</h1></center>");
%>
<%@include
file="denglu.jsp"
%>
<% }
else{ out.println("<center><h1>注册失败,请重新注册!</h1></center>");
%>
<%@include
file="zhuce.jsp"
%>
<% } }%>
</body>用户注册验证页面:zcyz.jsp如果用户名存在,运行效果如图用户注册验证页面:zcyz.jsp如果用户名不存在,则注册成功,进行登录,运行效果图如图8.4使用JDBC技术实现用户登录、注册及修改任务三:创建修改用户密码及其验证页面修改用户信息验证页面:passyz.jsp
<body><% request.setCharacterEncoding("utf-8"); Stringname=request.getParameter("username"); Stringmima=request.getParameter("mima"); UserDaouser=newUserDaoImp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海健康医学院《税收筹划》2025-2026学年期末试卷
- 上海兴伟学院《行为金融学》2025-2026学年期末试卷
- 苏州工学院《物权法》2025-2026学年期末试卷
- 上海东海职业技术学院《解剖学基础》2025-2026学年期末试卷
- 上海邦德职业技术学院《康复功能评定》2025-2026学年期末试卷
- 锡林郭勒职业学院《房地产开发与管理》2025-2026学年期末试卷
- 沈阳农业大学《社会主义经济理论》2025-2026学年期末试卷
- 上海中华职业技术学院《小学班队原理与实践》2025-2026学年期末试卷
- 上海出版印刷高等专科学校《社会工作原理》2025-2026学年期末试卷
- 石家庄科技职业学院《人际传播与沟通》2025-2026学年期末试卷
- 锅炉房设备安装施工组织设计d
- 2022-2022年全国I II卷高考英语语法填空真题及答案
- 几种典型地震相特征new演示文稿
- 影响穿筘质量的因素
- 传染病学 第16讲细菌性痢疾
- 管道的土方开挖施工方案设计
- 烟草专卖管理师二级专业能力试卷及答案
- GB/T 32125-2021工业废盐酸的处理处置规范
- GB/T 31391-2015煤的元素分析
- GB/T 27065-2015合格评定产品、过程和服务认证机构要求
- GB/T 23290-2009机床安全卡盘的设计和结构安全要求
评论
0/150
提交评论