21天学通Java学习笔记-Day12(MYsql-JDBC)

来源:互联网 发布:linux内核开发教程 编辑:程序博客网 时间:2024/06/06 07:19

        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 对象获得一个 StatementStatement 中的 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(); }}





0 0
原创粉丝点击