JDBC

Posted huangqiang97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC相关的知识,希望对你有一定的参考价值。

1.1     1:JDBC概述

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范

JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

1.2     2:JDBC开发步骤

            1.注册驱动

                      告知JVM使用的是哪一个数据库的驱动

    2.获得连接

                使用JDBC中的类,完成对mysql数据库的连接

           3.获得语句执行平台

               通过连接对象获取对SQL语句的执行者对象   

         4.执行sql语句

                 使用执行者对象,向数据库执行SQL语句

               获取到数据库的执行后的结果

           5.处理结果

6.释放资源  一堆close()

1.3     3API详解:获得语句执行平台

String sql = "某SQL语句";

获取Statement语句执行平台:Statement stmt = con.createStatement();

         常用方法:

int executeUpdate(String sql); --执行insert update delete语句.

ResultSet executeQuery(String sql); --执行select语句.

boolean execute(String sql); --执行select返回true 执行其他的语句返回false.

1.4     4API详解:处理结果集(执行insert、update、delete无需处理)

ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据,遍历要紧接着放在查询语句后面,之间不能插入其他执行语句:

rs.next();//指向第一行

rs.getInt(1);//获取第一行第一列的数据

常用方法:

Object getObject(int index) / Object getObject(String name) 获得任意对象

String getString(int index) / Object getObject(String name) 获得字符串

int getInt(int index) / Object getObject(String name) 获得整形

double getDouble(int index) / Object getObject(String name) 获得双精度浮点型

 

1.5     5API详解:释放资源

与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

rs.close();

stmt.close();

con.close();

 

4:链接SQL:

Class.forName("com.mysql.cj.jdbc.Driver");//Driver中含有注册驱动的静态代码块,进内存时就会完成初始化。

String url = "jdbc:mysql://localhost:3306/DataBaseName?useSSL=FALSE&serverTimezone=UTC";
String username="root";
String password="password ";
Connection con = DriverManager.getConnection(url,username,password);//获得链接对象

Statement stat = con.createStatement();//获得执行者对象。

int row = stat.executeUpdate ("sql表达式");//执行语句,row 为改变的表格行数。

ResulrSet rs=stat.executeQuery(SQL语句);

While(rs.next){
   rs.getInt(“id”)+rs.getString(“name”);

}

         Rs.close();

         Sta.close();

con.close();

1.6     5:注入攻击

                String sql = "SELECT * FROM users WHERE username=‘"+user+"‘ AND PASSWORD=‘"+pass+"‘";

           在输入:user=”name” password=”password ‘or’1=1”;

       SqL语句就会变成:SELECT * FROM users WHERE username=‘name‘ AND PASSWORD=‘password’ or ’ 1=1‘

       在SQL语句中布尔值也要用‘’包围,‘1=1’即为‘true’ where 后面就变成true.查询成功。

    解决:应用PreparedStatement  (SQL预编译存储,多次高效的执行SQL) ,可用于executeUpdate,executeQuery()

                 String sql="select  * from testdatabase.testtable where  usr_name=? and usr_password=?";

PreparedStatement preparedStatement=con .prepareStatement(sql);
preparedStatement.setString(1,usrName);//int index:从1开始第几个占位符初始化。setInt(),setObject()….
preparedStatement.setString(2,usrPassword);
ResultSet resultSet=preparedStatement.executeQuery();

 

 

                  String sql="insert into testdatabase.testtable(usr_name, usr_password) values (?,?)";ent preparedStatement=con .prepareStatement(sql);
                                 preparedStatement.setString(1,usrName);
                                    preparedStatement.setString(2,usrPassword);
                                  preparedStatement.executeUpdate();

1.7     6:工具类

 

public class JDBCUtils {

    private JDBCUtils(){}

    private static Connection con ;

  

    static{

        try{

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/mybase";

            String username="root";

            String password="123";

            con = DriverManager.getConnection(url, username, password);

        }catch(Exception ex){

            throw new RuntimeException(ex);

        }

    }

    public static Connection getConnection(){

        return con;

    }

public static void close(Connection con,Statement stat){

        

         if(stat!=null){

             try{

                 stat.close();

             }catch(SQLException ex){}

         }

        

         if(con!=null){

             try{

                 con.close();

             }catch(SQLException ex){}

         }

        

    }

    public static void close(Connection con,Statement stat , ResultSet rs){

         if(rs!=null){

             try{

                 rs.close();

             }catch(SQLException ex){}

         }

         if(stat!=null){

             try{

                 stat.close();

             }catch(SQLException ex){}

         }

         if(con!=null){

             try{

                 con.close();

             }catch(SQLException ex){}

         }

    }

}

1.8     使用properties配置文件

开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。

通常情况下,我们习惯使用properties文件,此文件我们将做如下要求:

文件位置:任意,建议src下,客户仅有bin 文件夹,系统会自动把文件拷贝到out\prodection\projectname下,从该目录下读取文件。

文件名称:任意,扩展名为properties

文件内容:一行一组数据,格式是“key=value”.

key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver

value值不支持中文,如果需要使用非英文字符,将进行unicode转换。

 

 

public class JDBCUtilsConfig {

private static Connection con ;

    private static String driverClass;

    private static String url;

    private static String username;

    private static String password;

    

    static{

        try{

           readConfig();

            Class.forName(driverClass);

            con = DriverManager.getConnection(url, username, password);

        }catch(Exception ex){

            throw new RuntimeException("数据库连接失败");

        }

    }

    

    private static void readConfig()throws Exception{

        InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");//使用类的加载器在.class文件文件夹下加载配置文件。

         Properties pro = new Properties();

         pro.load(in);

         driverClass=pro.getProperty("driverClass");

         url = pro.getProperty("url");

         username = pro.getProperty("username");

         password = pro.getProperty("password");

    }

    public static Connection getConnection(){

        return con;

    }

    

}

 











以上是关于JDBC的主要内容,如果未能解决你的问题,请参考以下文章

JDBCJDBC连接mySQL数据库常见错误

JDBCJDBC连接mySQL数据库常见错误

JDBC

关于JDBC小总结

java JDBC编程学习笔记

java JDBC编程学习笔记