JDBC使用的一般套路。

首先,准备工作是要建立好一个数据库叫test,里面有一张t_user的表。

然后在IDEA环境中加载mysql-java-80.0.12.jar包。

首先连接数据库。

Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC","root","password");

下面是这么写的原因:

当然,这里的表名还有其他的参数,建议放在一个.properities配置文件中,这样修改比较简单。注意,配置文件要和你写的代码在同一级目录下,不然会搜索不到。

连接上之后就是要考虑如何操作数据库。

分三块来讲,第一块是直接操作,第二块是批操作,第三块是事物。

首先是直接操作,很简单,用两个类。

第一个是Statement,这个类的作用可以理解为用java语言调用SQL语句,使用用法如下。

Statement stmt = conn.createStatement();
String sql = "select * from t_user"//任意的SQL语句
stmt.execute(sql);

这就运行了,但是有个什么毛病呢。会产生SQL注入问题,就是我们不建议用字符串拼接的方式来完善SQL语句,而应该用含有占位符的语句。

这么说你可能不清楚是什么意思。那我们将采用第二个类。

PreparedStatement。这个类允许在SQL语句中用?作为占位符,然后在后面的语句中填空。用法如下:

sql = "insert into t_user (username,pwd) values (?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
//下面可以对问号赋值,注意,数字代表是第几个问号,从1开始
ps.setString(1,'java');
ps.setObject(2,"Better_than_Cpp");
//这里的setXxx代表为用什么样的类型存储。
ps.execute();

我们程序员经常要用到的就是增删改查,特别是查表。在MySQL的命令窗口输入查询,返回的是张表,那在Java中怎么查询呢?

于是就有了Resultset,这个类用于存储返回的数据。这个类类似于迭代器,可以用.next()进行遍历,这个遍历是一条记录一条记录的遍历。用GetXxx方法可以查询记录中每个字段的值。

二,批操作

批操作在1的基础上改一改就行了。

首先要把事务提交改成手动提交。

conn.setAutoCommit(false);//这个默认是true,要改成false

也很好理解,如果自动提交了,那你的所有SQL语句不就全部提交了么,而我们的要求是打包在一起然后一起执行。

conn.setAutoCommit(false);
stmt = conn.createStatement();
for(int i=0;i<2000;i++){//添加批任务
     stmt.addBatch("insert into t_user (username,pwd) values ('huang" + i +"',666666)");
}
stmt.executeBatch();//批执行
conn.commit();//提交任务

三,事务

            conn.setAutoCommit(false);//默认自动提交
            String sql = "insert into t_user (username,pwd) values (?,?)";
            ps = conn.prepareStatement(sql);
            ps.setObject(1,"魏璎珞");
            ps.setObject(2,"guifeibixusi");
            ps.execute();

            sql = "insert into t_user (username,pwd) values (?,?)";
            ps1 = conn.prepareStatement(sql);
            ps1.setObject(1,"高贵妃");
            ps1.setObject(2,"weiyingluobixusi");
            ps1.execute();

           conn.commit();

在commit之前的所有操作都保存在内存中,只有到了commit才更新表单,否则不修改。如果失败了,在异常处理中conn.rollback进行回退。

try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }

下面给出我写的一些小例子:

package com.njust.MyJDBC;

import java.sql.*;

public class ConnectJDBC {
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC","root","08173237eerrtt");
            stmt = conn.createStatement();
            String sql = "SELECT * FROM t_user";
            stmt.execute(sql);
            sql = "insert into t_user (username,pwd) values (?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1,"Java");
            ps.setObject(2,"Better_than_Cpp");
            System.out.println("插入一条消息");
            int count = ps.executeUpdate();//返回值是更新的条目数量
            System.out.println(count);
            sql = "SELECT id,username,pwd FROM t_user where id>?";//用于查询
            ps = conn.prepareStatement(sql);
            ps.setObject(1,3);
            rs = ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt(1)+"-----"+rs.getObject(2) + "------" + rs.getObject(3));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            //这里的异常的try_catch必须分开用,以防止后面的不关闭
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stmt!=null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
package com.njust.MyJDBC;

import java.sql.*;

public class Transaction {
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        PreparedStatement ps = null;
        PreparedStatement ps1 = null;
        ResultSet rs = null;
        try {
            //加载驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC","root","08173237eerrtt");
            conn.setAutoCommit(false);//默认自动提交
            String sql = "insert into t_user (username,pwd) values (?,?)";
            ps = conn.prepareStatement(sql);
            ps.setObject(1,"魏璎珞");
            ps.setObject(2,"guifeibixusi");
            ps.execute();

            sql = "insert into t_user (username,pwd) values (?,?)";
            ps1 = conn.prepareStatement(sql);
            ps1.setObject(1,"高贵妃");
            ps1.setObject(2,"weiyingluobixusi");
            ps1.execute();

           conn.commit();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            //这里的异常的try_catch必须分开用,以防止后面的不关闭
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stmt!=null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/w8253497062015/article/details/82499530