1、 什么是JDBC?为什么使用JDBC
JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:
java.sql
javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
2)为什么使用JDBC?
a)降低Java程序操作数据库的成本
b)使Java程序灵活移植
*2、祥解JDBC连接数据库的各个步骤
1)注册驱动:DriverManager.registerDriver(new com.mysql.jdbc.Driver());
java.sql.Driver(接口)-com.mysql.jdbc.Driver(实现类)
(首先返回true)boolean acceptsURL(String url)
查询驱动程序是否认为它可以打开到给定 URL 的连接。
(然后)Connection connect(String url, Properties info)
试图创建一个到给定 URL 的数据库连接。
注意:上述代码会向DriverManager注册二次相同的MySQL驱动,其中一次在Driver实现类中
项目中推荐使用以下代码间接注册数据库驱动:
Class.forName("com.mysql.jdbc.Driver");
Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法DriverManager.registerDriver(new Driver()),注意:在实际开发中,并不推荐采用这个方法注册驱动。查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序加载两次,也就是在内存中会有两个Driver对象。
推荐方式:Class.forName(“com.mysql.jdbc.Driver”);采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要import驱动的API,这样可使程序不依赖具体的驱动,使程序的灵活性更高。
DriverManager.getConnection(url, user, password),根据url获取数据库的链接。
a)只注册一次
b)无需导入与具体数据库驱动相关的包
2)获取数据库连接对象:
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/mydb2","root","root");
数据库URL写法:
URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
jdbc:mysql:[]//localhost:3306/test
协议 子协议 接口 数据库
常用数据库URL地址的写法:
Oracle—jdbc:oracle:thin:@localhost:1521:sid
SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql—jdbc:mysql://localhost:3306/sid
Mysql的url地址的简写形式: jdbc:mysql:///sid
a)依次按resul->statement->connection顺序关闭
b)在能完成业务的情况下,尽早关闭
*3、 JDBC的六个固定步骤
1,注册数据库驱动[利用反射]
2,取得数据库连接对象Connection
3,创建SQL对象
4,执行SQL命令,并返回结果集
5,处理结果集
6,依次关闭结果集
jdbc案例:
//体验JDBC开发的过程
public class Demo1 {
public static void main(String[] args) throws Exception {
//注册数据库的驱动
//DriverManager.registerDriver(new Driver());
//利用反射机制间接加载数据库驱劝
Class.forName("com.mysql.jdbc.Driver");
//取得与MySQL数据库连接的桥梁 参数:URl 用户名 密码
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/mydb2","root","root");
//创建封装SQL命令的对象
String sql = "select * from user";
Statement stmt = conn.createStatement();
//执行SQL命令,并返回符合条件的记录集合
ResultSet rs = stmt.executeQuery(sql);
//处理结果集合
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
float salary = rs.getFloat("salary");
System.out.println(id+":"+name+":"+gender+":"+salary);
}
//依次关闭所用过的连接对象
rs.close();
stmt.close();
conn.close();
}
}
重构JDBC开发:
//重构JDBC开发的过程
public class Demo2 {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mydb2";
String user = "root";
String password = "root";
String sql = "select * from user";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
float salary = rs.getFloat("salary");
System.out.println(id + ":" + name + ":" + gender + ":"+ salary);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(rs!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stmt!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn!=null){//重量级,创建和销毁rs所需要的时间和资源较小
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
以配置方式开发JDBC:
创建properties文件或xml文件配置数据:
//重构JDBC开发的过程
public class Demo3 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select * from user";
try {
conn= JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
}
程序详解—Connection:
Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
prepareCall(sql):创建执行存储过程的callableStatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit() :在链接上提交事务。
rollback() :在此链接上回滚事务。
程序详解—ResultSet:
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
获取任意类型的数据:
getObject(int index)
getObject(string columnName)
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
insert/update/delete----Statement.executeUpdate(sql):返回值表示影响记录的行数
select------------------Statement.exeucteQuery():返回值表示符合条件的记录
create------------------ ?
drop-------------------- ?
JDBC的crud开发:
//基于JDBC的CRUD操作
public class Crud {
@Test
public void create(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "insert into user(name,gender,salary) values('丝丝','女',3000)";
try {
conn = JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
int i = stmt.executeUpdate(sql);
System.out.println(i>0?"成功":"失败");
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
@Test
public void read(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select * from user where gender='male'";
try {
conn = JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(name+":"+gender);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
@Test
public void update(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "update user set gender='female' where id = 8";
try {
conn = JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
int i = stmt.executeUpdate(sql);
System.out.println(i>0?"成功":"失败");
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
@Test
public void delete(){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "delete from user where salary IS NULL";
try {
conn = JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
int i = stmt.executeUpdate(sql);
System.out.println(i>0?"成功":"失败");
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
@Test
public void read(String name){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select * from user where name='"+name+"'";
System.out.println("sql="+sql);
try {
conn = JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
//while(rs!=null)
name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(name+":"+gender);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
public void createTable(String tableName){
}
public void dropTable(String tableName){
}
public static void main(String[] args) {
Crud crud = new Crud();
//crud.read(" 'or true or' ");
crud.createTable("system");
crud.dropTable("system");
}
}