JDBC技术(mysql)

2 篇文章 0 订阅

JDBC是什么

JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。

JDBC库中所包含的API任务通常与数据库使用:

1.连接到数据库

2.创建SQL或MySQL语句

3.在数据库中执行SQL或MySQL查询

4.查看和修改记录

Statement & PreparedStatement的区别

这个链接介绍十分详细
http://blog.csdn.net/jiangwei0910410003/article/details/26143977

连接到数据库、关闭连接

//从配置文件中读取数据连接到数据库中
package com.vvvvvv.jdbc;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtil {

    static Properties pros = null;// 可以帮助读取和处理资源文件中的信息

    static { // 加载JDBCUtil类的时候调用
        pros = new Properties();

        try {
            pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Connection getMysqlConn() {
        try {
            Class.forName(pros.getProperty("mysqlDriver"));
            return DriverManager.getConnection(pros.getProperty("mysqlURL"), pros.getProperty("mysqlUser"),
                    pros.getProperty("mysqlPwd"));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }

    }

    public static void close(ResultSet rs, Connection conn, PreparedStatement ps) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            if (ps != null) {
                ps.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

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

    }

    public static void close(Connection conn, PreparedStatement ps) {

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

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

    }
}
//配置文件 Mysql
mysqlDriver=com.mysql.jdbc.Driver
mysqlURL=jdbc\:mysql\://localhost\:3306/testjdbc?characterEncoding=utf8&useSSL=false
mysqlUser=root
mysqlPwd=vvvvvv
//oracle
oracleDriver=oracle.jdbc.driver.oracleDriver
oracleURL=jdbc\:oracle\:thin\:@localgost\:1521\:orcl
oracleUser=scott
oraclePwd=tiger

statement语句

public class Demo02 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接(连接对象内部其实包含了Socket对象,是一个远程的连接。比较耗时!这是Connection对象管理的一个要点!)
            //真正开发中,为了提高效率,都会使用连接池来管理连接对象!
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");

            stmt = conn.createStatement();
//          String name = "赵六";
//          String sql = "insert into t_user (username,pwd,regTime) values ('"+name+"',66666,now())";
//          stmt.execute(sql);

            //测试SQL注入
            String id = "5 or 1=1 ";
            String sql = "delete from t_user where id="+id;
            stmt.execute(sql);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            try {
                if(stmt!=null){
                    stmt.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

测试PreparedStatement基本用法

package com.vvvvvv.jdbc;

/**
 * 测试PreparedStatement的基本用法
 */
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.SimpleDateFormat;
import java.util.Date;

public class Demo3 {

    public static void main(String[] args) {
        ResultSet rs = null;
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
            String sql = "insert into t_user(id,username,pwd,regTime) values(?,?,?,?)";// ?占位符
            ps = conn.prepareStatement(sql);

            ps.setInt(1, 5);
            ps.setString(2, "wuhk");
            ps.setString(3, "123456");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Date d = new Date(System.currentTimeMillis());
            String str = df.format(d);
            ps.setString(4, str);

            ps.setObject(2, "shijialing");
            ps.setObject(3, "123123");
            ps.setObject(1, 7);
            ps.setDate(4, new java.sql.Date(System.currentTimeMillis()));
            ps.setDate(4, new java.sql.Date(System.currentTimeMillis()));
            ps.execute();

            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println(
                        rs.getInt(1) + "---->" + rs.getString(2) + "---->" + rs.getString(3) + "---->" + rs.getDate(4));
            }

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

测试结果集的基本用法

package com.vvvvvv.jdbc;

/**
 * 测试PreparedStatement的excuteQuery()
 * 结果集的基本用法
 */
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.SimpleDateFormat;
import java.util.Date;

public class Demo4 {

    public static void main(String[] args) {
        ResultSet rs = null;
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
            String sql = "select * from t_user where id > 1";// ?占位符
            ps = conn.prepareStatement(sql);


            rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println(
                        rs.getInt(1) + "---->" + rs.getString(2) + "---->" + rs.getString(3) + "---->" + rs.getDate(4));
            }

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

批处理

使用statement

package com.vvvvvv.jdbc;

/**
 * 测试批处理Batch()
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo5 {

    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        try {
        //连接
            Class.forName("com.mysql.jdbc.Driver");

            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
            conn.setAutoCommit(false);

            //批处理
            st = conn.createStatement();
            for(int i = 0; i < 20000; i++) {
                st.addBatch("insert into t_user(id,username,pwd,regTime) values('"+(i+8)+"','wu"+(i+8)+"','123',now())");
            }
            st.executeBatch();

            conn.commit();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            //关闭连接
            try {
                if (st != null) {
                    st.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            if (conn != null)
                conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

使用PreparedStatement

package com.vvvvvv.jdbc;

/**
 * 测试批处理Batch()
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo9 {

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");

            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
            conn.setAutoCommit(false);
            String sql = "insert into t_user(id,username,pwd) values(?,?,?)";
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < 20000; i++) {
                ps.setInt(1, i + 8);
                ps.setString(2, "name" + i);
                ps.setString(3, "123123");
                //添加进批
                ps.addBatch();
                //设置条件当i对10取余为0的话,先执行一次批语句,然后将批清除
                if(i % 10 == 0) {
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            //将批中剩余的语句执行完毕
            ps.executeBatch();

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

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

事务

一,JDBC当中事务的概念:

        基本概念:

            一组要么同时执行成功,要么同时执行失败的sql语句,是数据库操作的一个执行单元。

        -事务开始于DML语句(insert ,update,delete);

         -事务结束于:

         .执行commit或者rollback语句

         .执行一条DDL语句,

         .执行一条DCL语句。例如:grant语句后会自动commit语句。

         .断开与数据库的连接。

         .执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的操作DML语句执行rollback语句。

二,事务的四大特点(ACID);

    -atomicity(原子性);

    -consistency(一致性);

    -isolation(隔离性);

    -durability(持久性);

三,事务隔离级别从低到高:

    -读取未提交(Read Uncommitted);

    -读取已提交(Read Committed);

    -可重复读(Repeatable Read);

    -序列化(Serializable);   

四 ,对于事务的编写,要遵守一定的顺序的:

首先,.设置事务的提交方式为非自动提交:

   conn.setAutoCommit(false);

接下来,.将需要添加事务的代码放入try,catch块中。

然后,.在try块内添加事务的提交操作,表示操作无异常,提交事务。

    conn.commit();

尤其不要忘记,.在catch块内添加回滚事务,表示操作出现异常,撤销事务:

    conn.rollback();

最后,设置事务提交方式为自动提交:

     conn.setAutoCommit(true);

这样,通过简单的几步,我们就可以完成对事务处理的编写了。
Connection con =null;

     Statement st=null;

     ResultSet rs=null;

    PreparedStatement ps=null;

publicvoid startTransaction(){



              con = DBCManager.getConnect();//获取连接对象





                            try {

                  //设置事务的提交方式为非自动提交:

              con.setAutoCommit(false);

              //将需要添加事务的代码一同放入try,catch块中



                  //创建执行语句

                  String sql ="delete from me where id = 7";

                  String sql1 = "update me set name ='chengong' ,age ='34' where id =4";

                  //分别执行事务

                  ps = con.prepareStatement(sql);

                  ps.executeUpdate();

                  ps = con.prepareStatement(sql1);

                  ps.executeUpdate();



                  //在try块内添加事务的提交操作,表示操作无异常,提交事务。



                  con.commit();



              } catch (SQLException e) {

              try {

                  //.在catch块内添加回滚事务,表示操作出现异常,撤销事务:

                  con.rollback();

              } catch (SQLException e1) {

                  // TODO Auto-generatedcatch block

                  e1.printStackTrace();

              }

                  e.printStackTrace();

              }finally{

                  try {

                     //设置事务提交方式为自动提交:

                     con.setAutoCommit(true);

                  } catch (SQLException e) {

                     // TODO Auto-generatedcatch block

                     e.printStackTrace();

                  }

                  DBCManager.release(rs, ps, con);

              }



       }

JDBC中的时间类型

1) java.util.Date

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

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

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

2)日期比较处理

    -插入随机日期

    -取出指定日期范围的记录
public class Demo07 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");

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

                ps = conn.prepareStatement("insert into t_user (username,pwd,regTime,lastLoginTime) values (?,?,?,?)");
                ps.setObject(1, "vvv"+i);
                ps.setObject(2, "123456");

                int rand =  100000000+new Random().nextInt(1000000000);

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

                ps.setDate(3, date);
                ps.setTimestamp(4, stamp);
                ps.execute();               
            }           
            System.out.println("插入一个用户,高淇");            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            try {
                if(ps!=null){
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

文件大对象操作Clob()

-CLOB用于存储大量的文本数据

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

Mysql中相关类型如下:

    -TINYTEXT 最大长度为255字符的text列

    -TEXT【M】最大长度为65563字符的text列

    -MEDIMTEXT最大长度为16777215字符的列

    -LONGTEXT最大长度为4294,967,2956或者4GB字符的列;
package com.vvvvvv.jdbc;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.sql.Clob;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * 测试Clob() 文本大对象操作
 */
public class Demo7 {

    public static void main(String[] args) throws IOException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");

            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8&useSSL=false", "root", "vvvvvv");
            conn.setAutoCommit(false);
            String sql = "insert into t_user (id,username,pwd,regTime,myInfo) values(?,?,?,?,?)";// ?占位符
            ps = conn.prepareStatement(sql);

//          ps.setInt(1, 1);
//          ps.setString(2, "vvvv");
//          ps.setString(3, "wasa");
//          ps.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
            //从文件中插入文本信息
//          ps.setClob(5, new FileReader(new File("D:/a.txt")));
            //从程序中插入文本信息
//          ps.setClob(5, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("aaaaaaa".getBytes()))));

            //读取文本信息
            sql = "select * from t_user where id = ?";
            ps = conn.prepareStatement(sql);
            ps.setObject(1, 1);
            rs = ps.executeQuery();

            while(rs.next()) {
                Clob c = rs.getClob(5);
                Reader r = c.getCharacterStream();
                int temp = 0;
                while((temp = r.read())!= -1) {
                    System.out.println((char)temp);
                }
            }

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

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

二进制大对象操作blob()

public class Demo10 {   
    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","123456");

//          ps = conn.prepareStatement("insert into t_user (username,headImg) values (?,?) ");
//          ps.setString(1, "vvv");
//          ps.setBlob(2, new FileInputStream("d:/icon.jpg"));
//          ps.execute();           

            ps = conn.prepareStatement("select * from t_user where id=?");
            ps.setObject(1, 101026);

            rs = ps.executeQuery();
            while(rs.next()){
                Blob b = rs.getBlob("headImg");
                is  = b.getBinaryStream();
                os = new FileOutputStream("d:/a.jpg");
                int temp = 0;
                while((temp=is.read())!=-1){
                    os.write(temp);
                }
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(is!=null){
                    is.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if(os!=null){
                    os.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                if(ps!=null){
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值