jdbc随堂笔记
来源:互联网 发布:记录键盘输入的软件 编辑:程序博客网 时间:2024/05/24 05:31
1学生信息表studentinfo
SID NAME
学生号 学生
---------- --------------------
1 王无
2 李远
3 张名
4 赵家
5 张花
create table studentinfo(
sid int primary key,
name varchar(20)
)
insert into studentinfo values(1,'王无');
insert into studentinfo values(2,'李远');
insert into studentinfo values(3,'张名');
insert into studentinfo values(4,'赵家');
insert into studentinfo values(5,'张花');
=============================================================
2考试情况表testresult
SID KID RESVALUE
学生号 科目号 成绩
---------- ---------- ----------
1 1 80
1 2 78
1 3 90
2 1 89
2 2 56
2 3 68
4 2 79
4 3 90
create table testresult(
sid int ,
kid int,
resvalue int,
foreign key (kid) references itemcode(kid),
foreign key (sid) references studentinfo(sid)
)
insert into testresult values(1,1,80);
insert into testresult values(1,2,78);
insert into testresult values(1,3,90);
insert into testresult values(2,1,89);
insert into testresult values(2,2,56);
insert into testresult values(2,3,68);
insert into testresult values(4,2,79);
insert into testresult values(4,3,90);
===================================================================
3科目代码表itemcode
KID NAME
科目号 科目名
---------- --------------------
1 数学
2 语文
3 英语
create table itemcode(
kid int primary key,
name varchar(20)
)
insert into itemcode values(1,'数学');
insert into itemcode values(2,'语文');
insert into itemcode values(3,'英语');
----------------------------------------------------------
问题:
一 检索出各个学科的最高分和最底分。如下:
科目 最高分 最低分
---- ---------- ----------
数学 89 80
语文 79 56
英语 90 68
select
itemcode.name,max(resvalue),min(resvalue)
from
testresult,itemcode
where
testresult.kid=itemcode.kid
group by
testresult.kid;
------------------------------------------------------------------
二显示每个人的考试成绩
NAME 数学 语文 英语
-------------------- ---------- ---------- ----------
李远 89 56 68
王无 80 78 90
张花 0 0 0
张名 0 0 0
赵家 0 79 90
SELECT * FROM studentinfo;
SELECT * FROM testresult;
SELECT * FROM itemcode;
得到每一个学生的姓名与各科成绩
SELECT
studentinfo.name,itemcode.name,testresult.resvalue
FROM
studentinfo,itemcode,testresult
WHERE
studentinfo.sid=testresult.sid
AND
itemcode.kid=testresult.kid;
改变
SELECT
DISTINCT
studentinfo.name,
IFNULL((SELECT resvalue FROM testresult WHERE kid=1 AND testresult.sid=s.sid),0) AS '数学',
IFNULL((SELECT resvalue FROM testresult WHERE kid=2 AND testresult.sid=s.sid),0) AS '语文',
IFNULL((SELECT resvalue FROM testresult WHERE kid=3 AND testresult.sid=s.sid),0) AS '英语'
FROM
studentinfo LEFT OUTER JOIN
(SELECT
testresult.kid,testresult.sid
FROM
testresult,itemcode
WHERE
testresult.kid=itemcode.kid
) s
ON
studentinfo.sid=s.sid
ORDER BY
数学 DESC,语文 ASC;
=================================================================================================
今天内容:
jdbc
1.jdbc了解
2.jdbc api
3.jdbc示例 登录操作
4.批处理
5.大数据处理
------------------------------------------------------------------------------------------
1.什么是jdbc,jdbc作用?
1 JDBC全称为:Java DataBase Connectivity(java数据库连接)。
2 SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。
jdbc帮助我们程序可以列简单的连接数据库。
驱动: 两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信.
2.jdbc快速入门
create table user(
id int primary key auto_increment,
username varchar(20) unique not null,
password varchar(20) not null,
email varchar(40) not null
);
insert into user values(null,'tom','123','tom@163.com');
insert into user values(null,'fox','456','fox@163.com');
insert into user values(null,'james','789','james@163.com');
步骤:
1.导入驱动
2.编写连接数据代码
jdbc操作涉及到的API
java.sql
javax.sql
涉及到的类与接口
1.DriverManger 驱动程序经理
2.Connection 连接
3.Statement 声明
4.ResultSet 结果集
5.DataSource 数据源
连接数据,进行操作步骤:
1.通过DriverManager将驱动注册到驱动管理器中。
java.sql.DriverManager
DriverManager.registDriver(java.sql.Driver driver);
在操作时,要连接mysql数据库,真正使用的驱动类是 com.mysql.jdbc.Driver.它是实现了java.sql.Driver接口的一个类。
2.通过DriverManager获取连接Connection
Connection是java.sql.Connection接口。
Connection con=DriverManager.getConnection(String url,String username,String password);
url: jdbc:mysql://localhost:3306/day18 它的主要作用是为了获取驱动对象。
3.通过Connection获取一个Statement对象.
Statement 它是java.sql.Statement接口,得到它,就可以执行sql语句.
Statement st=con.createStatement();
****************************************************
我们在操作中所使用的Connection ,Statement它们都是java.sql包下的接口,
但是真正使用的其实是驱动包下的实现类。
******************************************************
4.通过Statement对象操作sql语句
st.executeQuery(String sql); 它用执行select操作.
st.executeUpdate(String sql) 它用于执行update ,insert,delete操作.
5.通过执行executeQuery得到一个ResultSet
ResultSet它是java.sql.Result接口,它封装了查询sql语句执行后的结果.
得到结果集,对结果集进行操作
ResultSet提供
1.next()
它返回的是一个boolean类型
2.getXxx方法
可以根据类型获取字段值.
参数可以是int类型,代表的是字段的序号。也可以是String类型,代表的是字段的名称
例如:
getInt(1)与 getInt("id")
getString(2)与getString("username");
特殊方法
getObject()
6.释放资源
关闭连接.
ResultSet.close();
Statement.close();
Connection.close();
-----------------------------------------------------------------------------------
细节
1.jdbc加载驱动
DriverManager.registDriver(new com.jdbc.mysql.Driver());
问题:
1.会在DriverManager中注册两个mysql驱动对象。
2.依赖了mysql驱动
解决:
通过反射加载mysql驱动
Class.forName("com.jdbc.mysql.Driver");
2.关于url问题
url它的作用是就让DriverManager可以找到数据库的驱动
jdbc:mysql://localhost:3306/day18
如果连接的是本机上的mysql,并且端口是默认的3306
可以简写成: jdbc:mysql:///day18
3.异常处理与资源释放
对于释放资源,要先关闭 ResutlSet,Statement,Connection。
并且它们要在finally中完成,每一个在调用close方法前,先判断是否为空。
4.Statement的executeUpdate方法.
它是用于执行update,insert,delete语句的。
返回值是int类型,代表的是对数据库中的数据影响的行数.
=========================================================================================
jdbc---crud
1.抽取工具:
分析:抽取到Statement,不合适:
对于Statement它有两个子接口,CallableStatement, PreparedStatement
在开发中,有可能会根据情况,来使用这些子接口。
例如:调用存储过程 CallableStatement
PreparedStatement,它可以执行预处理sql.
比较适合的操作是得到Connection对象.
2.read操作----select操作
3.
4.
5.
-----------------------------------------------------------------
关于Connection,Statement细节
Connection它是一个连接对象,通过它可以获取操作sql语句的Statement对象。
Connection作用:
1.得到操作sql语句的对象 Statement,PreparedStatement,CallableStatement
2.可以操作事务
setAutoCommit(); 开启事务
commit() 提交事务
rollback(); 事务回滚
Statement对象
用于执行sql语句.
Result executeQuery(String sql) 执行select
int executeUpdate(String sql) 执行 insert updat delete操作
execute(String sql)它可以执行任意sql语句.
它还可以执行批处理
addBatch(String sql)
executeBatch();
ResultSet
对于数据库中字段如果是varchar类型,但是它的字段值全是数字,那么可以使用getInt()获取.
如果字段类型是int,在获取时,也可以使用getString(),但是,对于这两种类型数据,我们在开发中,一般不会改变为其类型。
一般情况下我们获取日期时间类型时,使用getString()获取。getDate()获取.
------------------------------------------------------------------------------------------------------
滚动结果集
在创建Statement时可以指定参数
Statement st=con.createStatement(int resultSetType,int resultSetConcurrency);
参数1:它代表结果集类型
参数2:它代表的是并发策略
resultSetType - 结果集类型,它是
ResultSet.TYPE_FORWARD_ONLY、
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency - 并发类型;它是
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
在做滚动结果集时,一般情况下使用的是
ResultSet.TYPE_SCROLL_SENSITIVE ResultSet.CONCUR_UPDATABLE
next():移动到下一行
previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面
afterLast() :移动到resultSet的最后面
updateRow() :更新行数据
=================================================================================================================
PreparedStatement
它是可以进行预处理Statement对象.
登录操作:
login.jsp
LoginServlet
登录成功 跳转到success.jsp
失败 login.jsp
我们可以输入一个错误的信息也可以登录成功
查询时报sql语句
select * from user where username='张三' or '1'='1' and password='000';
假设我们知道用户名,不知道密码,我们也可以登录成功
在登录时,只要输入用户名为 张三' or '1'='1 密码可以任意输入,这时就可以登录成功。
这种叫做sql注入.
解决方案:
1.不允许出现直接等值操作.
2.使用PreparedStatement操作.
可以使用占位符"?"来对sql语句中的值进行占位,这样先形成sql语句,在通过赋值对占位符替换。
select * from user where username=? and password=?;
PreparedStatement使用总结:
使用PreparedStatement执行的sql语句中,可以使用?占位
1.获取PreparedStatement对象.
PreparedStatement pst=con.prepareStatement(String sql);
2.在执行前,使用PreparedStatement的setXxx(int index,值),进行赋值
pst.setInt(int index,int value)
pst.setString(int index,String value);
3.调用executeQuery() executeUpdate()执行操作.
注意:没有参数
如果使用的是Statement对象,执行executeQuery(String sql) executeUpdate(String sql);
PreparedStatement优点:
1.防止 sql注入
2.不用在拼串.
=======================================================================================
jdbc使用总结
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.得到Connection对象
Connection con=DriverManager.getConnection("jdbc:mysql:///day18","root","abc");
3.得到操作sql语句的对象
3.1Statement
Statement st=con.createStatement();
ResultSet rs=st.executeQuery(String sql);
int row=st.executeUpdate(String sql)
3.2PreparedStatement
PreparedStatement pst=con.prepareStatement(String sql);
pst.setXxx(int index, 值);
ResultSet rs=pst.executeQuery();
int row=pst.executeUpdate();
4.遍历集合集 ResutlSet
while(rs.next){
rs.getXxx(String colunmname);
}
5.关闭
rs.close();
st.close() pst.close();
con.close();
=================================================================================
大数据处理
mysql中的大数据 text blob
1.blob 大二进制
create table myblob(
id int primary key auto_increment,
msg LONGBLOB
)
1存
setBinraryStream(int index,InputStream is,int length)
2.取
InputStream getBinaryStream(String columnName);
得到的这个输入流就是从结果集读取大二进制的输入流。
2.text 大文本
create table mytext(
id int primary key auto_increment,
msg longtext
)
1.存
setCharacterStream(int index,Reader r,int length);
2.取
Reader getCharacterStream(Sting columnname);
----------------------------------------------------------------------------------
批处理
一次執行多条sql语句
jdbc执行批处理有两种方式
1.Statement
addBatch(String sql);
executeBatch();
2.PreparedStatement
addBatch();
executeBatch();
在使用时,如果执行的是相同的sql语句,推荐使用PreparedStatement
如果是不同的sql语句,使用Statement。
-------------------------------------------------------------------------------------------------
作业:
1.使用PreparedStatement完成CRUD (操作ppt最后一面的Customer表)
2.将登录+注册使用web+service+dao模式,使用jdbc+mysql完成.
0 0
- jdbc随堂笔记
- JDBC随堂笔记
- 【JDBC笔记】JDBC基础知识
- JDBC笔记
- JDBC 笔记
- JDBC笔记
- jdbc笔记
- JDBC 笔记
- JDBC笔记
- JDBC笔记
- JDBC笔记
- jdbc笔记
- JDBC笔记
- JDBC笔记
- jdbc笔记
- JDBC笔记
- JDBC笔记
- JDBC 笔记
- LFS
- new 和malloc 之间的差别
- C++关于文件输入输出的简单操作
- cocos2d jsb 打包 Android APK
- HDU 2159 FATE (完全背包+有限取次)(二重费用背包)
- jdbc随堂笔记
- Iptables防火墙配置
- My97DatePicker日历控制按日、按周和按月选择
- 手机配件信息
- php 字符串截取函数
- OCP-1Z0-051 第154题 集合操作MINUS,INTERSECT
- 第一次写博客,给大家贡献最近看java编程思想里边数据生成器和随机数生成器
- jAVA中静态初始化块、初始化块和构造方法的理解
- 两个Python web框架:Django & Tornado比较