JDBC
1. JDBC的概述
JDBC (Java Database Connectivity) 是用于执行SQL 语句的Java 应用程序接口,由一组用Java 语言编写的类和接口组成。
JDBC 是一种 应用编程接口,它制定处理表格数据和常见的关系型数据的标准框架。
2. 数据库的基本概念
数据库本质上是表的“智能”容器。
表是由行组成的容器。
行(概念上) 是由列组成的容器。
列是具有名称、类型和值的单个数据项目。
3.主要由以下界面(interface) 和类组成:
DriverManager (class):驱动管理类 实现不同的登录方式
getConnection():试图建立给定数据库url的链接
Connection (interface):用于和数据库进行连接
Createstatememt():创建一个statement对象来,将sql语句发送到数据库
Statement (interface):用于执行静态sql语句
ExecuteQuery():执行结定的sql语句,该语句返回单个Resultset对象
PreparedStatement (interface):可以使用?代替原始’’防止sql注入,预先编译sql语句
CallableStatement (interface):用于调用存储过程函数
ResultSet (interface) :游标对象抓取
DatabaseMetaData (interface):可以获取数据库结构信息视图
getURL():返回一个String对象,代表数据库的URL
GetuserName():返回此链接使用的数据库的用户名
isReadOnly():返回一个Boolean值,指示数据库是否允许读操作
getDatabaseProduceName():返回数据库的产品名称
getDatabaseProduceVersion():返回数据库的版本号
getDriverName():返回驱动程序的名称
GetDriversion():返回驱动的版本号
ResultSetMetaData (interface):用于获取查询列的信息
getColumnCount():返回目前Resultest的对象的列数
getColumDisplaySize(int column):返回column指定的列的最宽度
getColumnLabe(intocolumn):返回指定的列的标签
getcolumnName(int column):返回column指定列的列名
4. JDBC中执行SQL的步骤
首先,要将“驱动程序”传递到DriverManager
然后获得“连接”
其次,创建Statement、PreparedStatement、或CallableStatement,并将它们用于更新数
库或执行查询
最后,查询返回包含有已请求数据的ResultSet,ResultSet 是按“类型”检索的。 DatabaseMetaData 和ResultSetMetaData 接口可以用来提供有关数据库或ResultSet 的信息。
5. 数据库连接
配置文件:
url=jdbc:mysql://localhost:3306/news
driverClass=com.mysql.jdbc.Driver
userName=root
password=123
注:mysql的url是jdbc:mysql://localhost:3306/数据库名
Oracle的url是jdbc:oracle:thin:@localhost:1521:orcl
连接类:
public class DbUtils {
static Properties p=new Properties();
static{
InputStream is=DbUtils.class.getResourceAsStream("/jdbcmysql.properties");
try {
p.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws ClassNotFoundException, SQLException{
String url=p.getProperty("url");
String driverClass=p.getProperty("driverClass");
String uName=p.getProperty("userName");
String password=p.getProperty("password");
Class.forName(driverClass);
Connection conn=DriverManager.getConnection(url, uName, password);
return conn;
}
}
4. SQL注入
Sql注入:是利用字符串的漏洞来进行数据攻击
‘ or 1=1 or 1= ’
例:select * from emp where job ‘’ or 1=1 or 1= ‘’
正常逻辑job=’ or 1=1 偶人1= ’ 不存在数据查询的集合null ‘’ 可以利用字符串’ 来结尾添加 or 1=1 这样sql破解查询所有数据
?:在jdbc中叫占位符
5. 事务:
是一个运行的单元 该单元运行的程序 必须满acid的持性.
在JDBC中事务是自动提交
将JDBC中的事务设置为手动提交所有方法中的代码在同一个事务中(设置setAutocommit(false))
6. 调用存储过程
/**
* 调用存储过程
* {call 存储过程名(?,?,?)}
*/
public void CallProcedure() throws ClassNotFoundException, SQLException{
String sql="{call re_mul(?,?,?)}";
Connection conn=DbUtils.getConnection();
//预先编译sql语句
CallableStatement sta=conn.prepareCall(sql);
sta.setInt(1, 7411);
sta.setInt(2, 39564);
sta.registerOutParameter(3, Types.INTEGER);
sta.execute();
int result=sta.getInt(3);
System.out.println(result);
}