您的位置:首页 > 编程语言 > Java开发

JDBC基础学习--Java学习记录

2019-06-14 00:15 155 查看

###JDBC: Java的数据库连接规范。

JDBC是一种Java技术可以实现Java代码连接数据库,然后操作数据库。
编程语言最核心的功能之一:就是增删改查处理,分析数据等都要与数据库的数据进行交互。

什么是JDBC:Java DataBase Connectivity:(Java的数据库连接) JDBC是Java访问数据库的`标准规范`
JDBC的作用:Java通过JDBC就可以操作数据库了

JDBC是Java连接数据库的规范:所有的数据库厂商都要按照这个标准来设计连接数据库的实现。
JDBC中都是一些接口,具体的实现交给数据库厂商去实现。
程序员只需要学习JDBC这些接口,然后拿着具体数据库厂商的实现就可以操作对应数据库了。

使用JDBC必须有:
(1)JDBC规范代码:sun公司提供,已经在JDK中。
(2)对应的数据库实现:数据库驱动。
思想:Java定义连接数据库的规范:JDBC
数据库厂商实现JDBC规范:产生驱动。
程序员学习JDBC规范即可!

##驱动的加载。

开发JDBC连接数据库的程序需要两个重要因素:
a.JDBC的规范(JDK自带)
1. java.sql:JDBC访问数据库的基础包,在JavaSE中的包。如:java.sql.Connection
2. javax.sql: JDBC访问数据库的扩展包。

b.对应数据库厂商的驱动:mysql-connector-java-5.1.37-bin.jar
点击驱动jar包,右键-> add as library
3. 数据库的驱动,各大数据库厂商来实现。如:MySQL的驱动:
com.mysql.jdbc.Driver

MySQL数据库的驱动名称是: com.mysql.jdbc.Driver
DriverManager:驱动管理器类:
-- public static void registerDriver(java.sql.Driver driver):注册驱动

小结:
从JDK1.5以后这个注册驱动就可以省略了
注册驱动的企业级写法:
驱动中com.mysql.jdbc.Driver类中已经通过静态代码块
实现了驱动对象的创建和自动注册到驱动管理器
所以我们只需要加载驱动类即可!!
格式:Class.forName("com.mysql.jdbc.Driver");
*/
public class DriverDemo01 {
public static void main(String[] args) throws Exception {
/** 驱动必须加载才可以使用,否则驱动只是一个死的代码 */
/** 1.创建驱动对象  */
//Driver driver = new com.mysql.jdbc.Driver();
/** 2.给当前程序注册驱动
*  JDBC提供了一个驱动管理器,负责加载驱动,然后以后
*  操作数据库都是由驱动管理器来维护的。
*
*  驱动是自动注册的!!我们无需手工注册驱动
*/
// DriverManager.registerDriver(driver);

/** 驱动中已经通过静态代码块实现了驱动对象的创建和自动注册到驱动管理器
*  所以我们只需要加载驱动类即可!!
* */
Class.forName("com.mysql.jdbc.Driver");

/** 到这儿就可以使用了,接下来通过驱动管理器使用驱动去连接对应的数据库 */
}
}
目标:JDBC获取与数据库的连接对象。
Java提供了一个连接对象:java.sql.Connection,代表了与数据库的连接通道。

JDBC获取连接的步骤:
(1)加载驱动,注册驱动到驱动管理器,操作数据库最终是由驱动完成的。
(2)通过驱动管理器调用方法得到连接对象。
(3)通过连接操作数据库
DriverManager获取连接的方法:
1.public static Connection getConnection(String url ,java.util.Properties info);
-- 参数一:连接数据库的地址
jdbc:mysql://localhost:3306/dlei?characterEncoding=utf8
规范:数据库类型://数据库地址:端口/连接的数据库名称?编码参数等
-- 参数一:申明连接数据库的用户名和密码。
2.public static Connection getConnection(String url, String user, String password)
小结:
获取连接
Connection con = DriverManager.getConnection(url,"root","root");

*/
public class JDBCDemo01 {
public static void main(String[] args) throws Exception {
/**  (1)加载驱动,注册驱动到驱动管理器,操作数据库最终是由驱动完成的。 */
Class.forName("com.mysql.jdbc.Driver");
/**  (2)通过驱动管理器调用方法得到连接对象。 */
/*
// 地址
String url = "jdbc:mysql://localhost:3306/test";
// 封装用户名和密码
Properties pro = new Properties();
pro.setProperty("user","root");
pro.setProperty("password","root");
(3)通过连接操作数据库
Connection con = DriverManager.getConnection(url , pro); */

// 地址
String url = "jdbc:mysql://localhost:3306/test";
/** (3)连接数据库: 这种方式封装了上面的写法,推荐使用! */
Connection con = DriverManager.getConnection(url,"root","root");
System.out.println(con);
}
}

JDBC代码实现数据的查询操作。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
*  (1)注册驱动
*  (2)获取连接
*  (3)得到发送SQL语句的对象Statement
*       Statement stm = con.createStatement();
*  (4)正式发送并执行sql语句得到结果集对象ResultSet
*  (5)解析结果集的数据(遍历结果集)
*  (6)关闭资源
*
*  Statement发送执行sql语句查询数据的方法:
*        -- boolean execute(String sql):建表操作
*        -- int executeUpdate(String sql) throws SQLException:增删改数据返回影响的行数
*        -- ResultSet executeQuery(String sql) throws SQLException:查询数据返回结果集
*
*  ResultSet的方法:
*        -- boolean next():向结果集下一行移动,移动后判断改行是否有数据,有返回true ,反之
*        -- String getString(String 列名称): 根据列名称取当前行的列值。返回String
*        -- int getInt(String 列名称): 根据列名称取当前行的列值。返回int
*        -- double getDouble(String 列名称): 根据列名称取当前行的列值。返回double
*        -- Object getObject(String 列名称): 根据列名称取当前行的列值。返回Object
*  小结:
*      查询数据用:ResultSet executeQuery(String sql) throws SQLException:查询数据返回结果集
*/
public class JDBCQueryDemo01 {
public static void main(String[] args) {
Connection con =  null ;
Statement stm = null ;
ResultSet rs = null ;
try {
// (1)注册驱动
Class.forName("com.mysql.jdbc.Driver");
// (2)获取连接
String url = "jdbc:mysql://127.0.0.1:3306/test";
con = DriverManager.getConnection(url,"root","root");
// (3)得到发送SQL语句的对象Statement
stm = con.createStatement();

// (4)正式发送并执行sql语句得到结果集对象ResultSet
//            ResultSet rs = stm.executeQuery("select * from tb_user ");
rs = stm.executeQuery("select * from tb_user where id > 3");
// (5)解析结果集的数据(遍历结果集)
//  rs.next():往下移动光标,移动到下一行,看下一行是否有数据有返回true,反之
while(rs.next()){
// 根据列名称取当前行的列值
//                    int id = rs.getInt(0); // 不推荐,按照位置找当前行的列值
int id = rs.getInt("id");
String logiName = rs.getString("loginName");
String passWord = rs.getString("passWord");
String userName = rs.getObject("userName")+"";
//                    String userName = rs.getString("userName");
System.out.println("id="+id+",lginName="+logiName+",passWord="+passWord
+",userName="+userName);
}

} catch (Exception e) {
e.printStackTrace();
} finally {
// (5)关闭资源
try{
if(stm!=null)stm.close();
}catch (Exception e){
e.printStackTrace();
}
try{
if(con!=null)con.close();
}catch (Exception e){
e.printStackTrace();
}
try{
if(rs!=null)rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
目标:JDBC事务的引入。

转账功能:
一个账户减去500 ,另一个账户加500

Connection`接口中与事务有关的方法
1.
void setAutoCommit(boolean autoCommit) throws SQLException;
false:开启事务, ture:关闭事务

2.
void commit() throws SQLException;
提交事务

3.
void rollback() throws SQLException;
回滚事务
小结:
这个事物只在一次连接中操作有效,用完以后,数据库依然是自动提交!!

*/
public class TransactionDemo01 {
public static void main(String[] args) {
Connection con =  null ;
Statement stm = null ;
try {
// (1)注册驱动
Class.forName("com.mysql.jdbc.Driver")
1c140
;
// (2)获取连接
String url = "jdbc:mysql://127.0.0.1:3306/test";
con = DriverManager.getConnection(url,"root","root");
/** 1.事物开启的第一个步骤:关闭自动提交 */
con.setAutoCommit(false);
// (3)得到发送SQL语句的对象Statement
stm = con.createStatement();
// (4)一个账户-500
int count = stm.executeUpdate("update account set balance = balance - 500 where name ='张三'");
System.out.println("给张三-500结果:"+count);
// int i = 10 / 0;
int count1 = stm.executeUpdate("update account set balance = balance + 500 where name ='李四'");
System.out.println("给李四+500结果:"+count1);
/** 2.事物开启的第二个步骤:无异常就提交*/
con.commit();// 提交事物!!
System.out.println("事物提交!!转账成功!");
} catch (Exception e) {
e.printStackTrace();
try {
/** 3.事物开启的第三个步骤:有异常就回滚*/
con.rollback(); // 回滚事物!!
System.out.println("事物被回滚了!!转账失败!");
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
// (5)关闭资源
try{
if(stm!=null)stm.close();
}catch (Exception e){
e.printStackTrace();
}
try{
if(con!=null)con.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
目标: 连接工厂的设计。

什么是连接工厂(工厂模式):
工厂就是集中生成连接,关闭连接,配置连接信息的地方,
工厂只需要一个,以后项目任何地方要用连接找工厂,要释放连接找工厂
要更改数据的配置信息找工厂。
连接工厂要提供三个功能:
1.配置信息
2.生产连接
3.释放资源
小结:
请使用连接工厂!连接工厂的目的:简化代码!优化系统的维护和扩展!!
*/
public class ConnectionFactory {

/**
*  1.配置信息:常量做配置
*  驱动名称!
*/
public static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
/**
* 数据库的连接地址
*/
public static final String DATA_BASE_URL =  "jdbc:mysql://127.0.0.1:3306/test";
/**
* 数据库的用户名
*/
public static final String USER_NAME =  "root";
/**
* 数据库的密码
*/
public static final String PASS_WORD =  "root";

/** 注册驱动:*/
static{
try {
Class.forName(DRIVER_NAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
*  2.生产连接
*/
public static Connection getConnection() throws Exception {
// (2)获取连接
return  DriverManager.getConnection(DATA_BASE_URL,USER_NAME,PASS_WORD);
}

/**
*  3.关闭资源
* @param con 连接对象
* @param stm 发送SQL语句的对象
* @param rs  结果集对象
*/
public static void close(Connection con , Statement stm  ,ResultSet rs) {
try{
if(stm!=null)stm.close();
}catch (Exception e){
e.printStackTrace();
}
try{
if(con!=null)con.close();
}catch (Exception e){
e.printStackTrace();
}
try{
if(rs!=null)rs.close();
}catch (Exception e){
e.printStackTrace();
}
}

}
*  目标:连接工厂的使用!!
*/
public class JDBCQueryDemo02 {
public static void main(String[] args) {
Connection con =  null ;
Statement stm = null ;
ResultSet rs = null ;
try {

con = ConnectionFactory.getConnection();
// (3)得到发送SQL语句的对象Statement
stm = con.createStatement();
// (4)正式发送并执行sql语句得到结果集对象ResultSet
//            ResultSet rs = stm.executeQuery("select * from tb_user ");
rs = stm.executeQuery("select * from tb_user where id > 3");
// (5)解析结果集的数据(遍历结果集)
//  rs.next():往下移动光标,移动到下一行,看下一行是否有数据有返回true,反之
while(rs.next()){
// 根据列名称取当前行的列值
//                    int id = rs.getInt(0); // 不推荐,按照位置找当前行的列值
int id = rs.getInt("id");
String logiName = rs.getString("loginName");
String passWord = rs.getString("passWord");
String userName = rs.getObject("userName")+"";
//                    String userName = rs.getString("userName");
System.out.println("id="+id+",lginName="+logiName+",passWord="+passWord
+",userName="+userName);
}

} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源!
ConnectionFactory.close(con,stm,rs);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: