1. jdbc规范介绍
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
注意:
1、在Java中,数据库存取技术只能通过JDBC访问数据库。JDBC是java访问数据库的基石,其他技术都是对jdbc的封装 ;
2、JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,由java编写的一组类和接口组成,接口的实现由各个数据库厂商来完成
3、JDBC隶属于JavaSE的范畴,所以jdbc的版本是随着JavaSE的版本升级的。
4、 java.sql包装的就是JDBC的API,在开发中(编写的Java代码),使用到的关于JDBC的类/接口全部引入的是java.sql包中的(主要不要错引入了com.mysql.)。
2.使用jdbc
java使用jdbc连接MySQL和Oracle步骤大致一致,主要区别在于:
1.需要导入的驱动包不一样,MySQL的jdbc驱动包可到官网下载,Oracle的驱动可在Oracle的安装目录中拷贝。
2.驱动名不一样,MySQL需要加载的驱动名为:“com.mysql.jdbc.Driver”,二Oracle需要加载的驱动名为:“oracle.jdbc.driver.OracleDriver”
3.数据路链接地址协议不一样,MySQL连接地址:jdbc:mysql://ip:端口/数据库名。例子:
jdbc:mysql://localhost:3306/testdatabase
Oracle连接地址:jdbc:oracle:thin:@ip:端口:实例名。例子:
jdbc:oracle:thin:@127.0.0.1:1521:orcl
4.执行的sql语句的语法有些不一样,本文不多做阐述,有时间。
下面的关于使用的介绍以MySQL为例。
2.1获取数据库链接
1.导包
导入mysql的jar包(千万不要导入zip包)
1.获取数据库链接
public static Connection getJdbcConn() {
// 协议(数据库地址),参数为设置编码格式,防止乱码
String url = "jdbc:mysql://localhost:3306/driving_school?useUnide=true&characterEncoding=UTF-8" ;
// 数据库用户名
String user = "root" ;
// 数据库密码
String password = "123456" ;
Connection conn = null ;
try {
// 加载和注册驱动程序 (从Java6(JDBC4.0)开始,此步骤可以省略)
Class.forName("com.mysql.jdbc.Driver") ;
// 通过DriverManager获取连接对象
conn = DriverManager.getConnection(url, user, password) ;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn ;
}
2.2 使用JDBC执行DML
执行sql语句的对象有两个,Statement和PreparedStatement,两者的联系和区别如下:
关系:PreparedStatement继承自Statement,都是接口。
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高 ,还能放置sql注入。
1、插入数据(增)
插入数据时Statement和PreparedStatement两种都有示范,之后都使用PreparedStatement。
Statement
public int saveData() {
// 获取数据库连接
Connection conn = this.getJdbcConn() ;
// 向user表插入一条数据
String sql = "insert into user (id,username,password,age) values('11','yxln','123456','22')" ;
// 创建编译 SQL 语句的对象。
Statement st = null ;
int flag = 0 ;
try {
// 获取编译 SQL 语句的对象
st = conn.createStatement() ;
// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
flag = st.executeUpdate(sql) ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag ;
}
PreparedStatement
public int saveData() {
// 获取数据库连接
Connection conn = this.getJdbcConn() ;
// 向user表插入一条数据
String sql = "insert into user (id,username,password,age) values(?,?,?,?)" ;
// 创建预编译 SQL 语句的对象。
PreparedStatement ps = null ;
int flag = 0 ;
try {
// 获取预编译 SQL 语句的对象
ps = conn.prepareStatement(sql) ;
// 为对应的占位符赋值
ps.setString(1, "123");
ps.setString(2, "yxln");
ps.setString(3, "123456");
ps.setInt(4, 22);
// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
flag = ps.executeUpdate() ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag ;
}
2、删除数据(删)
public int deleteData() {
// 获取数据库连接
Connection conn = this.getJdbcConn() ;
// 删除user中的一条数据
String sql = "delete from user where id = ? " ;
// 创建预编译 SQL 语句的对象。
PreparedStatement ps = null ;
int flag = 0 ;
try {
// 获取预编译 SQL 语句的对象
ps = conn.prepareStatement(sql) ;
// 为对应的占位符赋值
ps.setString(1, "123");
// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
flag = ps.executeUpdate() ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag ;
}
3、修改数据(改)
public int updateData() {
// 获取数据库连接
Connection conn = this.getJdbcConn() ;
// 修改user中的一条数据
String sql = "update user set password=? where id = ? " ;
// 创建预编译 SQL 语句的对象。
PreparedStatement ps = null ;
int flag = 0 ;
try {
// 获取预编译 SQL 语句的对象
ps = conn.prepareStatement(sql) ;
// 为对应的占位符赋值
ps.setString(1, "456789");
ps.setString(2, "11");
// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
flag = ps.executeUpdate() ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag ;
}
4、查询数据(查)
public ResultSet selectData() {
// 获取数据库连接
Connection conn = this.getJdbcConn() ;
// 查询user中的一条数据
String sql = "select id, username,password,age from user where id = ? " ;
// 创建预编译 SQL 语句的对象。
PreparedStatement ps = null ;
// 创建结果集对象,用于存储执行sql语句之后的结果集
ResultSet rs = null ;
try {
// 获取预编译 SQL 语句的对象
ps = conn.prepareStatement(sql) ;
// 为对应的占位符赋值
ps.setString(1, "11");
// 执行sql语句,查询数据
rs = ps.executeQuery() ;
// 遍历结果集
while(rs.next()) {
System.out.println(rs.getString("id"));
System.out.println(rs.getString("username"));
System.out.println(rs.getString("password"));
System.out.println(rs.getString("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
rs.close();
} catch (SQLException e1) {
e1.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
return rs ;
}
后面有时间在对jdbc做一些简单的封装。