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