1.jdbc的简介
Java DataBase Connectivity;java数据库的链接
比如按一个显卡,就要需要显卡驱动,我们要安装数据库驱动,厂商会提供,提供一个jar包,sun公司提供和通用的接口,实现这个接口,这个接口就是jdbc,提供用于操作数据库的标准接口,
2.jdbc的应用
第一步:加载数据库的驱动 使用DriverManager里面registerDriver方法
第二步:创建链接 DriverManager.getConnection();
在方法里面有三个参数
第一个参数:要连接的是哪一个数据库
简写方式 jdbc:mysql:///day15
使用范围:如果连接的是本机,并且端口是3306
第二个参数:连接数据库用户名
第三个参数:密码
第三步:编写sql语句
第四步:执行sql语句
首先创建statement对象
通过对象里面方法执行sql
如果执行查询语句,使用executeQuery
查询返回是一个结果集 resultset
遍历结果集得到每一条记录
第五步:释放资源,谁最后打开,谁就最先关闭
3.jdbc的DriverManager对象
在sql包里面
主要用途:
第一个加载数据库的驱动,registerDriver会加载两次,通过mysql的源码,Driver类里面静态代码块里面是类加载的时候执行,一般使用放射数据库的驱动,Class.forName("com.mysql.jdbc.Driver");剩下的都是加载sql的包
第二个驱动获取数据库的链接
getConnection(String url;String user,String password)
第一个参数:要连接的是哪个数据库
第二个参数:连接数据库用户名
第三个参数:使用数据库密码
4.jdbc的Connection对象
在sql包里面
创建statement对象:createstatement():表示执行sql语句的对象
创建prepareStatement对象:prepareStatement(String sql) :表示预编译的对象
创建CallableStatement对象: prepareCall(String sql) :执行存储过程的对象
setAutoCommit(boolean autoCommit) :表示是否会自动提交,设置成false不会自动提交,默认情况下是自动提交
commit() :表示提交事务
rollback() :表示回滚事务
5.jdbc的statement对象
主要功能:执行sql语句
方法:
执行查询操作时候:ResultSet executeQuery(String sql)
返回是ResultSet结果集,遍历结果集得到每一条记录
执行增加 修改 删除时候:int executeUpdate(String sql)
返回int,成功的记录数
执行sql语句的方法:boolean execute(String sql)
返回布尔类型,
如果第一个结果为 ResultSet 对象(执行查询操作),则返回 true;
如果其为更新计数或者不存在任何结果,则返回 false
6.jdbc的ResultSet对象
执行查询操作时候,返回ResultSet
遍历结果集的方法:next()
while(rs.next()){ }
得到每一行里面内容:
比如得到字段是int类型,使用方法getInt(“字段名称”)
比如得到字段是string类型,使用方法getString(“字段名称”)
如果不知道字段是什么类型,使用方法getObject(String columnLabel)
使用getXX方法得到值,可以写字段名称,另外可以写字段的位置,但是位置从1开始的
结果集的遍历
首先rs在第一行之前,当执行了next方法之后,一行一行进行向下遍历
在默认情况下,结果集只能向下通过,不能修改遍历之后的值
但是可以设置结果集可以滚动,同时可以修改
结果集的遍历
7、jdbc的滚动结果集(了解)
如果想要结果集是滚动的,表里面必须有主键
结果集类型
* 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 : 结果集可滚动,而且可修改.
在创建statement时候,设置滚动的结果集
createStatement(int resultSetType, int resultSetConcurrency)
方法里面的两个参数,使用ResultSet里面的常量传递
8、jdbc的释放资源
原则:谁最后打开,谁最先关闭
之前关闭连接的方法会产生一个问题,如果程序执行过程中出现了异常,关闭语句不会执行到
写finally,表示含义是无论是否出现异常,finally总会被执行到,需要把关闭的语句写到finally里面
//关闭连接
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
//让jvm快速回收
rs = null;
}
10、封装jdbc的工具类
读取properties配置文件有两种方式:
读取properties配置文件的第一种方式:使用类加载器读取(只能读取classes下面的文件)
//因为文件在src下面,部署到tomcat里面会在classes里面
//读取classes里面的文件,使用类加载器读取 properties
InputStream in = MyJDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
//读取properties文件
Properties p = new Properties();
p.load(in);
drivername = p.getProperty("drivername");
url = p.getProperty("url");
username = p.getProperty("username");
password = p.getProperty("password");
一般在开发都使用第二种方式读取 (使用ResourceBundle工具类读取properties配置文件)
ResourceBundle.getBundle("配置文件名称,没有后缀名").getString("配置文件里面的值的名称");
static {
drivername = ResourceBundle.getBundle("db").getString("drivername");
url = ResourceBundle.getBundle("db").getString("url");
username = ResourceBundle.getBundle("db").getString("username");
password = ResourceBundle.getBundle("db").getString("password");
}
使用范围:只能读取classes里面的properties配置文件
如果想要在工具类加载时候就读取配置文件,同时赋值,
通过写静态代码块实现 static { 里面放读取配置文件的代码}
11、javaee的dao模式
回顾mvc开发模式(也称为模型二)
m:模型,使用javabean技术实现封装数据
v:视图,使用jsp技术实现显示数据
c:控制器:使用servlet技术实现管理操作,什么数据显示到哪个jsp页面中
dao:用于操作数据库的模式
画图分析dao模式
javaee的结构:客户端层,web层,业务逻辑层,持久化层
web层,业务逻辑层,持久化层 这三层称为javaee的三层结构
dao模式:使用在持久化层的模式,专注于对数据库进行操作模式(crud)
首先创建接口,在接口里面定义操作数据库的方法
其次创建类实现这个接口里面的操作数据库的方法
在业务逻辑层通过dao提供的接口进行操作数据库
jsp+servlet+javabean+jdbc架构:可以实现目前所能看到的所有的应用
一般企业中不使用这种架构,因为这个架构太底层了(代码太多了)
一般企业里面使用框架实现系统 ,一般常用的框架 SSH: struts2 spring hibernate
在web层一般使用struts2框架
在业务逻辑层一般使用spring框架
在持久化层一般使用hibernate框架
mvc和dao的关系
这两个都是模式,这两个模式是不同开发时期,由不同的人提出来的。mvc是由开发人员提出的,
dao模式是由sun公司提出的。mvc整体的架构模式,dao专注于持久化层(操作数据库的模式)
可以在mvc模式里面使用dao模式专注于操作数据库
13、SQL注入的漏洞的防范
select * from stu where sname=‘"+user.getUsername()+"‘ and password=‘"+user.getPassword()+"‘"
select * from stu where sname=‘zhangsan‘ or ‘1=1‘ and password=‘qqq‘"
使用prepareStatement对象防止sql注入
预编译sql的对象:预先把sql在执行之前先编译
创建prepareStatement
PreparedStatement prepareStatement(String sql)
代码
String sql = "select * from stu where sname=? and password=?";
//预编译sql
pst = conn.prepareStatement(sql);
//传递参数,第一个参数表示第一个参数 开始从1
pst.setString(1, user.getUsername());
pst.setString(2, user.getPassword());
//执行sql
rs = pst.executeQuery();
14、jdbc的批处理操作(了解)
批处理:同时执行多条sql语句
方法
addBatch(sql):把sql语句加载到批处理操作里面
executeBatch():执行批处理操作
代码
//创建statement对象
stmt = conn.createStatement();
//把这些sql加到批处理里面
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
//执行多个sql
stmt.executeBatch();