一、概述
1、JDBC
全称:java dataBase Connectivity java语言连接数据库
JDBC实质是一个接口, 用来连接JVM和数据库的接口(SUN公司制定的一套接口)
2、作用
将数据库与JVM建立连接,利用java语句动态操作数据库
而不是用sql本身语言进行增删改查,拓宽了数据库的使用范围,
同时为java操作提供了存储数据的空间
3、优点:
面向接口编程--解耦合,降低程序的耦合度,提高程序的扩展力
4、为什么指定一套JDBC的接口?
因为每个数据库的底层实现原理都不一样,为了统一接口实现 (桥接模式)
SUN公司定义一套固定的JDBC接口,哪个数据库需要连接,则这个数据库的厂家则实现接口
SUN公司:接口的编写者(提供者)
数据库厂家:接口的实现者
Java程序员:接口实现类的调用者(利用接口连接数据库,实现相应的功能)
二、JDBC连接数据库的步骤
1、注册驱动
告诉JVM即将要连接的是哪个品牌的数据库
一般方式:
(1)java.sql.Driver driver=new com.mysql.jdbc.Driver(); //获取驱动
DriverManager.registerDriver(driver);//注册驱动
(2)DriverManager.registerDriver(new com.mysql.jdbc.Driver());
类加载方式:
Class.forName(”com.mysql.jdbc.Driver“)
2、建立连接
表示JVM的进程和数据库的进程之间的通道打开了
属于进程之间的通信,重量级的,使用之后要关闭
String url=”jdbc:mysql://localhost:3306/要连接的数据库名 “ ;
String user=”root“;
String password=”数据库对应密码“;
Connection conn=DriverManager.getConnection(url,user,password);
3、获得连接对象
数据库操作对象,用来执行sql语句的对象
Statement stmt=conn.createStatement();
4、执行sql语句
连接对象调用sql语句
DML:增删改
String sql=“sql语句”;
int cout=stmt.executeUpdate(sql);//DML语句(insert update delete)
DQL:查询
ResultSet rs=stmt.executeQuery(sql);
5、处理查询
只有4执行的是select语句的时候才有这一步
while(rs.next()){
String 表的第1列名=rs.getString(1); //法1:根据对应列数取
String 表的第1列名=rs.getString(”第1列名“);//法2:根据列名取
int 表的第1列名=rs.getInt(”第1列名“); //法3:根据数据类型取
}
6、释放资源
finally{ conn.close();}
三、Statement和PrepareStatement--sql注入
1、Statement---存在sql注入问题
Statement stmt=conn.createStatement();
String sql=“selsct * from user where LogName=‘ ”+logName+“ ’ and logPwd=‘ ”+logPwd+“ ’ ”;//字符串拼接方式
ResultSet rs=stmt.executeQuery(sql);
if(rs.next()){登录成功}
2、 PrepareStatement--预编译,解决sql注入问题
String sql=“select * from t where logName=? and logPwd=? ”//利用占位符
PrepareStatement pst=conn.PrepareStatement(sql); //预编译
pst.setString(1,logName);
pst.setString(2,logPwd);
ResultSet rs=pst.executeQuery();
if(rs.next()){登录成功}
解决sql注入问题的关键:
用户提供的信息中即使含有sql语句关键字,但是这些关键字并没有参与编译,不起作用。
【注】
1、字符串中拼一个变量口诀:两个双引号两个+号
“select * from t where loginName=' "+loginName+" ' and loginPwd=' "+loginPwd+" ' ”
2、sql注入问题
当用户输入的用户名和密码为这样时:
用户名:aa
密码:aa‘ or '1'=1
即使数据库中没有这个用户,也能登录成功
3、导致sql注入的原因:
用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的原意被修改,进而达到sql注入
如:
原sql语句 “select * from t where loginName=' "+loginName+" ' and loginPwd=' "+loginPwd+"' ”
输入 用户名:aa 密码:aa‘ or '1'=1后
sql语句变为:“select * from t where loginName=' aa' and loginPwd=' aa‘ or '1'=1' ”
其中'1'=1' 是永远正确的,所以可以查到所有
四、JDBC事务
1、JDBC的事务机制-- 自动提交
JDBC只要执行任意一条DML语句就提交一次,不会等整个程序执行完才提交,不符合实际生活中的业务需求
2、手动设置提交事务
(1)修改为手动提交
conn.setAutoCommit(false);//开启事务
(2)整个事务完成后,手动提交
conn.commit(); //提交事务
(3)出现异常,事务手动回滚
conn.rollback();//回滚事务
3、事务类型
单机事务----在同一个数据库中操作数据
----多个DML语句都操作成功,才能成功,多个DML在一个事务中
多机分布式事务-----数据库不止一个,数据库是集群形式的,在不同数据库中操作数据
----多个数据库都操作成功,才能成功,多个数据库在一个事务中
五、url补充
1、url:统一资源定位符
网络中某个资源的绝对路径
例:https://www.baidu.com
2、url组成部分
http://182.61.200.7:80/ index.html
通信协议: http://
服务器IP地址: 182.61.200.7 (某台计算机的代号)
port 端口号: 80 (计算机某个软件的代号,数据库一般为3306,java程序一般为80)
资源名: index.html
jdbc:mysql://localhost:3306/bjpowernode
访问:本机上名为bjpowernode的数据库
3、本机IP地址:
localhost
127.0.0.1