二、SQL注入使用占位符解决、JDBC工具类、封装
一、SQL注入使用占位符解决
//使用jdbc发送sql语句, 到数据库tb_user 查询是否有该用户名和密码的用户Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false";conn = DriverManager.getConnection(url,"root","123");String sql ="SELECT * FROM tb_user WHERE username = ? AND PASSWORD = ?";pstmt = conn.prepareStatement(sql);
//给?赋值pstmt.setString(1,username);pstmt.setString(2,password);
//PreparedStatement 调用executeQuery() executeUpdate() 无参rs = pstmt.executeQuery();return rs.next();} catch (Exception e) {e.printStackTrace();// throw new RuntimeException(e);}finally {try {if(rs != null) rs.close();if(pstmt != null) pstmt.close();if(conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}return false;
二、ResultSet
加载驱动类
获取连接
编写sql select
创建Statement对象
执行之,并接收结果 executeUpdate(sql) executeQuery(sql)
如果查询, 解析ResultSet
关闭资源
1.移动行指针: ResultSet 的boolean next()
2.提供一堆:Xxx getXxx() Xxx: 数据类型名: getString() getInt() getLong() getObject()...
3.close() 关闭ResultSet
三、JDBC工具类
数据库四大参数 放在db.properties文件中
Map的实现类: java.util.Properties类
load(输入流) 把指定的properties文件的数据加载到Properties集合中
四、封装
Dao层模式
jdbc代码操作数据库, 比如CURD, 全部写在main, 肯定不行
对jdbc的代码进行封装, 开发中. jdbc代码封装在dao层(数据访问层)
层: 一个包
表 --> 类
列--> 属性
一行记录-->一个对象
多行记录--> 多个对象: List<对象>
表: tb_user表 User类 UserDao(封装了对tb_user增删改查)
tb_emp表 Emp类 EmpDao(封装了对tb_emp增删改查)
对应数据库表的类: pojo类, entity类(实体类)
UserDao 接口
|-- UserDaoImpl 实现类
EmpDao 接口
|-- EmpDaoImpl 实现类
pojo类的要求:
属性必须私有的,
属性的数据类型必须包装类
属性的日期类型: java.util.Date
属性名必须遵循小驼峰命名法
列名: stu_name --> 属性名 : stuName
如果手动添加了构造方法, 一定添加一个无参构造方法
db.properties
#驱动类全限定名 driverClass = com.mysql.jdbc.Driver #jdbc的url url = jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false #用户名 username = root #密码 password = 123
五、单元测试
UserDaoImpl类包含多个方法
对方法进行测试: 单元测试,
传统方式: main方法测试
缺点: 1.测试结果靠人工判断, 输出结果判断
2. 一个类只能有一个main()方法,测试方法写在一起,不方便单元测试
基于junit单元测试
步骤: 1.导入junit依赖: junit3 淘汰了 junit4(使用) junit5(最新的)
3编写测试类 取名的规范: 被测试类类名Test, idea 可以自动创建测试类
常用的注解:
@Test 标记在测试方法上面,表示该方法是一个测试方法, 直接运行
junit4测试方法的要求:
测试方法必须为public
测试方法的返回值类型必须为void
测试方法必须是无参的
@Before 标记的方法,表示该方法在@Test标记的方法之前执行
@After标记的方法,表示该方法在@Test标记的方法之后执行
六、事务
实际开发中一个业务功能可能执行的sql语句多条, 有一种策略: 一组sql语句要就全部成功,要就全部失败 这种策略:称为事务
同一个事务下的所有的sql语句,要就全部成功,要就全部失败
dao类一个方法只执行一条sql, 业务类中, 一个方法执行多条sql(调用多个Dao类多个方法),
实际开发中: 事务加在业务层
事务四大特性: ACID
事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称ACID
① 原子性 事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败
任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成
② 一致性(Consistency) 事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱
③ 隔离性 行锁 事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的
④ 持久性(Duration) 事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
mysql: 默认自动提交的
执行完一条DML(增删改)的sql, 自动提交事务
事务结束:
事务提交
事务回滚
二、SQL注入使用占位符解决、JDBC工具类、封装相关推荐
- JavaWeb篇之二------sql注入的原理和解决方法(预编译)
引言 在上一篇最末,我展示了sql注入现象,接下来我们来探究sql注入的本质原理 Sql注入及解决方法 我们打个断点,debug调试一下(不清楚代码的可以看上一篇) 我们可以看到"泊进之介& ...
- PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决
PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决 参考文章: (1)PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决 (2)ht ...
- sql注入漏洞与如何解决
关于sql注入漏洞 这个问题说白了其实很简单,就是因为sql语句使用拼接字符串导致的 举例 String sql="SELECT * FROM userdata WHERE user=&qu ...
- JDBC 快速入门JDBC 抽取JDBC工具类:JDBCUtils
文章目录 JDBC 快速入门JDBC 抽取JDBC工具类:JDBCUtils JDBC 概念:java database Connectivity java 数据库连接,java语言操作数据库 JDB ...
- java jdbc工具类抽取_JavaWeb入门(三):JDBC工具类的抽取
一.通过上篇文章,我们已经可以使用JDBC对数据库中的表进行增删改查啦(JDBC的基本使用:https://www.cnblogs.com/Infancy/p/12499806.html),我们对上篇 ...
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- jdbc工具类2..0
一.创建外部文件 url=jdbc:mysql:///qy66 use=root password=root driver=com.mysql.jdbc.Driver 二.创建工具类 package ...
- 抽取JDBC工具类:JDBCUtils
## 抽取JDBC工具类:JDBCUtils * 目的:简化书写 * 分析:1.注册驱动也抽取2.抽取一个方法获取连接对象 * 需求:不想传递参数(麻烦),还得保证工具类的通用性 * 解决:配置文件j ...
- MySQL笔记 —— jdbc工具类(网站的修改密码,注册账号,注销账号功能)
在之前的这篇博客里面MySQL笔记 -- jdbc连接数据库(增删改查,sql注入,网站登录检查) 写了网站登录检查的代码,通过将用户输入的用户名和密码与数据库中存储的用户名和密码进行比较,如果一致则 ...
最新文章
- 2018年澳门就业情况理想 最新失业率维持1.7%
- linux+mysql高并发测试_MySQL压力测试shell脚本
- 配置树莓派linux的内核和编译并将镜像拷贝至树莓派
- git 拉取远端仓库_git命令-远程仓库拉取、本地仓库更新、工作空间提交等等
- 网络主机和交换机端口位置的有效定位方法
- centos7 java程序突然停止运行没有报错日志_CentOS7.5安装zookeeper3.4.10
- 现代编译原理——第五章:活动记录
- slf4j-api slf4j-log4j12以及log4j之间的关系
- todo: 网口驱动
- 将keras的模型封装成可转换为tensorlow的.pb格式,并生成.pbtxt文件
- Eclipse安装漂亮的Darkest Dark Theme主题步骤(超详细)
- 有道智云实时语音翻译服务全新上线,86+语言实时翻译!
- 国际贸易术语解释通则(EXW 工厂交货…(指定地点))
- 分治算法之循环赛程日志表
- 基于android的教育机构家校通系统app
- VPP线程之间报文调度
- CF 371D Vessels 【并查集】
- 5.9.1_P163《C++ Primer Plus (6th)》编程练习 答案
- html圈c转义符,C 实用教程
- 全景软件:探索数据基因,提升企业数据效能
热门文章
- 商标被驳回还可以再注册吗?
- 三星s6android7.0root,三星S6 root教程_三星GALAXY S6获取root权限的方法
- 了解CSS in JS(JSS)以及在React项目中配置并使用JSS
- 从“新”出发 CVS2019招展进行中
- opencv实现任意形状的内切圆
- 一文搞懂线程池原理——Executor框架详解
- 跳板攻击原理及如何追踪定位攻击者主机(下)
- 区块链游戏开发多少钱 元宇宙链游开发 深圳链游开发
- 学C语言办公本和游戏本,游戏本和办公本的区别在哪
- macbook上网没问题但是无法连接到app store的解决办法