MySQL和JDBC

来源:互联网 发布:php call stack 编辑:程序博客网 时间:2024/05/16 05:06

这几天看了一些JAVAWeb部分的知识,算是一点扩充,做了一些整理,不过还没完,先上传部分吧,先是JDBC这部分,关于之后需要掌握的服务端的知识,MySql,JDBC还是很重要的。


1. MySQL


老规矩,依旧是从Xmind开始:

Mysql

       虽然只是概括,不过挺具体的了,概述一部分,之后就是从数据库的三个层级进行增删改查操作的描述了。

    这里主要介绍的是MySQL数据库,android部分将会使用SQLite数据库,虽然不同,但是使用的SQL语言基本是相同的,而使用Java语言对其进行操作时的思想也是相同的。作为一个志在全栈的程序员,数据库部分不能省啊。


2. JDBC


JDBC:Java Database Connection,字面意思就知道,JDBC就是作为java和数据库连接并操作数据库的方式,就是两种东西之间交互的规则,这两天学的规则有好几个,像是http,servlet,jsp还有这个jdbc等好几个。

  1. 提到规则,java里肯定是用接口来定义的了,也是由sun公司对几个数据库提供了jdbc这个规则,之后由各个数据库提供这样的驱动程序的jar包,用于交互。让java使用同样的方式,使用相对应的驱动程序能够对不同的数据进行交互。

  2. 所以在通过JDBC操作MySQL前,我们除了安装MySQL之外,需要的就是MySQL的驱动jar包,我就不提供这些东西了,网上找找还是很多的。

  3. 具体编写代码的流程

    1. 加载数据库的驱动类:
          在导入了JDBC和MySQL的驱动包之后,第一步要做的就是加载他。

      Class.forName("com.mysql.jdbc.Driver");/*1.这里用到了反射获取字节码文件的方法,不过在mysql5.0之后的驱动包后,这一步是可以省略的。*/
    2. 连接数据库

          加载完驱动肯定是要连接 了:

      Connection conn = DriverManager.getConnection(url, username, password);

          sun公司定义了一个Connection接口,内部连接的方式,获取链接对象都在驱动包内部规定,而sun公司定义的DriverManager类的getConnection方法能够获取到这个驱动包中的连接对象。

      • 这里又要分三部分介绍了

        1. url:这是用来连接数据库,指向的就是数据库的地址,MySQL数据库一般使用的是本机的3306端口

          String url = "jdbc:mysql://localhost:3306/mydb";
        2. username: 这指的是MySQL的账户,一般使用root就可以了

          String username = "root";
        3. password: 这也是在安装时对root定义的密码,安装时也可以为空。

          String password = "123";//假设密码是123
    3. PreparedStatement
          先解释一下这个类的作用,他有一个父类是Statement,是JDBC中定义的能够通过链接把操作的SQL语句发送给数据库,但是,这还不够,从安全性的角度来讲,为了防止恶意的攻击,他创建了PrepareStatement这个子类,能够事先对这句SQL语句进行提前编译,再发送至MySQL中执行。

      //查询语句sql,person表String sql = "select * from person"PreparedStatement prestmt = conn.prepareStatement(sql);
    4. ResultSet
          依旧是从字面意思上理解,在我们操作了数据库之后,比如上面执行的查询语句,那数据库总有一个返回值,告诉我们一个结果,单这个结果并不一定只是一个boolean值或是一个字符串,更可能是一个集合,我们称之为结果集(ResultSet)这个结果首先是由PreparedStatement对象的execute系列方法获取的,使用查询语句时为executeQuery()方法,返回的是一个结果集。

      ResultSet rs = prestmt.executeQuery();//之后可以使用rs.next()来遍历结果集获取结果while(rs.next()){    String name = rs.getString("name");    int age = rs.getInt("age");}//获取字符串对象使用getString,获取整数对象使用getInt
    5. 释放资源

          使用了connection,ResultSet,prepareStatement对象之后需要进行释放,最简单但不是最好的方式:

      //从下至上倒序释放rs.close();prestmt.close();conn.close();

总结

大致流程就是如上了,为了简便,省略过一些代码的优化,给出最后的一个版本:

/**这是一个JDBC工具类示例在这之前需要创建一个db.properties文件用于存储url,user,password,driverClass对象的文件:driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mydbuser=rootpassword=123*/public class JDBCUtils {    static String url;    static String user;    static String password;    static String driverClass;    //使用静态代码块的方式,使工具类的方法都能够公用这样一个连接。    static {        //先是加载properties文件        Properties props = new Properties();        try {        // 获取db.properties文件流 通过类加载器            InputStream inputstream = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");            // 加载外部文件的内容            props.load(inputstream);        } catch (FileNotFoundException e1) {            e1.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        // 注册驱动        try {            driverClass = props.getProperty("driverClass");            Class.forName(driverClass);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        // 创建连接        url = props.getProperty("url");        user = props.getProperty("user");        password = props.getProperty("password");        }        // 获得连接    public static Connection getConn() throws SQLException {        Connection conn = DriverManager.getConnection(url, user, password);        return conn;    }    //释放资源的优化    public static void release(ResultSet rs, Statement stmt, Connection conn) {        try {            if(rs!=null) {                rs.close();            }            rs = null;        } catch (SQLException e) {            e.printStackTrace();        }        release(stmt, conn);    }    //release方法重载    public static void release(Statement stmt, Connection conn) {        try {            if(stmt!=null) {                stmt.close();            }            stmt = null;        } catch (SQLException e) {            e.printStackTrace();        }        try {            if(conn!=null) {                conn.close();            }            conn = null;        } catch (SQLException e) {            e.printStackTrace();        }    }}       

优化后的查询方法

  public void query(){        Connection conn = null;        Statement stmt = null;        ResultSet rs = null;        try {            conn = JDBCUtils.getConn();            // 获得statement对象            stmt = conn.createStatement();            // 发送sql语句            String sql = "select * from emp";            rs = stmt.executeQuery(sql);            // 处理结果集            while(rs.next()) {                System.out.print(rs.getInt("id"));                System.out.print(rs.getString("name"));                System.out.println(rs.getInt("age"));            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            JDBCUtils.release(rs, stmt, conn);        }    }

其实到这里应该是已经完成这一部分的优化了,但实际上我们更深入的去考虑一下,connection方法在每一次被使用时都要被创建效率是不是很低?当然,我之前并没有想到,也是在看到c3p0时才想到的。不过这里就不在叙述了这些了,下一次有时间会把c3p0部分另开一章叙述。



                未完待续…

0 0