MySQL和JDBC
来源:互联网 发布:php call stack 编辑:程序博客网 时间:2024/05/16 05:06
这几天看了一些JAVAWeb部分的知识,算是一点扩充,做了一些整理,不过还没完,先上传部分吧,先是JDBC这部分,关于之后需要掌握的服务端的知识,MySql,JDBC还是很重要的。
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.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部分另开一章叙述。
未完待续…
- jdbc:mysql和 oracle
- Java JDBC和MySQL
- MySQL和JDBC
- MySQL 和jdbc
- Java,JDBC和MySQL类型
- mysql和jdbc的使用
- jdbc连接池和mysql
- Mysql数据库和JDBC编程
- MySQL 和 MySQL.jdbc的下载
- JDBC连接Oracle和Mysql数据库示例
- JDBC连接mysql和各种数据库连接串
- jdbc链接mysql,access和oracle例子
- jdbc连接方式(Oracle和mySql)
- JDBC操作连接Oracle和MySQL
- JDBC连接到MySQL和oracle
- matlab如何使用jdbc和mysql数据库连接
- 2015061004 - slf4和mysql,jdbc下载地址
- mysql和eclipse连接jdbc驱动配置
- 机器学习算法之朴素贝叶斯(Naive Bayes)--第一篇
- LeetCode|Two Sum
- matplotlib 绘图库的简单用法
- 单例模式的七种写法
- LintCode:回文链表
- MySQL和JDBC
- [Android] ImageView.ScaleType设置图解
- 堆和栈的区别:
- browserify总结
- 丁丁的学习博客开通了
- Java线程:有返回值的线程
- ListView下拉刷新的实现
- JAVA内存泄露的原因分析
- 登陆界面