1、jdbc是什么?
java database connectivity
sun公司制订的一种通用的数据库访问接口,
该接口由不同的数据库厂商来实现,这样一来,
开发人员可以使用相同的方式来访问不同的数据库。
2、三个重要的接口
1)Connection
2)Statement
3)ResultSet
3、编程步骤
step1, 加载驱动
1)什么是驱动?
由不同的数据库厂商实现jdbc接口对应的
java类压缩之后生成的.jar文件。
也就是说,访问某个数据库,就必须使用
该数据库对应的驱动。
2)驱动要放到build path对应的路径里面。
3)代码:
Class.forName(String classname);
forname方法:jvm依据classname找到
类的字节码文件(.class文件),然后将字节
码文件的内容读到方法区,生成一个
class对象。
step2, 获得连接
Connection conn = DriverManager.
getConnection(String url,String username,
String pwd);
注意:
1)getConnection方法会返回一个符合Connection
接口要求的对象,称之为连接对象。
2)如果连接对象获得了,则表示连接已经建立
成功。
step3,创建Statement
Statement stat = conn.createStatement();
注意:
1) createStatement()方法会返回一个
符合Statement接口要求的对象,该对象
可以理解为一个执行sql的容器。
step4,执行sql
//执行查询
ResultSet rst = stat.executeQuery(String sql);
//执行插入、删除、修改
int stat.executeUpdate(String sql);
注意:
1)executeUpdate方法返回值是一个整数,
表示该sql执行成功之后,受到影响的记录的
个数。
2)executeQuery方法返回的是一个
ResultSet(结果集),需要遍历。
step5, 如果是查询,需要遍历
ResultSet有一个next()方法,每执行一次
该方法,会返回一个true/false,如果值为true,
表示还有记录。
while(rst.next()){
rst.get***方法(比如 getString("name"))
}
step6, 关闭资源
rst.close()
stat.close()
conn.close()
4、mysql的使用
1)登录mysql (以root用户登录mysql)
mysql -uroot;
2)查看当前有哪些数据库
show databases;
3)创建一个新的数据库
//创建了一个名叫jsd1306db的数据库,
//并且设置缺省的字符集为utf8
create database jsd1306db default
character set utf8;
4) 使用某个数据库
use jsd1306db;
5) 查看当前数据库有哪些表
show tables;
6)建表
create table t_user(
id int primary key auto_increment,
username varchar(50),
pwd varchar(30),
age int
)type=innodb;
insert into t_user(username,pwd,age)
values('tom','test',22);
insert into t_user(username,pwd,age)
values('mickey','test',23);
insert into t_user(username,pwd,age)
values('jerry','test',24);
如果是oracle数据库
insert into t_user
values(t_user_seq.nextval,'tom','test',22);
注意:
a, type=innodb: 让该表支持事务。
b, auto_increment: 自增长列,即
由数据库自动为这个列赋值(当插入
记录时,数据库会生成一个唯一的值)。
练习:
使用jdbc访问oracle数据库上的一张表
(t_user表),输出该表中所有的记录。
5、sql注入(了解)
所谓"sql注入",指的是一些用户可以通过输入一些
刻意构造的参数来改变sql语句的结构,从而达到
破坏系统的目的。比如,非法登录。
6、PreparedStatement接口 (预编译的Statement)
预编译的Statement有两个优点:
优点1: 防止sql注入,因为sql语句会在执行之前
先发送给数据库,数据库会生成执行计划。这个
sql语句不会因为后面给参数赋值而改变。
优点2: 执行多个结构相同的sql效率要高于
Statement。
1、DAO(Data access object 数据访问对象)
(1)什么是DAO
封装了数据访问逻辑的模块。
(2)如何写一个DAO?
step1, 写一个实体类
实体类与表对应,是为了方便实现对表中的记录
进行访问而设计的一个简单的java类。
step2, 写一个DAO类,在该类里面,
提供相应的数据访问方法。
2、如何控制事务
(1)什么是事务?
将多个操作当做一个原子操作来进行,要么
全部成功,要么全部失败。
(2)事务的四个特性
a, 原子性:多个操作要当做一个整体来进行,要么
全部成功,要么全部失败。
b,一致性:事务不管成功还是失败,不应该破坏
完整性约束(比如,主键不能为空)。
c,隔离性:多个并发的事务不应该相互影响。
d,持久性:事务成功之后,结果应该永久保存。
(3)jdbc当中,如何控制事务。
//禁止自动提交
//默认情况下,jdbc驱动会自动提交事务。
conn.setAutoCommit(false);
//提交事务
conn.commit();
//回滚事务
conn.rollback();
3、批处理
(1)什么是批处理?
将多个要执行的sql语句一次性地发送给数据库去执行。
(2)如何批处理?
addBatch(): 将要执行的参数添加到PreparedStatement
对象上。
executeBatch(): 将PreparedStatement对象上保存的
参数发送到数据库,然后一次性地执行多条sql语句。
clearBatch(): 清空PreparedStatement对象上保存的
参数。
1、事务的封装
"买股票"
step1, 建表
create table t_account(
id int primary key auto_increment,
accountNo varchar(16) unique,
balance int
)type=innodb;
create table t_stock(
id int primary key auto_increment,
stockCode varchar(6) unique,
qty int
)type=innodb;
insert into t_account(accountNo,balance)
values('6225881003192000',1000);
insert into t_stock(stockCode,qty)
values('600015',0);
unique:唯一性约束
step2, 实体类
Account类
Stock类
step3,DAO
AccountDAO
StockDAO
step4, StockService
1)事务应该由业务类来控制
比如,买股票涉及到对资金帐户和股票帐户的操作
(AccountDAO和StockDAO),那么,事务应该由
业务类StockService来控制。
2) Threadlocal (线程局部变量)
a, Threadlocal是什么
为每一个使用某个变量的线程维护一个
该变量值的副本。
b, 什么时候使用Threadlocal
如果一个线程调用了多个方法,要在多个方法
之间共享相同的数据,可以考虑使用Threadlocal。
比如:买股票这个案例当中,一个线程
需要调用AccountDAO,StockDAO的多个方法,
为了控制事务,需要这些方法共享同一个Connection
对象。
2、分页
(1)什么是分页
就是依据两个参数(每页多少条记录,
第几页)查询数据库,返回有限的记录。
(2)为什么要分页
如果不分页,当数据库中的记录很多,
那么一次性地查询所有记录,会严重
影响系统的性能。
(3)如何分页?
mysql:
select * from t_user limit ?,?
其中,第一个参数表示记录的序号(从0开始)
第二个参数表示每页多少条记录。
oracle:
select * from
(select a.*,rownum rn
from
(select * from t_user) a
where rownum < ?)
where rn > ?
public List<User> findAll2(int rowsPerPages,
int pages);
int start = rowsPerPages * (pages - 1) + 1;
int end = start + rowsPerPages;
prep.setInt(1, end);
prep.setInt(2,start);
prep.executeQuery();
1、xml是什么 (可扩展的标记语言)
(1)是一种基于文本的通用的数据保存格式
a,通用
使用xml格式保存的数据,是与平台无关的。
也就是说,所有的语言都支持xml。
比如,我们可以使用java语言将一个对象(
Point)保存到一个xml文件里面,另外一个用
c语言写的程序,可以很方便地读取这个xml文件。
b,数据保存格式
xml使用标记加内容的方式来保存数据。
比如:
<point>
<x>10</x>
<y>20</y>
</point>
(2)发展历史
html (超文本标记语言)。
xml使用了html的基本语法,但是,更严格,并
且可扩展,使用范围也更广泛。
xhtml: 对html按照xml语法来加以约束。
2、xml的基本语法
1)元素
a,什么是元素?
标记和标记之间的内容,统称为元素。
b,一个xml文档,只有一个根元素。
c,元素可以嵌套
d,元素必须有开始标记和结束标记,如果是空
元素,可以简写为 <标记/>。
比如:
<a></a> 是一个空元素,可以简化为<a/>
e,元素可以有属性
比如:
<point type="normal">
</point>
2)属性
a,属性用来表示元素的特性
b,属性值必须用引号括起来。
c,属性必须写在开始标记里面。
3)实体
a,什么是实体
有一些特殊的字符,比如 <, >, &, ', ",
对xml解析器有特殊的含义,需要使用相应的
字符来代替,这些用来代替的字符称之为实体。
比如,使用 < 来代替 <。
比如:
<question>
1+2<3?
</question>
解析器会认为 "<"号是一个开始标记,因为没有
">"结束,会解析出错。
正确的写法:
<question>
1+2 < 3?
</question>
b,常见的实体
< <
> >
& &
' '
" "
4) CDATA段
<![CDATA[ 不需要解析器解析的内容 ]]>
5) xml大小写敏感
建议,标记用小写;另外,如果一个标记有
多个单词,建议使用"-"连接。
比如: <cust-name>
3、xml解析
1) 主要的解析方式
a, sax: sun公司提供的一套相对比较底层的用来
解析xml的api。一般作为其它的一些解析工具的
底层的解析方式。sax解析的优点是需要的系统资源
非常少。但是编程比较麻烦。
b,dom: dom解析需要将整个xml文档读入到内存,
对系统资源的占用比较大。编程也比较麻烦。
c,一些开源的工具 : DOM4J,Digest,pull等等。
这些开源的工具编程相对sax,dom要更方便。
2)如何将一个java对象转换成一个xml文档
step1,将dom4j的jar文件加到build path。
step2, 先设计好xml文档的结构
一般来说,一个java类对应一个元素。
简单的类型,比如string,既可以作为属性,也
可以作为子元素来设计。复杂类型只能作为子元素
来设计。
3)如何将一个xml文档转换成一个java对象
4、dtd
5、xpath