您的位置:首页 > 数据库 > MySQL

MySQL和JDBC

2016-04-24 22:28 615 查看
这几天看了一些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.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部分另开一章叙述。

未完待续…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息