JDBC开发步骤
1.注册驱动.告知jvm使用的是哪一个数据库的驱动
2.获得连接.使用jdbc中的类完成对mysql的连接,tcp效率低下
3.获得语句执行平台.通过连接对象获得sql语句的执行者对象
4.执行sql语句.使用执行者对象,向数据库执行sql语句,获取到数据库执行后的结果
5.处理结果.
6.释放资源.一堆close();
1.2聚合
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
今天我们学习如下五个聚合函数:
count:统计指定列不为NULL的记录行数;
sum:计算指定列的数值和,如果指定列;
max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串类型不是数值类型,那么计算结果为0排0序运算;
min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
例如:
1. 统计账务表中共有多少条记录
SELECT COUNT(*) FROM zhangwu;
2. 统计账务表中金额大于3000的有多少条记录
SELECT COUNT(*) FROM zhangwu WHERE money>3000;
3. 统计有多少收入的账务信息
SELECT SUM(money) FROM zhangwu WHERE name like '%收入%';
4. 统计出记录中支出的平均值
SELECT AVG(money) FROM zhangwu where name like '%支出%';
5. 统计出商品表中收入的最大与最小值
SELECT MAX(money),MIN(money) FROM zhangwu;
1.3分组
分组查询是指使用group by字句对查询信息进行分组,例如:我们要统计出zhanguw表中所有分类账务的总数量,这时就需要使用group by 来对zhangwu表中的账务信息根据parent进行分组操作。
格式:
SELECT 字段1,字段2… FROM 表名 GROUP BY 字段 HAVING 条件;
分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
having与where的区别:
having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
having后面可以使用分组函数(统计函数)
where后面不可以使用分组函数。
例如:
1. 对账务分种类统计,求出每个种类的账务总金额
SELECT parent,SUM(money) FROM zhangwu GROUP BY parent;
2. 对账务分种类统计,求出每个种类的账务总金额,金额要大于500才显示
SELECT parent,SUM(money) FROM zhangwu GROUP BY parent HAVING SUM(money)>500;
2.5SQL注入问题
假设有登录案例SQL语句如下:
SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;
此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’ OR ‘a’=’a时,则真正执行的代码变为:
SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
为此,我们使用PreparedStatement来解决对应的问题。
2.6API详解:预处理对象
使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement预处理对象代码:
PreparedStatement psmt = conn.prepareStatement(sql)
常用方法:
2.执行SQL语句:
int executeUpdate(); --执行insert update delete语句.
ResultSet executeQuery(); --执行select语句.
boolean execute(); --执行select返回true 执行其他的语句返回false.
3.设置实际参数
void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx类型值。
例如:
setString(2, "家用电器") 把SQL语句中第2个位置的占位符? 替换成实际参数 "家用电器" |
|