JDBC (Java DB Connection)---Java数据库连接
一、ODBC到JDBC的发展历程(看一眼就可以)
自从Java语言于1995年5月正式公布以来,Java风靡全球。出现大量的用java语言编写的程序,其中也包括数据库应用程序。由于没有一个Java语言的API,编程人员不得不在Java程序中加入C语言的ODBC函数调用。这就使很多Java的优秀特性无法充分发挥,比如平台无关性、面向对象特性等。随着越来越多的编程人员对Java语言的日益喜爱,越来越多的公司在Java程序开发上投入的精力日益增加,对java语言接口的访问数据库的API的要求越来越强烈。也由于ODBC的有其不足之处,比如它并不容易使用,没有面向对象的特性等等,SUN公司决定开发一Java语言为接口的数据库应用程序开发接口。在JDK1.x版本中,JDBC只是一个可选部件,到了JDK1.1公布时,SQL类包(也就是JDBCAPI)就成为Java语言的标准部件。
二、JDBC技术及使用详解
通过JDBC操作数据库——步骤:
第1步:注册驱动 (只做一次)
第2步:建立连接(Connection)
第3步:创建执行SQL的语句(Statement)
第4步:执行语句
第5步:处理执行结果(ResultSet)
第6步:释放资源
第一步:加载驱动
注册驱动有三种方式:
1. Class.forName(“com.mysql.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖
2. DriverManager.registerDriver(com.mysql.jdbc.Driver);
会对具体的驱动类产生依赖
3. System.setProperty(“jdbc.drivers”, “driver1:driver2”);
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用
第二步:建立连接
通过Connection建立连接,Connection是一个接口类,其功能是与数据库进行连接(会话)。
建立Connection接口类对象:
Connection conn =DriverManager.getConnection(url, user, password);
其中URL的格式要求为:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
如:"jdbc:mysql://localhost:3306/test“
user即为登录数据库的用户名,如root
password即为登录数据库的密码,为空就填””
第三步:创建执行对象
执行对象Statement负责执行SQL语句,由Connection对象产生。
Statement接口类还派生出两个接口类PreparedStatement和CallableStatement,这两个接口类对象为我们提供了更加强大的数据访问功能。
创建Statement的语法为:
Statement st = conn.createStatement();
第四步:执行SQL语句
执行对象Statement提供两个常用的方法来执行SQL语句。
executeQuery(Stringsql),该方法用于执行实现查询功能的sql语句,返回类型为ResultSet(结果集)。
如:ResultSet rs =st.executeQuery(sql);
executeUpdate(Stringsql),该方法用于执行实现增、删、改功能的sql语句,返回类型为int,即受影响的行数。
如:int flag = st.executeUpdate(sql);
第五步:处理执行结果
ResultSet对象
ResultSet对象负责保存Statement执行后所产生的查询结果。
结果集ResultSet是通过游标来操作的。
游标就是一个可控制的、可以指向任意一条记录的指针。有了这个指针我们就能轻易地指出我们要对结果集中的哪一条记录进行修改、删除,或者要在哪一条记录之前插入数据。一个结果集对象中只包含一个游标。
第六步——释放资源
Connection对象的close方法用于关闭连接,并释放和连接相关的资源。
使用JDBC——模板,常用的接口
PreperedStatement接口和Statement的区别
(1) 使用Statement发送和执行sql语句
Statement stmt = con.creatStatement();//加载时,无参数,不编译sql语句
String sql = "selete * from emp";
ResultSet rs = stmt.executeQuery(sql);//执行时编译sql语句,返回查询结果集
(2) 使用PreparStatement发送和执行sql语句
String sql = "selete * from emp";
PreparStatement ps=con.prepareStatement(sql);//加载时就编译sql语句
ResultSet rs = ps.executeQuery();//此处执行时,不需要传参
还有就是
Statement stmt;支持可以通过字符串拼接(来传递参数),如StringdeleteStu = "delete from student where id="+id;但容易SQL注入
PreparedStatement ps; 不支持字符串拼接,提供?通配符传递参数,更安全;如String deleteStu = "delete from student where id=?";
ps.setInt(1, id); //设置第一个?通配值为id
没封装的jdbc(好理解)
package com.test.jdbc;
import java.sql.*;
/**
* @Author: cxx
* @Date: 2018/4/10 18:22
*/
public class JdbcTest {
public static void main(String[] args) {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://30.205.212.196:3306/demo","root","123456");
//3.创建执行对象
stat = conn.createStatement();
//4.执行sql语句
rs = stat.executeQuery("select * from news");
//5.处理执行结果
while (rs.next()){
System.out.println(rs.getString(1));
}
//6.释放资源
rs.close();
stat.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
封装JdbcUtils:
package com.test.jdbc;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @Author: cxx
* @Date: 2018/4/10 19:30
*/
public class JdbcUtil {
private static String url;
private static String user;
private static String password;
static{
Properties prop = new Properties();
InputStream is= JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
prop.load(is);
Class.forName(prop.getProperty("jdbc.dirver"));
url = prop.getProperty("jdbc.url");
user = prop.getProperty("jdbc.username");
password = prop.getProperty("jdbc.password");
} catch (IOException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public static void close(Connection conn, Statement stat, ResultSet rs){
if(conn != null){
try {conn.close();} catch (SQLException e) {e.printStackTrace();}
}
if(stat != null){
try {stat.close();} catch (SQLException e) {e.printStackTrace();}
}
if(rs != null){
try {rs.close();} catch (SQLException e) {e.printStackTrace();}
}
}
public static void main(String[] args) {
System.out.println(JdbcUtil.getConnection());
}
}
jdbc.dirver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
package com.test.jdbc;
import java.sql.*;
/**
* @Author: cxx
* @Date: 2018/4/10 18:22
*/
public class JdbcTest {
public static void main(String[] args) {
Connection conn = null;
Statement stat = null;
PreparedStatement pstat = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
//3.创建执行对象
stat = conn.createStatement();
//4.执行sql语句
//查询
//rs = stat.executeQuery("select * from news");
//prepareStatement
pstat = conn.prepareStatement("select * from news where id = ?");
pstat.setInt(1,1004);
rs = pstat.executeQuery();
while (rs.next()){
System.out.println(rs.getString(2));
}
//增加
//int rows = stat.executeUpdate("insert into news (title,context) values ('马小超','413245')");
//删除
//int rows = stat.executeUpdate("delete FROM news WHERE id =1005");
//修改
// int rows = stat.executeUpdate("update news set title='我可就七个人' where id =1004");
// //5.处理执行结果
// System.out.println("rows:"+rows);
// if (rows>0){
// System.out.println("插入成功");
// }
//6.释放资源
JdbcUtil.close(conn,stat,rs);
}catch (SQLException e) {
e.printStackTrace();
}
}
}