JDBC

MYQL 基础:

用命令行进入MYSQL:shell > mysql -h host(主机) -u user(用户名) -p 回车,等待输入密码

退出MYSQL:mysql > quit 回车 ,会看到 bye

mysql 关键字不区分大小写。

查看版本:mysql > select version( );

mysql以分号结束( ; )

查看当前日期:mysql > select current_date;

当前的日期时间:mysql > select now( );

当前用户:mysql > select user( );

查看mysql有多少数据库:mysql > show databases;

创建一个数据库:mysql > create database demo( 数据库名);

进入数据库:mysql > use test( 数据库名);

用命令行直接进入指定数据库:shell > mysql -h host(主机) -u user(用户名) -p demo(数据库名)

查看进入的数据库中的所有表:mysql > show tables;

查看表结构: mysql > desc zx(表名);

创建表:mysql > create table zx(表名) (   列   );

MYSQL 常用数据类型:

int  / bigint                整数类型/大整数类型

float / double            单精度/双精度浮点数

date                           日期类型(java 中 Date对象存入时只保存日期部分)

time                           时间类型( java 中 Date对象存入时只保存时间部分 )

datetime                   日期时间类型

year                           年类型(只保存 年)

char                           定长字符串

varchar                      可变长度字符串

text / longtext           文本/超大文本

修改表结构:

增加列:mysql > alter table zx(表名) add( 要增加的列 );

增加默认值例如:mysql > alter table zx add( aaa varchar(30) default 'zzzzzz' ); //用 default 设置默认值

修改列:mysql > alter table zx modify aaa int(10) default 123 ; //将 zx 表中 aaa 修改类型和默认值

删除列:mysql > alter table zx drop aaa ; //将表 zx 中的 aaa 列删除

表重命名:mysql > alter table zx rename zzxx ; //将表 zx 重命名 zzxx

删除表:mysql > drop table zzxx ; //删除表 zzxx

MYSQL 五种约束:

not null        非空

unique        唯一

primary key    主键(每张表只允许最多一个主键)

foreign key    外键(同一张表可以拥有多个外键)

check        检查

非空约束(不能为空):

添加非空约束:mysql > alter table zx add( eee int default 123 not null , fff char not null ); // eee 非空有默认值,fff 非空(不论创建表还是修改表只要在列后面添加 not null 就可以)

取消非空约束:mysql > alter table zx modify eee varchar(10) null ; //改成null

唯一约束(数据不能重复):

创建时指定唯一约束:mysql > create table zx ( aaa int ,unique(aaa) );  //用 unique 指定唯一约束

修改时指定唯一约束:mysql > alter table zx modify aaa int unique ;  //用 unique 指定唯一约束

给列添加唯一约束:mysql > alter table zx add unique( aaa );  //aaa必须是已经存在的列

删除列的唯一约束:mysql > alter table zx drop index aaa;

主键约束(不允许重复也不允许为空):

建表时创建主键约束:mysql > create table zx ( aaa int primary key ); //用 primary key 创建主键、

增加已有列主键约束:mysql > alter table zx modify aaa int primary key ;

删除主键约束:mysql > alter table zx drop primary key;

外键约束(子表外键对应主表主键,必须有主表的主键,而且子表外键中的数据与主表主键数据一致):

使用 foreign key 指定外键,用法与主键相同。

插入数据:mysql > insert into zx(表名) values ( 需要添加的数据,顺序与列顺序相同);

一次插入多条数据格式:insert into zx values

( 需要添加的数据,顺序与列顺序相同 ),

( 需要添加的数据,顺序与列顺序相同 ),

( 需要添加的数据,顺序与列顺序相同 );

一次修改表中同一列所有数据:update zx(表名) set aaa(列名)='111';  //将所有 aaa 列的数据都会改成 '111'

根据条件修改数据:update zx set aaa='aaa' where bbb=111;  //根据bbb=111找到数据行修改 aaa 列的数据为 '111',where 相当于java中的 if

删除数据全部数据:delete from zx(表名);

delete from 是整行删除

根据条件删除:delete from zx where bbb=111;  //删除zxb表中bbb=111的整一行数据

查看表中所有数据:select * from zx(表名);  // * 代表所有

查看列的所有数据:select bbb(列名) from zx;

根据条件查看数据:select * from zx where bbb=111;

select aaa,bbb from zx where bbb=111;

数据去重:select distinct * from zx;

多表联查格式:select 列1,列2 from 表1,表2 where 表1.列2 = 表2.列3 ;

逻辑操作符:and( 并且 ) , or(或者)

升序排序:select * from zx order by aaa;  //按照aaa顺序排列

降序排列:selcet * from zx order by aaa desc;  //按照aaa逆序排列

正则表达式匹配:% ,a%(以a开头) , %a%(包含a) , %a(以a结尾)//与java的正则表达式用法相似

JDBC

JDBC中包括两个包:java.sql 和 javax.sql

java.sql:基本功能。这个包中的类和接口主要针对基本的数据库编程服务和一些如批量更新,事物隔离,可滚动蛮好结果等高级处理。

javax.sql:扩展功能。主要为数据库方面的高级操作提供接口和类。

JDBC 编程步骤(重点)

1.注册一个 Driver

注册驱动程序有三种方式:

1:Class.forName( "com.mysql.jdbc.Driver" );

//java规范中明确规定:所有驱动程序必须在静态初始化代码块中将驱动注册到驱动程序 管理器中。

2:Driver drv = new com.mysql.jdbc.Driver( );

DriverManager.registerDriver( drv);

// DriverManager 类 :管理一组 JDBC 驱动程序的基本服务。

//registerDriver( Driver driver) 是 DriverManager 类中方法:向 DriverManager 注册给定驱动程序。

3:通过设置系统属性 jdbc.drivers,编译时在虚拟机中加载驱动.

javac xxx.java ( 要确保驱动包在 classpath 里)

java –D jdbc.drivers=驱动全名 类名

使用系统属性名,加载驱动 -D 表示为系统属性赋值

附 : mysql 的 Driver 的全名 com.mysql.jdbc.Driver

以上是 JDBC 中驱动加载的时序图。时序图主要有以下 7 个动作:

1. 客户调用 Class.forName(“XXXDriver”)加载驱动。

2. 此时此驱动类首先在其静态语句块中初始化此驱动的实例。

3. 再向驱动管理器注册此驱动。

4. 客户向驱动管理器 DriverManager 调用 getConnection 方法,

5. DriverManager 调用注册到它上面的能够理解此 URL 的驱动建立一个连接,

6. 在该驱动中建立一个连接,一般会创建一个对应于数据库提供商的 XXXConnection

连接对象,

7. 驱动向客户返回此连接对象,不过在客户调用的 getConnection 方法中返回的为一个  java.sql.Connection 接口,而具体的驱动返回一个实现 java.sql.Connection 接口的具体类。

2.建立连接

Connection conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/demo" , "root" , "root" );

//“jdbc : mysql : // IP地址 : 端口号 / 数据库名”, "数据库用户名" , "数据库密码 "

/*

Connection 连接是通过 DriverManager 的静态方法 getConnection(.....)来得到的,这个方法 的实质是把参数传到实际的 Driver 中的 connect()方法中来获得数据库连接的。

Oracle URL 的格式:

jdbc:oracle:thin: (协议)@XXX.XXX.X.XXX:XXXX(IP 地址及端口号):XXXXXXX(所 使用的库名)

MySql URL 的写法 例:

jdbc:mysql://192.168.8.21:3306/test

*/

import java.sql.*;
public class JDBCTest {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "root");System.out.println("连接成功!");}
}

根据配置文件连接数据库:

配置文件 mysql.ini 内容:

driver = com.mysql.jdbc.Driver

url = jdbc:mysql://127.0.0.1:3306/demo

use = root

passwold = root

代码:

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCTest {private static String driver;private static String url;private static String use;private static String passwold;public static void main(String[] args) throws Exception {Properties prop = new Properties();String paramFile = "mysql.ini";prop.load(new FileInputStream(paramFile));driver = prop.getProperty("driver");url = prop.getProperty("url");use = prop.getProperty("use");passwold = prop.getProperty("passwold");Class.forName(driver);Connection conn = DriverManager.getConnection(url, use, passwold);System.out.println("连接成功!");}
}

3.获取一个Statement 对象

Statement stmt = conn.createStatement();

4.通过 Statement 执行 sql 语句

stmt.executeQuery(String sql);     //返回一个查询结果集。

stmt.executeUpdate(String sql);  //返回值为 int 型,表示影响记录的条数。

//将 sql 语句通过连接发送到数据库中执行,以实现对数据库的操作。

5.处理结果集

使用 Connection 对象获得一个 Statement,Statement 中的 executeQuery(String sql) 方法可 以使用 select 语句查询,并且返回一个结果集 ResultSet 通过遍历这个结果集,可以获得 select 语句的查寻结果,ResultSet 的 next()方法会操作一个游标从第一条记录的前面开始读取,直 到最后一条记录。executeUpdate(String sql) 方法用于执行 DDL 和 DML 语句,比如可以 update,delete 操作。

只有执行 select 语句才有结果集返回。

代码:

import java.sql.*;
public class JDBCTest3 {public static void main(String[] args) throws Exception{Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "root");Statement stmt = conn.createStatement();    //获取一个Statement 对象String s = "insert into zx values ('www',111,'1qa'),('fff',345,'2w3e'),('ttt',123,'12wsde3');";stmt.executeUpdate(s);String sql = "select * from zx;";ResultSet rs = stmt.executeQuery(sql);while(rs.next()){System.out.println("aaa="+rs.getString("aaa"));System.out.println("bbb="+rs.getInt("bbb"));System.out.println("ccc="+rs.getString("ccc"));}rs.close();stmt.close();conn.close();}
}

6.     关闭数据库连接(释放资源)

rs.close();     stmt.close();     conn.close();

ResultSet        Statement      Connection 是依次依赖的。

注意:要按先 ResultSet 结果集,后 Statement,最后 Connection 的顺序关闭资源, 因为 Statement 和 ResultSet 是需要连接时才可以使用的,所以在使用结束之后有 可能其它的 Statement 还需要连接,所以不能现关闭 Connection。

JDBC重要接口:

Statement :  SQL 语句执行接口。

Statement 接口代表了一个数据库的状态,在向数据库发送相应的 SQL 语句 时,都需要创建 Statement 接口或者 PreparedStatement 接口。在具体应用中, Statement 主要用于操作不带参数(可以直接运行)的 SQL 语句,比如删除语句、 添加或更新。Statement 接口代表了一个数据库的状态,在向数据库发送相应的 SQL 语句 时,都需要创建 Statement 接口或者 PreparedStatement 接口。在具体应用中, Statement 主要用于操作不带参数(可以直接运行)的 SQL 语句,比如删除语句、 添加或更新。

PreparedStatement :预编译的 Statement。

第一步:通过连接获得 PreparedStatement 对象,用带占位符(?) 的 sql 语句构造。

String s =   "insert into zx values (?,?,?);"

PreparedStatement pstm = con.preparedStatement(s);

第二步:设置参数

pstm.setString(1,"aaa");  //前面的 1 是?所在的位置 , 后面的"aaa",是要输入的内容

pstm.setInt( 2 , 123 );

pstm.setString( 3 , "1qaz" );

第三步:执行 sql 语句

pstm.excuteUpdate();

例子代码:

import java.sql.*;
public class JDBCTest4 {public static void main(String[] args) throws SQLException, ClassNotFoundException {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "123root");Statement stmt = conn.createStatement();String s = "insert into zx values (?,?,?);";PreparedStatement ps = conn.prepareStatement(s);ps.setString(1, "xxxx");ps.setInt(2, 444444);ps.setString(3, "eeeeeee");ps.executeUpdate();String sql = "select * from zx;";ResultSet rs = ps.executeQuery(sql);while(rs.next()){System.out.println("aaa="+rs.getString("aaa"));System.out.println("bbb="+rs.getInt("bbb"));System.out.println("ccc="+rs.getString("ccc"));}rs.close();ps.close();stmt.close();conn.close();}
}

statement 和 PreparedStatement  的不同 :

statement 发送完整的 Sql 语句到数据库不是直接执行而是由数据库先编译,再运行。 而 PreparedStatement 是先发送带参数的 Sql 语句,再发送一组参数值。如果是同构的 sql 语句,PreparedStatement 的效率要比 statement 高。而对于异构的 sql 则两者效率差不多。

同构:两个 Sql 语句可编译部分是相同的,只有参数值不同。

异构:整个 sql 语句的格式是不同的

注意:1、使用预编译的 Statement 编译多条 Sql 语句一次执行

2、可以跨数据库使用,编写通用程序

3、能用预编译时尽量用预编译

ResultSetMetaData :可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。

例子代码:

import java.sql.*;
public class JDBCTest5 {public static void main(String[] args) throws SQLException, ClassNotFoundException {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "123root");Statement stmt = conn.createStatement(); String sql = "select * from zx;"; PreparedStatement ps = conn.prepareStatement(sql);ResultSet rs = ps.executeQuery(); ResultSetMetaData rm = rs.getMetaData();   //创建一个 ResultSetMetaData 对象System.out.println(rm.getColumnCount());   // getColumnCount() 方法返回此 ResultSet 对象中的列数。System.out.println(rm.getColumnName(2));  //getColumnName(int i) 方法返回指定列的名称。rs.close(); ps.close();stmt.close();conn.close();}
}

JDBC 中使用 Transaction 编程

1 事务的四大特性

事务是具备以下特征(ACID)的工作单元:

(1) 原子性

 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据 修改操作要么全部执行,要么完全不执行。

原子操作,也就是不可分割的操作,必须一起成功一起失败。

(2) 一致性

事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这 种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致 的。

(3) 分离性

分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁 起来,不被其它企图进行修改的事务看到。

(4) 持久性

持久性意味着当系统或介质发生故障时, 确保已提交事务的更新不能丢失。即一旦一个 事务提交,DBMS 保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。

持久性通过数据库备份和恢复来保证。

2 事务处理三步曲

① connection.setAutoCommit(false);   //把自动提交关闭。(将此连接的自动提交模式设置为给定状态。)

② 正常的 DB 操作         //若有一条 SQL 语句失败了,自动回滚

③ connection.commit()      //主动提交。(使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。)

或 connection.rollback()   //主动回滚。(取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。)

批量更新:

批量处理功能必须要底层数据库支持,可以通过调用 DatabaseMetaData 的 supportsBatchUpdates 方法来查看数据库是否支持批量更新。

使用批量更新要创建一个 Statement 对象,利用 addBatch( String sql ) 方法添加多条SQL语句,然后调用  executeBatch() 方法执行所有SQL语句。

例子代码:

import java.sql.*;
public class JDBCTest6 {public static void main(String[] args) throws SQLException, ClassNotFoundException {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "123root");Statement stmt = conn.createStatement();String sql1 = "insert into zx values ('111',111,'111');";String sql2 = "insert into zx values ('222',222,'222');";String sql3 = "insert into zx values ('333',333,'333');";String sql4 = "insert into zx values ('444',444,'444');";stmt.addBatch(sql1);stmt.addBatch(sql2);stmt.addBatch(sql3);stmt.addBatch(sql4);stmt.executeBatch();stmt.close();conn.close();}
}

21天学通Java学习笔记-Day12(MYsql-JDBC)相关推荐

  1. 21天学通Java学习笔记-Day01

    21天学通java 中文第6版 下载地址:点击打开链接 Day01: 命令行查看和设置classpath: 查看:echo %classpath% 设置:set classpath = %classp ...

  2. 21天学通Java学习笔记-Day04

    Day04: 静态数组是一组对象,每个元素都是一个对象,所以用 new 创建新的数组实例. class test{public static void main(String[]args){a[] a ...

  3. 21天学通Java学习笔记-Day02

    Day02: java 程序是由 类,对象 组成.对象和类是由 方法,变量组成.方法是由 语句,表达式 组成.表达式是由 运算符 组成. 3种变量: 实例变量:定义对象的属性. 类 变 量 : 定义类 ...

  4. 21天学通Java学习笔记-Day06

    Day06: 限定符: *限定符 public ,protected 和 private 用于控制类,方法和变量的访问 *限定符 static 用于创建类方法和类变量 *限定符 final 用于固定( ...

  5. 21天学通Java学习笔记-Day11(常用类)

    java 常用类(重点): String 类: String 类代表字符串.创建以后不能更变. public class tests { public static void main(String[ ...

  6. 21天学通Java学习笔记-Day10(网路编程)

    网路编程(重点): TCP 程序:Socket 程序,双方必须建立可靠连接 UTP 程序:数据报程序,建立的连接属于不可靠 开发第一个Socket 程序: 如果要进行网络程序的开发,首先需要两个类: ...

  7. 21天学通java第7版pdf_21天学通Java.第7版.pdf

    <21天学通Java(第7版)>是初学者学习Java编程语言的畅销经典教程,循序渐进地介绍了Java编程语言知识,并提供了丰富的实例和练习:同时全面涵盖了Java 8这一新标准以及与And ...

  8. 《21天学通Java(第6版)》—— 1.4 属性和行为

    本节书摘来异步社区<21天学通Java(第6版)>一书中的第1章,第1.4节,作者:[美]Rogers Cadenhead,更多章节内容可以访问云栖社区"异步社区"公众 ...

  9. 《21天学通Java(第7版)》—— 第2章 Java编程基础 2.1 语句和表达式

    本节书摘来异步社区<21天学通Java(第7版)>一书中的第2章,第2.1节,作者: [美]Rogers Cadenhead(罗格斯 卡登海德),更多章节内容可以访问云栖社区"异 ...

最新文章

  1. id文本框适应文字_国家宣布!快递要大降价?个人ID将取代邮政编码
  2. 【相关性搜索】 多字段搜索的两种方式——词中心与字段中心
  3. 机器学习系列之手把手教你实现一个分类回归树
  4. Javascript中{}+[]===0为true,而[]+{}===0为false
  5. 华科博士 201 万,西安交大本科生 100 万!华为「天才少年」校招薪资曝光
  6. 2017-2018-1 20155226 20155234 《信息安全系统设计基础》 实验一总结
  7. git -- 练习的笔记
  8. 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
  9. [转载] java简易爬虫Crawler
  10. 让自己的网站可以被搜索
  11. netlogo-入门-学习记录
  12. CodeIgniter入门
  13. InsecureProgramming-master——abo3
  14. 软件工程 实践者的研究方法 第12章答案
  15. BCDEDIT - 启动配置数据存储编辑器
  16. unity代码控制物体的透明度总结
  17. 孤独的灵魂该去何处安家
  18. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】
  19. ReentrantReadWriteLock——读写锁如何升级,为何读写锁不能插队?
  20. 深度卷积神经网络的数字实现——二维卷积的纯数字电路实现(二)

热门文章

  1. 计算机控制电梯报告总结,电梯控制系统论文
  2. Arduino Nano 做的一个航模小遥控器
  3. DB2的日期时间类型以及转换问题
  4. 探索设计之路-Photoshop【移动选框工具】
  5. TPS54331DDAR —— DCDC降压设计12V 至 5.00V @ 3A【电感电容选择计算】
  6. 手机里的照片导入计算机的方法,怎么把手机照片导入电脑_手机照片传到电脑的方法...
  7. javaScript简单项目案例
  8. 【图神经网络】图分类学习研究综述[2]:基于图神经网络的图分类
  9. 还心灵一个安静的净土
  10. ※ 数字图像——绿幕抠像