MySQL和JDBC

这几天看了一些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.Driver
url=jdbc:mysql://localhost:3306/mydb
user=root
password=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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值