JDBC(Java Data Base Connectivity)高级用法

一、批处理

Batch

对于大量的批处理,建议使用statement,因为PreparedStatement的预编译空间有限,当数据量特别大时,会发生异常。

示例

package com.lgd.jdbc;

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

/**
 * 批处理
 * @author liguodong
 */

public class Demo05 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement  statement = null;
        ResultSet rs1 = null;
        try {
            //1、加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //2、建立与数据库的连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");

            connection.setAutoCommit(false);//设置为手动提交
            statement = connection.createStatement();
            long start = System.currentTimeMillis();
            for(int i=0;i<20000;i++)
            {
                statement.addBatch("insert into user(username,pwd,regTime) values (‘神舟"+i+"号‘,666666,NOW())");
            }
            statement.executeBatch();
            connection.commit();//提交事务
            long end = System.currentTimeMillis();
            System.out.println("批量插入数据耗时(毫秒):"+(end-start));

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{

            //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
            if(rs1!=null){
                try {
                    rs1.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

二、事务

(一)事务基本概念

一组要么同时执行成功,要么同时执行失败的SQL语句,是数据库操

作的一个执行单元!

事务开始于:

连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。

前一个事务结束后,又输入了另外一条DML语句。

事务结束于:

执行COMMIT或ROLLBACK语句。

执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。

执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。

断开与数据库的连接。

执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句

事务的四大特点(ACID)

atomicity(原子性)

表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

consistency(一致性)

表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态。

isolation(隔离性)

事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

durability(持久性)

持久性事务完成之后,它对于系统的影响是永久性的。

事务隔离级别由低到高

读取未提交(Read Uncommitted)

读取已提交(Read Committed) (默认)

可重复读(Repeatable Read)

序列化(serializable)

示例:

package com.lgd.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 事务的用法
 * @author liguodong
 *
 */

public class Demo07 {
    @SuppressWarnings("null")
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement  statement1 = null;
        PreparedStatement  statement2 = null;

        try {
            //1、加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //2、建立与数据库的连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");

            connection.setAutoCommit(false);//JDBC中默认自动提交事务,默认是ture

            String sql1 = "insert into user (username,pwd) values(?,?)";

            statement1 = connection.prepareStatement(sql1);

            statement1.setObject(1, "卡特琳娜");
            statement1.setObject(2, "666");

            System.out.println("插入一条记录");

            try {
                Thread.sleep(6000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            String sql2 = "insert into user (username,pwd) values(?,?,?)";

            statement2 = connection.prepareStatement(sql2);
            statement2.setObject(1, "提莫快跑");
            statement2.setObject(2, "666");     

            statement2.executeUpdate();

            System.out.println("插入另外一条记录");

            connection.commit();//提交事务

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            try {
                connection.rollback(); //回滚操作
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally{

            //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
            if(statement2!=null){
                try {
                    statement2.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(statement1!=null){
                try {
                    statement1.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

会报SQL异常,并执行回滚操作,因此一条数据也不会插入到数据库中。

三、时间类型

java.util.Date

子类:java.sql.Date 表示年月日

子类:java.sql.Time 表示时分秒

子类:java.sql.Timestamp 表示年月日时分秒

日期比较处理

插入随机日期

取出指定日期范围的记录

示例

package com.lgd.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 时间处理(java.sql.Date, java.sql.Time, java.sql.Timestamp)
 * @author liguodong
 *
 */

public class Demo08 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement  statement = null;
        Statement rs1 = null;
        try {
            //1、加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //2、建立与数据库的连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");

            //3、测试PreparedStatement的基本用法   ?占位符
            String sql1 = "insert into user(username,pwd,regTime,lastLoginTime) values(?,?,?,?)";
            statement = connection.prepareStatement(sql1);

            statement.setObject(1, "模特");
            statement.setObject(2, "mm");
            //java.sql.Date没有空构造器,必须要传值。
            java.sql.Date date = new java.sql.Date(System.currentTimeMillis());

            //如果需要指定日期,可以使用Calendar,DateFormat
            java.sql.Timestamp stamp = new java.sql.Timestamp(System.currentTimeMillis());

            statement.setObject(3, date);

            statement.setTimestamp(4, stamp);

            statement.executeUpdate();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{

            //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
            if(rs1!=null){
                try {
                    rs1.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

package com.lgd.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

/**
 * 产生随机时间
 * @author liguodong
 *
 */

public class Demo09 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement  statement = null;
        Statement rs1 = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");

            for(int i=0; i<1000; i++){

                String sql1 = "insert into user(username,pwd,regTime,lastLoginTime) values(?,?,?,?)";
                statement = connection.prepareStatement(sql1);
                statement.setObject(1, "模特"+i);
                statement.setObject(2, "mm");

                //产生随机数
                int   rand = 1000000+new Random().nextInt(100000000);

                //java.sql.Date没有空构造器,必须要传值。
                java.sql.Date date = new java.sql.Date(System.currentTimeMillis()-rand);

                //如果需要指定日期,可以使用Calendar,DateFormat
                java.sql.Timestamp stamp = new java.sql.Timestamp(System.currentTimeMillis()-rand);
                statement.setObject(3, date);
                statement.setTimestamp(4, stamp);
                statement.executeUpdate();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
            if(rs1!=null){
                try {
                    rs1.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:

package com.lgd.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 时间处理,取出指定时间段的数据
 * @author liguodong
 */

public class Demo09 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement  statement = null;
        ResultSet rs1 = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");
            statement = connection.prepareStatement("select * from user where lastLoginTime>? and lastLoginTime<? order by lastLoginTime");

            java.sql.Timestamp startDate = new java.sql.Timestamp(strDate("2015-5-4 20:30:30"));
            java.sql.Timestamp endDate = new java.sql.Timestamp(strDate("2015-5-4 21:0:30"));

            System.out.println(startDate+"--"+endDate);
            statement.setObject(1, startDate);
            statement.setObject(2, endDate);

            rs1 = statement.executeQuery();
            while (rs1.next()) {
                //取的时候既可以用索引,还可以用名字。
                System.out.println(rs1.getInt("id")+"---"+rs1.getString("username")+"---"+rs1.getDate("regTime")+"---"+rs1.getTimestamp("lastLoginTime"));
                //System.out.println(rs1.getInt(1)+"---"+rs1.getString(2)+"---"+rs1.getDate(4)+"---"+rs1.getTimestamp(5));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{

            //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
            if(rs1!=null){
                try {
                    rs1.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将字符串代表的日期转化为long数字(格式:yyyy-MM-dd hh:mm:ss)
     * @param dateString
     * @return
     */
    public static long strDate(String dateString){
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
            return format.parse(dateString).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            return 0;
        }
    }
}

运行结果:

2015-05-04 20:30:30.0–2015-05-04 21:00:30.0

1886—模特882—2015-05-04—2015-05-04 20:31:07.0

1123—模特119—2015-05-04—2015-05-04 20:32:23.0

1048—模特44—2015-05-04—2015-05-04 20:40:20.0

1115—模特111—2015-05-04—2015-05-04 20:41:41.0

1300—模特296—2015-05-04—2015-05-04 20:43:28.0

1011—模特7—2015-05-04—2015-05-04 20:52:44.0

1716—模特712—2015-05-04—2015-05-04 20:53:39.0

1388—模特384—2015-05-04—2015-05-04 20:59:33.0

四、CLOB(Character Large Object)

用于存储大量的文本数据

大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。

Mysql中相关类型:

TINYTEXT最大长度为255(2^8-1)字符的TEXT列。

TEXT[(M)]最大长度为65535(2^16-1)字符的TEXT列。

MEDIUMTEXT最大长度为16777215(2^24一1)字符的TEXT列。

LONGTEXT最大长度为4294967295或4GB(2^32一1)字符的TEXT列。

示例

package com.lgd.jdbc;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * CLOB文本大对象的使用
 * 包含:将字符集、字符串内容插入到数据库的CLOB字段、将CLOB字段值取出来
 * @author liguodong
 *
 */

public class Demo10 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement  ps = null;
        ResultSet rs = null;
        Reader reader = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");          

            /////////输入///////////

            //ps = conn.prepareStatement("insert into user(username,myInfo) values(?,?)");

            /*ps.setString(1, "风城玫瑰");
            //将文本文件字节输入到数据库中
            ps.setClob(2, new FileReader(new File("d:/rose.txt")));
            ps.executeUpdate();

            ps.setString(1, "风城玫瑰");
            //将程序中的字符串输入到数据库的CLOB字段中
            ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("司职控球后卫,最年轻的MVP".getBytes()))));
            ps.executeUpdate();*/

            /////////导出///////////
            ps = conn.prepareStatement("select * from user where id=?");

            ps.setObject(1, 2006);
            rs = ps.executeQuery();

            while(rs.next()){
                java.sql.Clob clob = rs.getClob("myInfo");

                reader = clob.getCharacterStream();
                int temp=0;
                while((temp=reader.read())!=-1){
                    System.out.print((char)temp);
                }

            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{

            if(reader!=null){
                try {
                    reader.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            //执行顺序resultset-->statement-->connection这样的关闭顺序!一定要将三个try-catch块分开写!
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

运行结果:

五、BLOB(Binary Large Object)

用于存储大量的二进制数据

大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。

Mysql中相关类型:

一TINYBLOB最大长度为255(2^8-1)字节的BLOB列。

一BLOB[(M)]最大长度为65535(2^16-1)字节的BLOB列。

一MEDIUMBLOB最大长度为16777215(2^24-1)字节的BLOB列。

一LONGBLOB最大长度为4294967295或4GB(2^32-1)字节的BLOB列。

示例

package com.lgd.jdbc;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * BLOB文本大对象的使用
 * 包含:将字符集、字符串内容插入到数据库的CLOB字段、将CLOB字段值取出来
 * @author liguodong
 *
 */

public class Demo11 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement  ps = null;
        ResultSet rs = null;
        InputStream is = null;
        OutputStream os = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","liguodong");          

            /////////输入///////////
            /*ps = conn.prepareStatement("insert into userblob (username,headImg) values (?,?) ");
            ps.setString(1, "sunshine");

            //将图片输入到数据库中
            //方式一
            ps.setBlob(2,new FileInputStream(new File("d:/sunshine.png")));
            ps.execute();
            //方式二
            FileInputStream fis = new FileInputStream("d:/sunshine.png");
            ps.setBinaryStream(2, fis,fis.available());
            ps.execute();*/

            /////////导出///////////
            ps = conn.prepareStatement("select * from userblob where id=?");

            ps.setObject(1, 1);
            rs = ps.executeQuery();

            while(rs.next()){
                java.sql.Blob blob = rs.getBlob("headImg");

                is = blob.getBinaryStream();
                os = new FileOutputStream("d:/coco.png");
                int temp=0;
                while((temp=is.read())!=-1){
                    //System.out.print((char)temp);
                    os.write(temp);
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            if(os!=null){
                try {
                    os.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

运行结果:

时间: 2024-10-13 01:37:28

JDBC(Java Data Base Connectivity)高级用法的相关文章

JDBC(Java Data Base Connectivity)基本用法

一.什么是JDBC JDBC(Java Database Connection)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成.是java程序与数据库系统通信的标准APl. JDBC API使得开发人员可以使用纯 java 的方式来连接数据库,并执行操作. sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库.因此,sun公司决定自己提供一套api,凡是数据库想与Java进行连接的,数据库厂商自己必须实现JDBC这套接口.而数据库厂商的

Java基础知识强化25:JDBC(Java Data Base Connectivity,java数据库连接)

JDBC  1.    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名. 2.     有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JDBC API,就不必为访问Sybase数据库专门写一

JDBC(Java Data Base Connectivity)

1.JDBC快速入门 一.JDBC(Java Data Base Connectivity) 1.数据库驱动: 数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动 2.JDBC: sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来,统一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了. 六个步骤实现JD

(十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用

一.JDBC相关概念介绍 1.1 JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库. 如下图所示: 二.编写JDBC程序 2.1 搭建实验环境 A. 启动mysql数据库,即开启mysql/bin/mysqld.exe. B. 创建数据库,并创建所需的表.如下图(在创建数据库和表的时候请对其编码设置为utf-8编码否则后

JDBC(Java Data Base Connectivity——java数据库连接)

一.定义 数据库驱动:数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动 JDBC:sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来同一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了. 二.使用JDBC连接数据库 方法一: package com.shelly.jdbc; import java.s

Android Data Binding高级用法-Observable、动态生成Binding Class

设置View的id 虽然说Data Binding这种分层模式使得我们对数据的传递简单明了,一般情况下我们可以不设置View的id,不使用findViewById即可对View进行数据上一系列的操作,不过有时候根据情况我们需要对某些View设置id,但是还是可以不findViewById即可得到该控件的对象,因为设置id后ViewDataBinding类会自动生成对应的控件对象,如: <layout xmlns:android="http://schemas.android.com/apk

JAVA正则表达式高级用法(分组与捕获)

正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了.这里主要讲解一下在JAVA中实现了的正则的高级用法-分组与捕获.对于要重复单个字符,非常简单,直接在字符后卖弄加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a.这些限定符如下所示: X ?     X ,一次或一次也没有X *     X ,零次或多次X +     X ,一次或多次X { n }     X ,恰好 n 次X { n ,}     X ,

Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)

1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了.因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画所无法实现的功能. 2. ValueAnimator的高级用法: 在上篇文章中介绍补间动画缺点的时候有提到过,补间动画是只能对

Mybatis最入门---ResultMaps高级用法(上)

[一步是咫尺,一步即天涯] 接上文,我们基本的单表查询使用上文中的方式已经能够达到目的.但是,我们日常的业务中也存在着多表关联查询,结果是复杂的数据集合等等.本文我们就来介绍ResultMaps的高级用法,本文,我们先介绍基本的概念,具体用法实例在下一篇中专门演示给大家.敬请期待! ------------------------------------------------------------------------------------------------------------