美文网首页
JDBC编程

JDBC编程

作者: 1s_Kiwen | 来源:发表于2018-10-14 10:16 被阅读0次

    JDBC编程步骤

    1.加载数据库驱动。通过Class类的forName()静态方法来加载驱动
    Class.forName(driverClass)
    2.通过DriverManager获取数据库连接Connection对象。
    DriverManager.getConnection(String url,String user,String pass)
    3.通过Connection对象创建Statement对象。创建Statement有三种方法。

    createStatement(): 创建基本的Statement对象
    prepareStatement(String sql): 根据传入的SQL语句创建预编译的Statement对象
    prepareCall(String sql): 根据传入的SQL语句创建CallableStatement对象。
    
    com.mysql.jdbc.Driver是 mysql-connector-java 5中的
    com.mysql.cj.jdbc.Driver是 mysql-connector-java 6中的
    
    jdbc连接MySQL6需要指定时区serverTimezone:
    driverClassName=com.mysql.cj.jdbc.Driver 
    url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false 
    username=root 
    password=
    

    4.使用Statement执行SQL语句。

    execute(): 可以执行任何SQL语句,但比较麻烦,在不清SQL语句类型时,只能使用这个方法。
    executeUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数,执行DDL语句返回0。
    executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象。
    

    5.操作结果集。有两类方法来操作结果集。

    next()、 previous()、 first()、 last()、 beforeFirst()、 afterLast()、 absolute()
    getXxx()方法获取记录指针指向行、特定列的值。
    

    6.回收数据库资源,包括ResultSet、Statement和Connection等资源。

    实例代码(执行DML语句)

    
    import java.io.FileInputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    import java.util.Properties;
    
    
    
    public class ExecuteDML {
        private String driver;
        private String url;
        private String user;
        private String pass;
        public void initParam(String paramFile) throws Exception{
            //使用Properties类来加载属性文件
            Properties props = new Properties();
            props.load(new FileInputStream(paramFile));
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            pass = props.getProperty("pass");
        }
        public int insertData(String sql) throws Exception{
            //加载驱动
            Class.forName(driver);
            try(
                    //获取数据库连接
                    Connection conn = DriverManager.getConnection(url, user, pass);
                    //使用Connection来创建一个Statement对象
                    Statement stmt = conn.createStatement())
            {
                //执行DML语句,返回受影响的记录条数
                return stmt.executeUpdate(sql);
            }
        }
        
        public static void main(String[] args) throws Exception{
            ExecuteDML ed = new ExecuteDML();
            ed.initParam("mysql.ini");
            //注意。values里面的字符串要用双引号,用转义符表示出双引号
            int result = ed.insertData("insert into test (name,age) values ('李四',15);");
            System.out.println("--系统中共有"+result+"条记录受影响--");
        }
    }
    

    当不清楚执行的sql语句

    import java.util.*;
    import java.io.*;
    import java.sql.*;
    
    public class ExecuteSQL
    {
        private String driver;
        private String url;
        private String user;
        private String pass;
        public void initParam(String paramFile)throws Exception
        {
            // 使用Properties类来加载属性文件
            Properties props = new Properties();
            props.load(new FileInputStream(paramFile));
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            pass = props.getProperty("pass");
        }
        public void executeSql(String sql)throws Exception
        {
            // 加载驱动
            Class.forName(driver);
            try(
                // 获取数据库连接
                Connection conn = DriverManager.getConnection(url
                    , user , pass);
                // 使用Connection来创建一个Statement对象
                Statement stmt = conn.createStatement())
            {
                // 执行SQL,返回boolean值表示是否包含ResultSet
                boolean hasResultSet = stmt.execute(sql);
                // 如果执行后有ResultSet结果集
                if (hasResultSet)
                {
                    try(
                        // 获取结果集
                        ResultSet rs = stmt.getResultSet())
                    {
                        // ResultSetMetaData是用于分析结果集的元数据接口
                        ResultSetMetaData rsmd = rs.getMetaData();
                        int columnCount = rsmd.getColumnCount();
                        // 迭代输出ResultSet对象
                        while (rs.next())
                        {
                            // 依次输出每列的值
                            for (int i = 0 ; i < columnCount ; i++ )
                            {
                                System.out.print(rs.getString(i + 1) + "\t");
                            }
                            System.out.print("\n");
                        }
                    }
                }
                else
                {
                    System.out.println("该SQL语句影响的记录有"
                        + stmt.getUpdateCount() + "条");
                }
            }
        }
        public static void main(String[] args) throws Exception
        {
            ExecuteSQL es = new ExecuteSQL();
            es.initParam("mysql.ini");
            System.out.println("------执行删除表的DDL语句-----");
            es.executeSql("drop table if exists my_test");
            System.out.println("------执行建表的DDL语句-----");
            es.executeSql("create table my_test"
                + "(test_id int auto_increment primary key, "
                + "test_name varchar(255))");
            System.out.println("------执行插入数据的DML语句-----");
            es.executeSql("insert into my_test(test_name) "
                + "select student_name from student_table");
            System.out.println("------执行查询数据的查询语句-----");
            es.executeSql("select * from my_test");
        }
    }
    

    使用PreparedStatement执行SQL语句的例子

    (使用这种方法,可以防止SQL注入,比如在登录框中输入‘or true or’)

    import java.util.*;
    import java.io.*;
    import java.sql.*;
    
    public class PreparedStatementTest
    {
        private String driver;
        private String url;
        private String user;
        private String pass;
        public void initParam(String paramFile)throws Exception
        {
            // 使用Properties类来加载属性文件
            Properties props = new Properties();
            props.load(new FileInputStream(paramFile));
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            pass = props.getProperty("pass");
            // 加载驱动
            Class.forName(driver);
        }
        public void insertUseStatement()throws Exception
        {
            long start = System.currentTimeMillis();
            try(
                // 获取数据库连接
                Connection conn = DriverManager.getConnection(url
                    , user , pass);
                // 使用Connection来创建一个Statment对象
                Statement stmt = conn.createStatement())
            {
                // 需要使用100条SQL语句来插入100条记录
                for (int i = 0; i < 100 ; i++ )
                {
                    stmt.executeUpdate("insert into student_table values("
                        + " null ,'姓名" + i + "' , 1)");
                }
                System.out.println("使用Statement费时:"
                    + (System.currentTimeMillis() - start));
            }
        }
        public void insertUsePrepare()throws Exception
        {
            long start = System.currentTimeMillis();
            try(
                // 获取数据库连接
                Connection conn = DriverManager.getConnection(url
                    , user , pass);
                // 使用Connection来创建一个PreparedStatement对象
                PreparedStatement pstmt = conn.prepareStatement(
                    "insert into student_table values(null,?,1)"))
    
            {
                // 100次为PreparedStatement的参数设值,就可以插入100条记录
                for (int i = 0; i < 100 ; i++ )
                {
                    pstmt.setString(1 , "姓名" + i);
                    pstmt.executeUpdate();
                }
                System.out.println("使用PreparedStatement费时:"
                    + (System.currentTimeMillis() - start));
            }
        }
        public static void main(String[] args) throws Exception
        {
            PreparedStatementTest pt = new PreparedStatementTest();
            pt.initParam("mysql.ini");
            pt.insertUseStatement();
            pt.insertUsePrepare();
        }
    }```

    相关文章

      网友评论

          本文标题:JDBC编程

          本文链接:https://www.haomeiwen.com/subject/xhjoaftx.html