JDBC
JDBC(java data base connectivity的 java数据库连接)是一种用于执行sql语句的java api.jdbc是java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,由一组用java语言编写的接口和类组成.
Jdbc需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定.设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信.mysql的驱动mysql-connector-java-5.1.37-bin.jar,
JDBC原理:
Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动.JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库.每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是驱动一般都是由数据库生成厂商提供.
使用jdbc的开发步骤:
注册驱动;
获得连接;
获得语句执行平台
执行sql语句
处理结果
释放资源
注册驱动:
Class.forName(“com.mysql.jdbc.Driver”);
获得连接:
String url=”jdbc:mysql://localhost:3306/mydb”;
Connection conn=DriverManager.getConnection(url,”root”,”root”);
获得语句执行者:
Statement st=conn.createStatement();
执行sql语句:
Result rs=st.executeQuery(“select * from catagory”);
处理结果集:
While(rs.next()){
Integer cid=rs.getInt(“cid”);
String name=rs.getString(“name”);
}
释放资源:
rs.close();
st.close();
conn.close();
注册驱动详解:
Class.forname(“com.mysql.jdbc.Driver”);
Jdbc规定定义驱动接口:java.sql.Driver,mysql驱动包提供了实现类:com.mysql.jdbc.Driver
DriverManager工具类,提供注册驱动的方法registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
通常开发中,我们不实用,存在不足:
硬编码,后期不易于程序扩展和维护
驱动被注册两次
通常我们使用Class.forName()加载一个使用字符串描述的驱动类.如果使用Class.forName()将类加载到内存中,该类的静态代码将自动执行.通过查询com.mysql.jdbc,Driver源码,Driver类”主动”将自己进行注册
获得连接:
获得连接需要方法DriverManager.getConnection(url,username,password),三个参数分别表示,url需要连接数据库的位置(网址) user 用户名 password 密码
Url的格式为:url=jdbc:mysql://localhost:3306/mydb
第一二部分是固定的:jdbc:mysql://
第三部分是由数据库厂商规定的,mysql的第三部分分别由数据库服务器的IP地址(localhost).端口号(3306),以及DataBase名称(mydb)组成.
获得语句执行平台:
String sql=”某sql语句”;
获取statement语句执行平台:statement stmt=conn.createStatement();
常用方法:
int executeUpdate(String sql);执行 insert update delete语句
Result executeQuery(String sql) 执行select 语句;
Boolean execute(String sql) 执行select 返回true执行其他的语句返回false.
处理结果集(执行insert update delete无需处理结果):
ResultSet实际上是一张二维的表格,可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据.
rs.next();//指向第一行
Rs.getInt(1);//获取第一行第一列的数据;
常用方法:
Object getObject(int index) /Object getObject(String name) 获得任意对象
String getString(int index) /Object getObject(String name)获得字符串
Int getInt(int index) /Object getObject(String name) 获得整型
Double getDouble(int index) /Object getObject(String name) 获得双精度浮点型
释放资源:
与IO 流一样,使用后的东西都需要关闭.关闭的顺序是先得到的后关闭,后得到的先关闭;
rs.close();
stmt.close();
conn.close();
sql注入问题.
Sql注入:用户输入的内容作为了sql语句语法的一部分,改变了原有sql真正的意义.如:
Select * FROM 用户表 where name = 用户输入的用户名 and password = 用户输入的密码;
若用户输入,用户名xxx,密码为xxx or ‘a’ =’a’ ,真正的执行语句就是:
Select * from 用户表 where name =’xxx’ and password=’xxx’ or ‘a’= ‘a';
这就是sql注入的问题;
为此,我们使用PreparedStatement来解决对应的问题。
预处理对象:
preparedStatement预处理对象,处理的每条sql语句中所有的实际参数,都必须使用占位符?替换.
String sql=”select * from user where username = ? and password = ?”;
preparedStatement使用,需要通过三部完成:
preparedStatement预处理对象代码:
PreparedStatement psmt=conn.preparedStatement(sql);
设置实际参数:
Void setXxx(int index,Xxx xx)将指定参数设置指定类型的值
参数一:index 实际参数序列号,从1开始;
参数二:xxx,实际参数值,xxx表示具体的类型.
SetString(2,”11234”) 把sql语句中第2个位置的占位符?替换成实际参数”1234”;
执行sql语句:
Int executeUpdate();---执行insert update delete语句
ResultSet executeQuery();---执行select语句
Boolean execute();---执行select返回true执行其他的语句返回false.
一般我们使用jdbc的时候,都是一个utils,我们可以在网上找到一个utils,直接修改url就可以使用了.以后会更新一个utils的