**JDBC的简介和快速入门**
**JDBC的简介**
1.MySQL驱动包(JDBC接口的实现类,就是一个jar包)。
2.JDBC是SUN公司提出一套规范,就是一组接口。这写接口的实现类是由各个数据库的生产商提供的。
3.JDBC的快速入门的开发有一些的开发步骤
**快速入门**
1.把MySQL驱动包导入到工程中。
2.创建数据库和表结构,手动添加数据。查询的快速入门。
create database day17;
use day17;
create table t_user(
id int primary key auto_increment,
username varchar(30),
password varchar(30)
);
insert into t_user values (null,'美美','123');
insert into t_user values (null,'聪聪','456');
insert into t_user values (null,'aaa','789');
insert into t_user values (null,'bbb','111');
3.可以编写java代码。
**讲解类和接口**
**DriverManage类**
1.注册驱动
* DriverManager.registerDriver(new Driver());
* 其实这个方法有两点不好
* 过于依赖MySQL驱动包。
* 注册驱动的代码实际上执行了2次。
* 想使用一种方式解决上述两个问题。
* Class.forName("com.mysql.jdbc.Driver");
2.获取链接对象
* Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "root");
* url -- 数据库的链接地址
* jdbc:mysql://localhost:3306/day17
* jdbc :数据库之间传输数据的协议
* mysql :jdbc协议的子协议。
* localhost :服务器的地址
* 3306 :默认的端口号
* day17 :数据库的名称
* 注意:如果你要链接你自己电脑上的数据库,简写的方式
* jdbc:mysql:///day17
* user -- 用户名
* password -- 你的数据库的密码
**Connection对象(链接)**
1.创建执行SQL语句的对象
* Statement createStatement() -- 获取执行SQL语句对象
* PreparedStatement prepareStatement(String sql) -- 获取执行SQL语句对象,预编译SQL语句,防止SQL注入
* CallableStatement prepareCall(String sql) -- 获取执行SQL语句对象,执行存储过程
2.管理事物
* 事物:一组逻辑上的操作。
* void setAutoCommit(boolean autoCommit) -- 设置事物自动提交
* void commit() -- 提交事物
* void rollback() -- 回滚事物
**Statement对象**
1.执行SQL语句
* ResultSet executeQuery(String sql) -- 执行查询语句(select语句)
* int executeUpdate(String sql) -- 执行增删改的操作(insert update delete)
* boolean execute(String sql) -- 执行任意的sql(如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false )
2.执行批处理
* 可以一批插入或者删除数据。(表格)
* void addBatch(String sql) -- 把SQL语句添加批处理中
* int[] executeBatch() -- 执行批处理
* void clearBatch() -- 清除批处理
**ResultSet对象**
1.执行查询语句,才有结果集。
2.游标的默认位置在第一行数据之前
3.调用rs.next()方法,游标判断是否有下一行数据,如果有,移动到下一行。可以通过getXXX()方法获取该行的数据。
4.游标默认只能向下移动,如果滚动,可以设置滚动的结果集。
5.getXXX() 这些方法都是重载的int(字段的位置) String(字段的名称)
6.getObject() 获取任意类型的数据(强转)
**设置滚动的结果集(了解)**
1.如果想使用滚动结果集,需要该方法来生成Statement对象
* Statement createStatement(int resultSetType, int resultSetConcurrency)
* resultSetType -- 结果集类型
* resultSetConcurrency -- 结果集并发策略
* 结果集的类型
* TYPE_FORWARD_ONLY -- 只能向下
* TYPE_SCROLL_INSENSITIVE -- 可以滚动,不能修改
* TYPE_SCROLL_SENSITIVE -- 可以滚动,又可以修改
* 结果集并发策略
* CONCUR_READ_ONLY -- 只能读
* CONCUR_UPDATABLE -- 可以修改
* 把类型和并发策略,组合。
* TYPE_FORWARD_ONLY CONCUR_READ_ONLY 默认的结果集,只能向下,不能修改记录
* TYPE_SCROLL_INSENSITIVE CONCUR_READ_ONLY 可以滚动,不能修改记录
* TYPE_SCROLL_SENSITIVE CONCUR_UPDATABLE 可以滚动,也可以修改记录
**释放资源**
1.connection链接对象,晚创建早释放。
2.释放标准的代码
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
**使用JDBC来完成增删改查的操作(必须会写)**
1.操作t_user的表,完成增删改查的功能。
**封装工具类(一直修改)(自己封装)**
1.封装的过程。
**介绍DAO模式**
DAO模式就是持久层的一种解决方案,封装对于数据源及其数据的单个操作,需要提供一组接口,供业务层访问,业务调用DAO的代码时候需要传递一个对象。
**重写登陆的案例**
1.搭建环境
2.导入jar包(MySQL驱动包,BeanUtils包,JSTL的包)
3.代码编写
**SQL注入的问题(漏洞)**
1.在文本框输入一些特殊的字符,在已知用户名的情况下,输入用户登陆进去。
2.xxx ' or ' 1=1 或者 xxx ' –- (注意' -- 后有一个空格)
3.咱们编写的SQL语句 select * from t_user where username = '' and password = '';
* select * from t_user where username = 'bbb ' or ' 1=1 ' and password = '任意'; (and 和 or中,and的优先级高)
* select * from t_user where username = 'bbb ' -– ' and password = '';
4.根本原因就是因为拼接了参数。
5.解决这种问题
* 前台校验
* 后台的验证(使用PreparedStatement对象)
6.PreparedStatement来完成操作
* 编写SQL语句,SQL语句的参数使用?代替
* 预编译SQL语句 conn.prepareStatement(sql)
* 设置参数的真正的值 stmt.setString(1,值) 1:代表?的位置
* 执行SQL(不用传入SQL语句)
**封装单个表的操作**
1.必须会写
**Text Blob大数据(了解)**
在实际开发中,程序需要把大文本 Text 或二进制数据 Blob保存到数据库。
Text是mysql叫法,Oracle中叫Clob
基本概念:大数据也称之为LOB(Large Objects),LOB又分为:
clob和blob
clob用于存储大文本。Text
blob用于存储二进制数据,例如图像、声音、二进制文等。
对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为:
TINYTEXT(255)、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)
TINYBLOB(255)、BLOB(64k)、MEDIUMBLOB(16M)和LONGBLOB(4G)
1.创建数据库的表结构
create table mytext(
id int primary key auto_increment,
mydata MEDIUMTEXT
);
create table myblob(
id int primary key auto_increment,
mydata MEDIUMBLOB
);
**批处理(了解)**
1.批量插入和批量删除。
Statement对象中的:
* void addBatch(String sql) -- 把SQL语句添加批处理中
* int[] executeBatch() -- 执行批处理
* void clearBatch() -- 清除批处理
* insert into xxx values (null,"值"); 如果使用Statement对象执行SQL语句。
* insert into xxx values (null,?); 先发送SQL到服务器端,预编译。设置值。使用PreparedStatement对象
create table mybatch(
id int primary key auto_increment,
name varchar(20)
);