Java JDBC
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC的四种主要接口:
Java中使用JDBC连接数据库,主要有六个步骤:
1、装载数据库的JDBC驱动程序
2、建立与数据库的连接
3、建立Statement 对象,准备执行SQL语句
4、执行SQL语句
5、处理ResultSet结果集
6、依次关闭ResultSet、Statement和Connection对象
要按照上述步骤处理数据库的数据,我们就要了解下面的四个JDBC接口,这四个接口可以帮助我们链接数据库并且通过Java语言来在数据库中执行SQL语句,然后我们就可以在数据库中进行增删改查操作,并且将获得的数据输出。这四个接口如下:
- java.sql.DriverManager:处理驱动程序的调入和管理
- java.sql.Connection:负责连接数据库
- java.sql.Statement:负责执行数据库 SQL 语句
- java.sql.ResultSet:负责存放查询结果
关于处理驱动程序,JDBC针对不同类型的数据库,提供了”驱动程序”的的概念。对于不同的数据库,程序只需要使用不同的驱动厂商驱动连接数据库。以下为常用的几种数据库的驱动程序以及对应的url:
MS SQL Server:驱动程序为:
"com.microsoft.jdbc.sqlserver.SQLServerDriver"
url 为:
"jdbc:microsoft:sqlserver://[IP]:1433;DatabaseName=[DBName]"
Oracle :驱 动 程 序 为 :
"oracle.jdbc.driver.OracleDriver "
url为:
" jdbc:oracle:thin:@[ip]:1521:[sid] "
MySQL 驱动程序为:
“com.mysql.jdbc.Driver"
url为:
"jdbc:mysql://localhost:3306/[DBName]"
JDBC通过Java操作数据库
要想通过Java操作数据库,我们先要与数据库建立连接,然后执行sql语句来操作数据库。在这里,我们以MySql数据库为例来举例。
连接数据库:
//连接数据库的URL,这里我们连接的数据库名称为testdb
private static final String CONNURL = "jdbc:mysql://localhost:3306/testdb";
private static final String USERNAME = "root";//数据库用户名
private static final String PASSWORD = "123456";//数据库密码
//加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
建立连接
Connection con = DriverManager.getConnection(CONNURL, USERNAME , PASSWORD);
通过上述的代码,我们就获得了一个Connection类的实例con,这个con就是我们通过JDBC获取的与数据库的连接。
建立了与数据库的连接之后,我们就要对数据库进行增删改查的操作,这里我们就要使用到java.sql.Statement和java.sql.ResultSet,其中Statement可以帮助我们执行sql语句,而ResultSet可以帮助我们保存sql语句的执行结果。
假设,我们的数据库testdb中有一个person表,person表的字段转换为Java如下:
public class Person
{
private String name;//姓名
private int age;//年龄
private String sex;//性别
}
查找:
我们要对Person表进行查找所有人,就可以使用如下的代码:
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="select * from person"; //创建sql语句,查询person表中所有数据
ResultSet rs=stmt.executeQuery(sql); //执行sql语句,并且获得结果集
//遍历结果集
while( rs.next() ) {
System.out.print(rs.getString("name")+" ");
System.out.print(rs.getString("age")+" ");
System.out.print(rs.getString("ses")+" ");
System.out.println();
}
//关闭连接
rs.close();
stmt.close();
conn.close();
通过上述的代码,我们就可以查询到表person中的所有数据,并且将数据输出。
条件查询
如果我们要查找某个人,那么我们可以在sql语句中加入where条件,来在数据库中查找某个人:
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="select * from person where name = "dasyang"; //创建sql语句,查询person表中叫dasyang的人
ResultSet rs=stmt.executeQuery(sql); //执行sql语句,并且获得结果集
//遍历结果集
while( rs.next() ) {
System.out.print(rs.getString("name")+" ");
System.out.print(rs.getString("age")+" ");
System.out.print(rs.getString("ses")+" ");
System.out.println();
}
//关闭连接
rs.close();
stmt.close();
conn.close();
删除
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="delete from person where name = "dasyang" "; //创建sql语句
stmt.executeQuery(sql); //执行sql语句
//关闭连接
rs.close();
stmt.close();
conn.close();
增加
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="insert into person (name,age,sex) values("dasyang",20,"man")"; //创建sql语句
stmt.executeQuery(sql); //执行sql语句
//关闭连接
rs.close();
stmt.close();
conn.close();
修改
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="update person set age=21 where name = "dasyang" "; //创建sql语句
stmt.executeQuery(sql); //执行sql语句
//关闭连接
rs.close();
stmt.close();
conn.close();
在上面的代码中,我们介绍了如何对数据库进行增删改查,但是上面的方法中,比如我们要动态的增加一个人或者修改某个人的数据,我们需要通过代码来控制sql字符串的内容,来达到目的,这样做非常的麻烦,而且一不小心就会出错,接下来我们介绍另一种操作数据库的方法,使用PreparedStatement来操作数据库。
PreparedStatement
以添加数据为例,在很多情况下,具体需要添加的值,是由客户自己输入的,因此,应该是一个个变量。该情况下,SQL 语句的写法就比较麻烦 ,而且依赖了变量,比较容易出错。PreparedStatement 帮助我们解决了这个问题,PreparedStatement 是 Statement 的子接口,功能与 Statement 类似,但是在PreparedStatement我们的数据可以使用?来代替,这里的?充当了占位符,具体表示的数据则可以通过setString(id,value)或者setInt(id,value)等方法来设置,具体的参数是什么类型,我们就使用不同的set方法,如果数据是double类型,我们就使用setDouble(id,value)。其中id表示的是在sql语句中的第几个’?‘,第一个’?‘的id为1。而value则是我们设置的值。
具体的使用举例如下:
条件查找:
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="select * from person where name = ?”; //创建sql语句,查询person表中某个人
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, "dasyang");//查找表中叫dasyang的人
ResultSet rs= ps.executeQuery( ); //执行sql语句,并且获得结果集
//遍历结果集
while( rs.next() ) {
System.out.print(rs.getString("name")+" ");
System.out.print(rs.getString("age")+" ");
System.out.print(rs.getString("ses")+" ");
System.out.println();
}
//关闭连接
rs.close();
ps.close();
conn.close();
插入:
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="insert into person (name,age,sex) values(?,?,?); //创建sql语句
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, "dasyang");
ps.setInt(2, 20);
ps.setString(3, "man");
ps.executeQuery( ); //执行sql语句,并且获得结果集
//关闭连接
rs.close();
ps.close();
conn.close();
删除:
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="delete from person where name = ?; //创建sql语句
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, "dasyang");
ps.executeQuery( ); //执行sql语句,并且获得结果集
//关闭连接
rs.close();
ps.close();
conn.close();
更新:
Statement stmt=conn.createStatement(); //创建SQL容器
String sql="update person set age=? where name=?; //创建sql语句
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1, 20);
ps.setString(2, "dasyang");
ps.executeQuery( ); //执行sql语句,并且获得结果集
//关闭连接
rs.close();
ps.close();
conn.close();
通过使用上面的方法,可以使我们在操作条件查询、增加、删除以及修改变的更简单、自由,这种方法可以有效的减少我们在编程中的错误,也让代码变的更加简洁。