jdbc加强练习.docx
- 文档编号:4295534
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:26
- 大小:64.36KB
jdbc加强练习.docx
《jdbc加强练习.docx》由会员分享,可在线阅读,更多相关《jdbc加强练习.docx(26页珍藏版)》请在冰豆网上搜索。
jdbc加强练习
就业班课程回顾:
第一部XML
XML技术(2天)
--》写XML
--》读XML
第二部分:
JavaWeb开发
Servlet/JSP
相关接口:
HttpServletRequest/response/ServletContext/HttpSession…….
第三部分:
数据库
MySQL数据库
第四部分:
JDBC
JDBC技术:
java数据库连接技术!
接口:
Connection:
连接对象
Statement:
执行命令对象:
把SQL语句发送到数据库执行
ResultSet:
(在线式)结果集接口,必须要保持与数据库的连接!
开发步骤:
1.建项目,引入数据库驱动包
2.加载驱动
Class.forName(..);
3.获取连接对象
4.创建执行sql语句的stmt对象;写sql
5.执行sql
a)更新delete/insert/update
i.executeUpdate();
b)查询select
i.executeQuery();
6.关闭/异常
目标:
1.预编译sql处理(防止sql注入)
2.批处理
3.插入数据,获取自增长值
4.事务
5.Jdbc中大文本类型的处理
6.Jdbc综合练习
明天/后天:
Jdbc技术优化、DbUtils组件、分页、连接池
1.预编译sql处理(防止sql注入)
--创建数据库
CREATEDATABASEjdbc_demoDEFAULTCHARACTERSETutf8;i
--创建表
USEjdbc_demo;
CREATETABLEadmin(
idINTPRIMARYKEYAUTO_INCREMENT,
userNameVARCHAR(20),
pwdVARCHAR(20)
)
|--Statement执行SQL命令
|--CallableStatement,执行存储过程
|--PreparedStatement预编译SQL语句执行
使用预编译SQL语句的命令对象,好处:
1.避免了频繁sql拼接(可以使用占位符)
2.可以防止sql注入
登陆模块,
输入用户名,密码!
注意,
要避免用户输入的恶意密码!
publicclassApp{
//连接参数
//privateStringurl="jdbc:
mysql:
//localhost:
3306/jdbc_demo";
privateStringurl="jdbc:
mysql:
///jdbc_demo";
privateStringuser="root";
privateStringpassword="root";
privateConnectioncon;
privateStatementstmt;
privatePreparedStatementpstmt;
privateResultSetrs;
//1.没有使用防止sql注入的案例
@Test
publicvoidtestLogin(){
//1.0模拟登陆的用户名,密码
StringuserName="tom";
//Stringpwd="8881";
Stringpwd="'or1=1--";
//SQL语句
Stringsql="select*fromadminwhereuserName='"+userName+"'andpwd='"+pwd+"'";
System.out.println(sql);
try{
//1.1加载驱动,创建连接
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection(url,user,password);
//1.2创建stmt对象
stmt=con.createStatement();
//1.3执行查询
rs=stmt.executeQuery(sql);
//业务判断
if(rs.next()){
System.out.println("登陆成功,编号:
"+rs.getInt("id"));
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//1.4关闭
try{
rs.close();
stmt.close();
con.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
//2.使用PreparedStatement,防止sql注入
@Test
publicvoidtestLogin2(){
//1.0模拟登陆的用户名,密码
StringuserName="tom";
//Stringpwd="8881";
Stringpwd="'or1=1--";
//SQL语句
Stringsql="select*fromadminwhereuserName=?
andpwd=?
";
try{
//1.1加载驱动,创建连接
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection(url,user,password);
//1.2创建pstmt对象
pstmt=con.prepareStatement(sql);//对sql语句预编译
//设置占位符值
pstmt.setString(1,userName);
pstmt.setString(2,pwd);
//1.3执行
rs=pstmt.executeQuery();
if(rs.next()){
System.out.println("登陆成功,"+rs.getInt("id"));
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//1.4关闭
try{
rs.close();
pstmt.close();
con.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
2.存储过程调用
--存储过程
--定义分隔符
DELIMITER$$
CREATEPROCEDUREproc_login()
BEGIN
SELECT*FROMadmin;
END$$
--调用
CALLproc_login;
publicclassApp_call{
//全局参数
privateConnectioncon;
privateStatementstmt;
privatePreparedStatementpstmt;
privateCallableStatementcstmt;//存储过程
privateResultSetrs;
//程序中调用存储过程
@Test
publicvoidtestCall()throwsException{
try{
//1.创建连接
con=JdbcUtil.getConnection();
//2.创建执行存储过程的stmt对象
CallableStatementcstmt=con.prepareCall("CALLproc_login");
//3.执行(存储过程)
rs=cstmt.executeQuery();
//遍历结果,测试
if(rs.next()){
Stringname=rs.getString("userName");
Stringpwd=rs.getString("pwd");
//测试
System.out.println(name+pwd);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
3.批处理
很多时候,需要批量执行sql语句!
需求:
批量保存信息!
设计:
AdminDao
Publicvoidsave(List //循环 //保存(批量保存) } Publicvoidsave(Adminadmin){ //循环 //保存 } 技术: |--Statement 批处理相关方法 voidaddBatch(Stringsql)添加批处理 voidclearBatch()清空批处理 int[]executeBatch()执行批处理 实现: Admin.java实体类封装数据 AdminDao.java封装所有的与数据库的操作 App.java测试 publicclassAdmin{ privateStringuserName; privateStringpwd; publicclassApp{ //测试批处理操作 @Test publicvoidtestBatch()throwsException{ //模拟数据 List for(inti=1;i<21;i++){ Adminadmin=newAdmin(); admin.setUserName("Jack"+i); admin.setPwd("888"+i); list.add(admin); } //保存 AdminDaodao=newAdminDao(); dao.save(list); } } //封装所有的与数据库的操作 publicclassAdminDao{ //全局参数 privateConnectioncon; privatePreparedStatementpstmt; privateResultSetrs; //批量保存管理员 publicvoidsave(List //SQL Stringsql="INSERTINTOadmin(userName,pwd)values(? ? )"; try{ //获取连接 con=JdbcUtil.getConnection(); //创建stmt pstmt=con.prepareStatement(sql);//【预编译SQL语句】 for(inti=0;i Adminadmin=list.get(i); //设置参数 pstmt.setString(1,admin.getUserName()); pstmt.setString(2,admin.getPwd()); //添加批处理 pstmt.addBatch();//【不需要传入SQL】 //测试: 每5条执行一次批处理 if(i%5==0){ //批量执行 pstmt.executeBatch(); //清空批处理 pstmt.clearBatch(); } } //批量执行 pstmt.executeBatch(); //清空批处理 pstmt.clearBatch(); }catch(Exceptione){ e.printStackTrace(); }finally{ JdbcUtil.closeAll(con,pstmt,rs); } } } 4.插入数据,获取自增长值 ✓需求: 李俊杰18 张相19 如何设计数据库? 编号员工姓名年龄部门 01李俊杰18开发部 02张三19开发部’ 思考: 如何减少数据冗余? 设置外键约束 所以, 编号员工姓名年龄部门 01李俊杰181 02张三191 部门编号部门名称 1开发部 部门与员工, 一对多的关系 ✓设计数据库: 员工表(外键表)【员工表有一个外键字段,引用了部门表的主键】 部门表(主键表) ✓编码总体思路: 保存员工及其对应的部门! 步骤: 1.先保存部门 2.再得到部门主键,再保存员工 开发具体步骤: 1.设计javabean 2.设计dao 3.测试 部门 CREATETABLEdept( deptIdINTPRIMARYKEYAUTO_INCREMENT, deptNameVARCHAR(20) ); --员工 CREATETABLEemployee( empIdINTPRIMARYKEYAUTO_INCREMENT, empNameVARCHAR(20), dept_idINT--外键字段 ); --给员工表添加外键约束 ALTERTABLEemployeeADDCONSTRAINTFK_employee_dept_deptId FOREIGNKEY(dept_id)REFERENCESdept(deptId); publicclassEmpDao{ privateConnectioncon; privatePreparedStatementpstmt; privateResultSetrs; //保存员工,同时保存关联的部门 publicvoidsave(Employeeemp){ //保存部门 Stringsql_dept="insertintodept(deptName)values(? )"; //保存员工 Stringsql_emp="INSERTINTOemployee(empName,dept_id)VALUES(? ? )"; //部门id intdeptId=0; try{ //连接 con=JdbcUtil.getConnection(); /*****保存部门,获取自增长*******/ //【一、需要指定返回自增长标记】 pstmt=con.prepareStatement(sql_dept,Statement.RETURN_GENERATED_KEYS); //设置参数 pstmt.setString(1,emp.getDept().getDeptName()); //执行 pstmt.executeUpdate(); //【二、获取上面保存的部门子增长的主键】 rs=pstmt.getGeneratedKeys(); //得到返回的自增长字段 if(rs.next()){ deptId=rs.getInt (1); } /*****保存员工*********/ pstmt=con.prepareStatement(sql_emp); //设置参数 pstmt.setString(1,emp.getEmpName()); pstmt.setInt(2,deptId); pstmt.executeUpdate(); }catch(Exceptione){ e.printStackTrace(); }finally{ JdbcUtil.closeAll(con,pstmt,rs); } } } 5.事务 基本概念: 事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。 事务ACID特性 ●原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 ●一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 ●隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 ●持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 事务的特性: 原子性,是一个最小逻辑操作单元! 一致性,事务过程中,数据处于一致状态。 持久性,事务一旦提交成功,对数据的更改会反映到数据库中。 隔离性,事务与事务之间是隔离的。 案例 需求: 张三给李四转账 设计: 账户表 技术: |--Connection voidsetAutoCommit(booleanautoCommit);设置事务是否自动提交 如果设置为false,表示手动提交事务。 voidcommit()();手动提交事务 voidrollback();回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。 ) SavepointsetSavepoint(Stringname) 代码: --账户表 CREATETABLEaccount( idINTPRIMARYKEYAUTO_INCREMENT, accountNameVARCHAR(20), moneyDOUBLE ); --转账 UPDATEaccountSETmoney=money-1000WHEREaccountName='张三'; UPDATEaccountSETmoney=money+1000WHEREaccountName='李四'; publicclassAccountDao{ //全局参数 privateConnectioncon; privatePreparedStatementpstmt; //1.转账,没有使用事务 publicvoidtrans1(){ Stringsql_zs="UPDATEaccountSETmoney=money-1000WHEREaccountName='张三';"; Stringsql_ls="UPDATEaccountSETmoney=money+1000WHEREaccountName='李四';"; try{ con=JdbcUtil.getConnection();//默认开启的隐士事务 con.setAutoCommit(true); /***第一次执行SQL***/ pstmt=con.prepareStatement(sql_zs); pstmt.executeUpdate(); /***第二次执行SQL***/ pstmt=con.prepareStatement(sql_ls); pstmt.executeUpdate(); }catch(Exceptione){ e.printStackTrace(); }finally{ JdbcUtil.closeAll(con,pstmt,null); } } //2.转账,使用事务 publicvoidtrans2(){ Stringsql_zs="UPDATEaccountSETmoney=money-1000WHEREaccountName='张三';"; Stringsql_ls="UPDATE1accountSETmoney=money+1000WHEREaccountName='李四';"; try{ con=JdbcUtil.getConnection();//默认开启的隐士事务 //一、设置事务为手动提交 con.setAutoCommit(false); /***第一次执行SQL***/ pstmt=con.prepareStatement(sql_zs); pstmt.executeUpdate(); /***第二次执行SQL***/ pstmt=con.prepareStatement(sql_ls); pstmt.executeUpdate(); }catch(Exceptione){ try{ //二、出现异常,需要回滚事务 con.rollback(); }catch(SQLExceptione1){ } e.printStackTrace(); }finally{ tr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- jdbc 加强 练习