一、JDBC概述
JDBC:JavaDataBaseConnectivity,Java数据库连接,SUN公司推出的java访问数据库的标准规范(接口)。
JDBC是一种用于执行SQL语句的 java api。
JDBC可以为多种关系数据库提供统一访问入口。
JDBC由一组Java工具类和接口组成。
二 、JDBC 原理
SUN 提供的访问数据库的规范成为JDBC,而生产厂家提供规范的实现类成为驱动。
JDBC 是接口,驱动是接口的实现,没有驱动将无法完成数据库的链接,从而不能操作数据库。每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成长商提供。
三、JDBC 开发步骤【myeclipse】
1、注册驱动
2、获取链接
3、获得数据库执行者
4、执行sql语句
5、处理结果
6、释放资源
##1) 导入驱动jar包
1.1) 创建lib目录,用户存放当前项目所需要的所有的jar包
1.2) 选择jar包,右键执行“build path/ add to build path”
2) 注册驱动
class.forname("com.mysql.jdbc.Driver");
1.jdbc 规范定义驱动接口java.sql.Driver, mysql 驱动包提供了实现类:com.mysql.jdbc.Driver
2.DriverManager 工具类,提供注册驱动类的方法registerDriver(),
方法的参数是java.sql.Driver,所以我们可以退通过下面语句进行注册DriverManager.registerDriver(new com.mysql.jdbc,Driver());
但是我们不推荐这样的方式:a)这是硬编码,不利于后期维护,b)驱动被注册了两次.
3.通常开发我们使用class.forname() 加载一个使用字符串描述的驱动类。如果使用class.forname() 将类加载到内存,该类的静态代码将自动执行。因为我们通过查com.mysql.jdbc.Driver 源码,可以发现Driver类会主动注册自己。
3)获取链接:
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","123");
获取链接需要方法DriverManager.getConnection(url,username,password),三个参数分表为
url:需要连接数据库的位置(网址);
user:用户名;
password:密码;
url比较复杂,下面是mysql的url。
jdbc:mysql://ocalhost:3306/mydbl
JDBC规定的格式由三部分组成,每个部分中间使用冒号分隔。
第一部分是jdbc,这是固定的;
第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(mydb1)组成。
扩展url:
jdbc:mysql://localhost:3306/mydbl?useUniCode=true&characterEncoding=UTF8
1、useUnicode参数:指定这个连接数据库的过程中,使用的字节集是Unicode字节集;
2、characherEncoding参数:指定Java程序连接数据库的过程中,使用的字节集编码为UTE-8编码。
3、请注意,mysqi中指定UTF-8编码是给出的是UTF8,而不是UTF-80要小心了!
4)定义执行语句
string sql="insert into userinfo(username,password)values('root','123')";
//定义statement执行对象
Statement st=con.createstatement();
执行sql语句常用方法:
- int executeUpdate(string sql); //执行insert update delete语句
- ReusltSet executeQuery(string sql); //执行select 语句
- boolean execute(string sql); //执行select语句返回true,执行其他语句返回false。
如果返回true,需要使用getResultSet()获取查询结果。
如果返回false,需要使用getupdatecount()获取影响的函数。
注意:如果有参数,需要在sql语句中进行拼接,存储sql注入问题。
5)处理结果集
ResultSet 实际上是一张二维的表格,它内部有一个“行光标”,光标默认位置在第一行的上方,我们可以调用rs对象的next()方法吧“行光标”向下移动一行,当第一次调用next()方法的时候,行光标就到了一条记录的位置,这是我们就可以 使用ResultSet提供的getXXX(int col)方法来获取制定列是数据了。
rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列数据。
在ResultSet中提供的getXXX()方法中常用的有如下几种:
object getobject(int col);
string getstring(int col);
int getint(int col);
double getDouble(int col);
6) 释放资源
与IO 流一样,使用后的东西需要关闭,关闭的顺序是先得到后关闭,后得到,先关闭。
rs.close();
st.close();
con.close();
四、实例:
package jdbctest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class mylogin {
public static void main(String[] args) throws SQLException{
//1、注册驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2、获取链接
Connection conn=DriverManager.getConnection("jdbc:mysql://Localhost:3306/mydb","cheng","123456");
//3、创建执行对象
Statement st=conn.createStatement(); //引入:import java.sql.Statement;
//4、 sql语句
String sql="select * from user where username="+"'root' "+" and password="+"'123456';";
//5、执行语句
ResultSet rs=st.executeQuery(sql);//引入:import java.sql.ResultSet;
//6、对结果集进行处理
if(rs.next())
{
System.out.print("登录成功");
}
else{System.out.print("登录失败");}
//7、释放资源
if(rs!=null) rs.close();
if(st!=null) st.close();
if(conn!=null) conn.close();
}
}
五、sql注入:
package jdbctest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class mylogin {
public static void main( String[] str) throws SQLException{
// String username="root";
// String password="123456";
//1、注册驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2、获取链接
Connection conn=DriverManager.getConnection("jdbc:mysql://Localhost:3306/mydb","cheng","123456");
//3、 sql语句
String sql="select * from user where username='?'"+" and password='?'";
//4、 创建预处理对象
PreparedStatement pstmt = conn.prepareStatement(sql);
System.out.print(sql);
//4.1 设置参数
pstmt.setString(1,"root");
pstmt.setString(2,"123456");
//5、执行语句
ResultSet rs=pstmt.executeQuery(sql);//引入:import java.sql.ResultSet;
//6、对结果集进行处理
if(rs.next())
{
System.out.println("登录成功");
System.out.println(sql);
}
else{System.out.print("登录失败");}
//7、释放资源
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
}
}