MySQL和JDBC
2016-04-24 22:28
615 查看
这几天看了一些JAVAWeb部分的知识,算是一点扩充,做了一些整理,不过还没完,先上传部分吧,先是JDBC这部分,关于之后需要掌握的服务端的知识,MySql,JDBC还是很重要的。
虽然只是概括,不过挺具体的了,概述一部分,之后就是从数据库的三个层级进行增删改查操作的描述了。
这里主要介绍的是MySQL数据库,android部分将会使用SQLite数据库,虽然不同,但是使用的SQL语言基本是相同的,而使用Java语言对其进行操作时的思想也是相同的。作为一个志在全栈的程序员,数据库部分不能省啊。
提到规则,java里肯定是用接口来定义的了,也是由sun公司对几个数据库提供了jdbc这个规则,之后由各个数据库提供这样的驱动程序的jar包,用于交互。让java使用同样的方式,使用相对应的驱动程序能够对不同的数据进行交互。
所以在通过JDBC操作MySQL前,我们除了安装MySQL之外,需要的就是MySQL的驱动jar包,我就不提供这些东西了,网上找找还是很多的。
具体编写代码的流程
加载数据库的驱动类:
在导入了JDBC和MySQL的驱动包之后,第一步要做的就是加载他。
连接数据库
加载完驱动肯定是要连接 了:
sun公司定义了一个Connection接口,内部连接的方式,获取链接对象都在驱动包内部规定,而sun公司定义的DriverManager类的getConnection方法能够获取到这个驱动包中的连接对象。
这里又要分三部分介绍了
url:这是用来连接数据库,指向的就是数据库的地址,MySQL数据库一般使用的是本机的3306端口
username: 这指的是MySQL的账户,一般使用root就可以了
password: 这也是在安装时对root定义的密码,安装时也可以为空。
PreparedStatement
先解释一下这个类的作用,他有一个父类是Statement,是JDBC中定义的能够通过链接把操作的SQL语句发送给数据库,但是,这还不够,从安全性的角度来讲,为了防止恶意的攻击,他创建了PrepareStatement这个子类,能够事先对这句SQL语句进行提前编译,再发送至MySQL中执行。
ResultSet
依旧是从字面意思上理解,在我们操作了数据库之后,比如上面执行的查询语句,那数据库总有一个返回值,告诉我们一个结果,单这个结果并不一定只是一个boolean值或是一个字符串,更可能是一个集合,我们称之为结果集(ResultSet)这个结果首先是由PreparedStatement对象的execute系列方法获取的,使用查询语句时为executeQuery()方法,返回的是一个结果集。
释放资源
使用了connection,ResultSet,prepareStatement对象之后需要进行释放,最简单但不是最好的方式:
优化后的查询方法
其实到这里应该是已经完成这一部分的优化了,但实际上我们更深入的去考虑一下,connection方法在每一次被使用时都要被创建效率是不是很低?当然,我之前并没有想到,也是在看到c3p0时才想到的。不过这里就不在叙述了这些了,下一次有时间会把c3p0部分另开一章叙述。
未完待续…
1. MySQL
老规矩,依旧是从Xmind开始:虽然只是概括,不过挺具体的了,概述一部分,之后就是从数据库的三个层级进行增删改查操作的描述了。
这里主要介绍的是MySQL数据库,android部分将会使用SQLite数据库,虽然不同,但是使用的SQL语言基本是相同的,而使用Java语言对其进行操作时的思想也是相同的。作为一个志在全栈的程序员,数据库部分不能省啊。
2. JDBC
JDBC:Java Database Connection,字面意思就知道,JDBC就是作为java和数据库连接并操作数据库的方式,就是两种东西之间交互的规则,这两天学的规则有好几个,像是http,servlet,jsp还有这个jdbc等好几个。提到规则,java里肯定是用接口来定义的了,也是由sun公司对几个数据库提供了jdbc这个规则,之后由各个数据库提供这样的驱动程序的jar包,用于交互。让java使用同样的方式,使用相对应的驱动程序能够对不同的数据进行交互。
所以在通过JDBC操作MySQL前,我们除了安装MySQL之外,需要的就是MySQL的驱动jar包,我就不提供这些东西了,网上找找还是很多的。
具体编写代码的流程
加载数据库的驱动类:
在导入了JDBC和MySQL的驱动包之后,第一步要做的就是加载他。
Class.forName("com.mysql.jdbc.Driver"); /*1.这里用到了反射获取字节码文件的方法,不过在mysql5.0之后的驱动包后,这一步是可以省略的。*/
连接数据库
加载完驱动肯定是要连接 了:
Connection conn = DriverManager.getConnection(url, username, password);
sun公司定义了一个Connection接口,内部连接的方式,获取链接对象都在驱动包内部规定,而sun公司定义的DriverManager类的getConnection方法能够获取到这个驱动包中的连接对象。
这里又要分三部分介绍了
url:这是用来连接数据库,指向的就是数据库的地址,MySQL数据库一般使用的是本机的3306端口
String url = "jdbc:mysql://localhost:3306/mydb";
username: 这指的是MySQL的账户,一般使用root就可以了
String username = "root";
password: 这也是在安装时对root定义的密码,安装时也可以为空。
String password = "123";//假设密码是123
PreparedStatement
先解释一下这个类的作用,他有一个父类是Statement,是JDBC中定义的能够通过链接把操作的SQL语句发送给数据库,但是,这还不够,从安全性的角度来讲,为了防止恶意的攻击,他创建了PrepareStatement这个子类,能够事先对这句SQL语句进行提前编译,再发送至MySQL中执行。
//查询语句sql,person表 String sql = "select * from person" PreparedStatement prestmt = conn.prepareStatement(sql);
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
释放资源
使用了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部分另开一章叙述。
未完待续…
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- MySQL中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列