JDBC
1.什么是JDBC ?
Java DataBase Connectivity java数据库连接
JDBC是一套标准,是java与各大数据库厂商共同制定的一套接口,而这套接口由个大数据库厂商进行了实现。
2.JDBC 连接数据库的步骤?
1.导jar包
2.加载数据库驱动(java se项目可省略,java web不可省略) DriverManager
Class.forName("com.mysql.jdbc.Driver");
3.通过驱动管理器获取jdbc的连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc.mysql://localhost:3306/java35");
4.通过连接对象,创建SQL执行对象 Statement
Statement state = conn.createStatement();
5.通过SQL执行对象,执行SQL语句
state.execute(String SQL语句);
6.关闭资源
state.close();
conn.close();
3.为什么使用PreparedStatement不使用Statement?
Statement是PreparedStatement的父类,作为 Statement 的子类, PreparedStatement 继承了 Statement 的所有功能
1 代码可读性、可维护性好
2. 有效禁止SQL注入
①.SQL注入问题
当输入密码使我们的查询语句产生了歧义:比如:1' or '1'='1
原查询语句: select id from user35 where username='帐号' and password='密码'
拼接后: select id from user35 where username='帐号' and password='1' or '1'='1'
②。解决SQL注入问题
将代码与参数分离:
先将未拼接参数的sql语句,作为sql指令,先传递给数据库进行预编译;
再将需要传递的参数,不作为指令传递给数据库
3.提高性能
PreparedStatement 是先编译在传参执行,预编译的语句会被缓存,以后遇到相同的语句就不用缓存直接可以传参;
Statement 每条语句都不一样,因此不存在缓存,每一次都要编译执行。
PreparedStatement 预编译的SQL执行环境
操作流程与Statement基本一致:
1.如何得到一个PreparedStatement 对象
PreparedStatement state = conn.PrepareStatement("预编译的sql语句 ") ;
2.预编译的SQL语句如何编写
需要填充的位置用?代替
select id from user35 where username=? and password=?
3.参数如何填写
state.setxxx(int indedx,xxx value );【 xxx ---指数据类型 】
index : sql 语句中的?位置,从一开始
value : 填写的参数值
4.如何执行填充完毕参数的SQL
- boolean execute();
- int executeUpdate();
- ResultSet executeQuery();
4. JDBC连接数据库的工具类
连接池
连接池用于缓存连接!
当需要连接时可以不用再创建连接,可直接从连接池中获取。
当连接池中存在空闲的连接时,会将空闲连接给程序使用。
当连接池中不存在空闲连接时,且连接池未满时,则创建连接提供给程序使用,并在在程序使用完毕后缓存连接。
当连接池中不存在空闲连接时,且连接池已满时,则排队等候空闲连接出现。
使用连接池中的连接对象操作数据库时, 操作完毕依然需要释放连接(close()).
连接池中的连接在设计时, 使用了动态代理设计模式+装饰者设计模式 . 我们调用它的close方法, 代理没有关闭这个连接, 而是将连接重新放入了池中.
1.DBCP连接池
2.德鲁伊连接池
创建连接池对象
static {
// 获取配置文件的输入流
InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
// 创建Properties对象
Properties ppt = new Properties();
try {
// 将流指向的文件中的键值对 加载到ppt中
ppt.load(is);
// 通过连接池的工厂类, 创建连接池对象
data = DruidDataSourceFactory.createDataSource(ppt);
} catch (Exception e) {
e.printStackTrace();
}
}
获取数据库连接的静态方法
public static Connection getConnection() {
try {
return data.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
释放资源的静态方法(Connection PreparedStatement
Connection PreparedStatement ResultSet
public static void close(Connection conn,Statement state,ResultSet result) {
if(result != null) {
try {
result.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(state != null) {
try {
state.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5.什么是DAO DAO如何进行设计
什么是DAO?
1:Data Access Objects :数据访问对象:
2:DAO指位于业务逻辑和持久化数据之间实现对持久化数据的访
问,也就是将数据库操作都封装起来,对外提供相应的接口
3:[采用面向接口,有利于代码的,低耦合高类聚原则]
DAO的优势?
1:隔离业务逻辑代码和数据访问代码
2:隔离不同数据库实现
DAO的组成?
**1:DAO接口 把对数据库的所有操作定义为抽象方法
2:DAO实现类 不同数据库给出的DAO接口定义方法的具体实现
3:实体类 用于存放和传输对象数据
4:数据库连接和关闭工具
避免了数据库连接和关闭代码的重复
6.使用JDBC结合DAO完成对银行账户的增删改查
1.bean类
2.数据库连接类,装有获取连接和关闭连接
3.DAO类,写有访问数据库的方法
4.DAO类的实现类,写有sql语句
7. JDBC 中如何完成事务控制 如银行转账
connection 中三个方法与事务有关:
- con.setAutoCommiit(true) 自动提交 【boolean 类参数】
con.setAutoCommit(false) 手动提交,就是开启事务
- con.rollback(); 回滚事务
- con.commit(); 提交事务
- Connextion.setTransactionIsolation()设置事务隔离级别
dao设计注意问题
1.参数
2.返回值
3.方法
连接池设计
jdbc批处理
一:Statement.addBatch(SQL),可以发送不同的SQL语句
执行SQL语句的方法:executeBatch()
清除批处理命令的方法:clearBatch()
二:PreParedStatement.addBatch(),只能发送相同的SQL语句适合做批量插入、批量更新。
执行SQL语句的方法:executeBatch()
清除批处理命令的方法:clearBatch()
什么是元数据 如何获取元数据?
元数据(MetaData),即定义数据的数据.
JDBC来处理数据库的接口主要有三个,即:
Connection : 由Connection对象的getMetaData()方法获取的是DatabaseMetaData对象。
PreparedStatement : 由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象。
ResultSet : 由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。
一、DatabaseMetaData(数据库元数据)
getDatabaseProductName:获取数据库的产品名称
getDatabaseProductVersion:获取数据库的版本号
getUserName:获取数据库的用户名
getURL:获取数据库连接的URL
getDriverName:获取数据库的驱动名称
driverVersion:获取数据库的驱动版本号
isReadOnly:查看数据库是否只允许读操作
supportsTransactions:查看数据库是否支持事务
二、ParameterMetaData(参数元数据)
ParameterMetaData是由PreparedStatement对象通过getParameterMetaData方法获取而来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,比如像”insert into account(id,name,money) values(?,?,?)”这样的预编译SQL语句,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等.
以下有一些关于ParameterMetaData的常用方法:
getParameterCount:获取预编译SQL语句中占位符参数的个数
三、ResultSetMetaData(结果集元数据)
ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。
以下有一些关于ResultSetMetaData的常用方法:
getColumnCount:获取结果集中列项目的个数
getColumnType:获取指定列的SQL类型对应于Java中Types类的字段
getColumnTypeName:获取指定列的SQL类型
getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名)