1、JDBC是什么?
Java DataBase Connectivity (Java语言连接数据库)
2、JDBC的本质是什么?
JDBC是SUN公司制定的一套接口(interface)接口都有调用者和实现者。
面向接口调用,面向接口写实现类,这都属于面向接口编程
3.为什么要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力。
多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
建议:
Animal a = new cat() ;
Animal a = new Dog ();
public void feed (Animal a){ }
不建议:
Dog d = new Dog ();
cat c =new cat ();
4.思考:为什么SUN制定一套JDBC接口呢?
因为每一个数据库的底层实现原理都不一样。oracle数据库有自己的原理。
MysQL数据库也有自己的原理。
Ms sqlserver数据库也有自己的原理。
每一个数据库产品都有自己独特的实现原理。
/*
Java程序员角色。不需要关心具体是哪个品牌的数据库,只需要面向JDBC接口写代码。面向接口编程,面向抽象编程,不要面向具体编程。
import java.util.* ;
public class JavaProgrammer
public static void main (string[] args) throws Exception{
JDBC jdbc = new MysQL ();
JDBC jdbc = new sqlserver () ;
//创建对象可以通过反射机制。
ResourceBundle bundle = ResourceBundle. getBundle("jdbc") ;
string className = bundle.getstring ( "className") ;
class c = class.forName (className) ;
JDBC jdbc = (JDBC)c.newInstance () ;
以下代码都是面向接口调用方法,不需要修改
jdbc.getConnection () ;
}
}
*/
5、DEc开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。
classpath= .;D: \course\06-JDBC\resources\MAysql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar
以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。
IDEA有自己的配置方式。
6.JDBC编程六步(需要背会)
第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
第二步:获取连接(表示Java的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭)
第三步:获取数据库操作对象((专门执行sql语句的对象)
第四步:执行SQL语句(DQL DML....)
第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。)
第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
public static void main (string [] args) {
try{
//1、注册驱动
Driver driver = new com.mysq1. jdbc.Driver();//多态,父类型引用指向子类型对象。DriverManager .registerDriver (driver) ;
//2、获取连接
/*
ur1:统一资源定位符(网络中某个资源的绝对路径)
https : // www.baidu . com/这就是URL。
URL包括哪几部分?
协议
IP
PORT
资源名
http:/ /182.61.200.7:80/index.html
http://通信协议
182.61.200.7服务器IP地址
80服务器上软件的端口
index.html是服务器上某个资源名
jdbc:mysq1://127.0.0.1:3306/bjpowernode
jdbc :mysql://协议
127.0.0.i IP地址
3306 mysql数据库端口号
bjpowernode具体的数[据库实例名。
说明: 1oca1host和127.0.0.1都是本机IP地址。
jdbc:mysq1://192.168.151.27:3306/bjpowernode
什么是通信协议,有什么用?
通信协议是通信之前就提前定好的数据传送格式。数据包具体怎么传数据,格式提前定好的。
*/
string url = "jdbc:mysql://192.168.151.27:3306/bjpowernstring
user = "root" ;
string password = "333";
Connection conn = DriverManager.getConnection (ur1, user,password) ;
//com.mysql .jdbc.JDBC4Connection@41cf53f9
system.out.println("数据库连接对象=" +conn) ;
//3、获取数据库操作对象(statement专门执行sql语句的)
statement stmt = conn . createstatement () ;
//4、执行sql
string sql = "insert into dept (deptno , dname , loc)values (50,'人事部,'北京')";
//专门执行DM语句的(insert delete update)
//返回值是"影响数据库中的记录条数”
int count = stmt.executeUpdate(sql);
system.out.println (count == 1 ?"保存成功" :"保存失败");
}catch(sQLException e){
e.printstackrrace () ;
}
finally{
//6、释放资源
//为了保证资源一定释放,在finally语句块中关闭资源1/并且要遵循从小到大依次关闭
//分别对其try ..catch
try {
if ( stmt !=null){
stmt.close () ;
}
}catch (sQLException e){
e.printstackTrace() ;
}
try{
if (conn !=nu11) {
conn . close () ;
}
}catch (sQLException e){
e.printstackTrace ();
}
JDBC删除!更新!
public class JDBCTesto2{
public static void main (string [] args) {
Connection conn = null;
statement stmt = null;
try{
//1、注册驱动
DriverManager.registerDriver(new com.mysqi.jdbc.Driver() );
//2、获取连接
conn = DriverManager.getconnection ("jdbc:mysq1://localhost:3306/bjpowernode " , "root" ,333 );
//3、获取数据库操作对象
stmt = conn. createstatement() ;
//4、执行sQL语句
llstring sql = "delete from dept where deptno = 40" ;
//JDBC中的sq1语句不需要提供分号结尾。
string sql ="update dept set dname = '销售部',loc = '天津' where deptno = 20" ;
int count = stmt.executeUpdate(sql) ;
system. out.println (count == 1 ?"删除成功"︰"删除失败");
}catch (sQLException e) {
e.printstackTrace() ;
}finally{
//6、释放资源
if (stmt != nu1l) {
try{
stmt.close() ;
}catch (sQLException e) {
e.printstackTrace () ;
}
}
if (conn !=nul1){
try {
conn . close () ;
}catch (sQLException e) {
e.printstackTrace () ;
}
}
}
}
JDBC注册驱动的另一种方式(常用)
import java.sql.*;
public class JDBCTest03{
public static viod main (String[] args[]){
try{
//1.注册驱动
//这是注册驱动的第一种写法。
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//注册驱动的第二种方式;常用
//为什么这种方式常用?因为参数是一个字符串,字符串可以写到xxx.properties文件中。
//以下方法不需要接收返回值,因为我们只想用它的类加载动作。
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306//bjpowernode","root","333");
//com.mysql.jdbc.JDBC
System.out.println(coon);
}catch(SQLException e){
e.printStackTrace();
}cath(ClassNotFoundException e){
e.printStackTrace();
}
}
}
JDBC事务处理:
/*
*create table t_act(
*actno int,
*balance double(7,2)//注意:7表示有效数字的个数,2表示小数位的个数。
*) ;
*insert into t act (actno,balance) values(111,20000);
*insert into t act(actno, balance) values(222,0);
*comrnit ;
*select *from t _act;
*重点三行代码?
*conn.setAutoComit (false);
*conn. commit();
*conn. rollback();
*/
public class JDBCTest11 {
public static void main (string [ ] args){
Connection conn = null;
Preparedstatement ps = null;
try {
//1、注册驱动
class.forName ( " com.mysql.jdbc.Driver");
//2、获取连接
conn=DriverNanager.getConnection(url"jdbc:mysql://localhost:3306/bjpowernode",user."root" ,password."333");
//将自动提交机制修改为手动提交
conn . setAutoCommit (false) ; //开启事务
//3、获取预编译的数据库操作对象
string sql = "“update t_act set balance = ? where actno = ?" ;
ps= conn.preparestatement (sgl) ;
//给?传值
ps.setDouble (parameterlndex: 1,x:10000);
ps.setint ( parameterlndex:2,x:111);
int count =ps.executeUpdate () ;
// string s = null;
//s.toString();
//给?传值
ps.setDouble ( parameterIndex: 1,x:10000) ;
ps.setInt ( parameterIndex:2,×:222);
count += ps.executeupdate ();
system.out.println(count== 2 ?"转账成功":“转账失败");
//程序能够走到这里说明以上程序没有异常,事务结束,手动提交数据
conn.commit);//提交事务
}catch(Exception e){
//回滚事务
if(conn != null){
try {
conn. rollback();
}catch (SQLException e1){
e1.printstackTrace ();
}
}
e.printstackTrace(o) ;
}finally {
//6、释放资源
if(ps!=null) {
try{
ps.close();
}cath(SQLException e){
e.pxintstackTxace();
}
}
if(conn!=null) {
try{
conn.close();
}cath(SQLException e){
e.pxintstackTxace();
}
}
}
JDBC的封装类
悲观锁:事务必须排队执行。数据锁住了,不允许并发。
乐观锁:支持并发,事务也不需要排队,只不过需要一个版本号。
行级锁:(悲观锁)在select语句后边加上 for update
select ename , job , sal from emp where job= 'MANAGER"for update;.