发了一篇PHP连mysql的当然要再发一篇java的来相对应。在java里面访问数据库要用到jdbc,先简单介绍一下jdbc吧,什么是JDBC?JDBC是SUN公司为使Java程序灵活的访问各种不同的关系型数据库提供的规则。因为数据库有很多种,比如mysql、Oracle、SQLServler和DB2等。而这些数据库的链接方式都有差别,而JDBC的作用就是降低Java程序操作数据库的成本,就是说写Java程序的时候不用对操作每种数据库写代码,用接口的思想去解决这个问题,接口承担了一个桥梁的作用,通过JDBC去链接各种类型的数据库,每种数据库只要提供一个符合接口格式的jar包,然后就可以用JDBC去访问了。
JDBC的六个固定步骤:
1注册数据库驱动
//以下是两种方式
//方式一 注册数据库的驱动
DriverManager.registerDriver(new Driver());
//方式二 利用反射机制间接加载数据库驱劝
Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new Driver());这种方式是不建议使用的,为什么这么说呢?这里要先下载mysql-connector-java,搜索MySQL Connector/J 5.1.25,进入mysql的官网可以下载到。然后就可以查看一下源代码了,在com.mysql.jdbc这里面
package com.mysql.jdbc;
import java.sql.SQLException;
/**
* The Java SQL framework allows for multiple database drivers. Each driver
* should supply a class that implements the Driver interface
*
* <p>
* The DriverManager will try to load as many drivers as it can find and then
* for any given connection request, it will ask each driver in turn to try to
* connect to the target URL.
*
* <p>
* It is strongly recommended that each Driver class should be small and
* standalone so that the Driver class can be loaded and queried without
* bringing in vast quantities of supporting code.
*
* <p>
* When a Driver class is loaded, it should create an instance of itself and
* register it with the DriverManager. This means that a user can load and
* register a driver by doing Class.forName("foo.bah.Driver")
*
* @see org.gjt.mm.mysql.Connection
* @see java.sql.Driver
* @author Mark Matthews
* @version $Id$
*/
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// ---------------------------------------------
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// ~ Constructors
// -----------------------------------------------------------
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
上面这个Driver接口的实现类有一个静态代码块 里面有一句java.sql.DriverManager.registerDriver(new Driver());然后如果在外面再写 DriverManager.registerDriver(new Driver());的话就相当于注册了两次驱动,同样的代码执行了两次,所以这种方式是不建议使用的。
所以用反射的方法是比较合适的,用Class.forName("com.mysql.jdbc.Driver");这样的话就只执行静态代码块里面的代码注册一次。
2取得数据库连接对象Connection
static Connection | getConnection(String url, String user, String password) |
//取得与MySQL数据库连接的桥梁
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mytest","root","123456");
3创建SQL对象
Connection这个类提供了一个方法可以返回一个Statement对象
Statement | createStatement() |
Statement stmt = conn.createStatement();
4执行SQL命令,并返回结果集
接着就可以用Statement的方法执行SQL了
String sql="select * from user";
ResultSet rs = stmt.executeQuery(sql);
5处理结果集
while(rs.next()){
String id = rs.getObject("id").toString();
String name = rs.getObject("name").toString();
System.out.println(id+"|"+name);
}
6依次关闭结果集
rs.close();
stmt.close();
conn.close();
当然这些每次需要访问数据库都要调用的操作可以封装成一个类,这样的话就很方面使用了
package com.java.web.myjdbc;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
//JDBC工具类
public final class JdbcUtil {
private static String driver;
private static String url;
private static String user;
private static String password;
//静态块:加载文件 从外部加载一些数据来初始化链接数据库所需要的数据
static{
Properties props = new Properties();
//需要一个配置文件,项目中可能需要用XML
InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("com/java/web/myjdbc/db.properties");
try {
props.load(is);
} catch (Exception e) {
//项目中异常是写入日志里面的,有专门的开源类库去处理
e.printStackTrace();
}
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
}
//静态块:注册驱动
static{
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//取得连接
public static Connection getMySqlConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,user,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//关闭连接
public static void close(ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void close(Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这里需要一个配置文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/mytest
user = root
password = 123456
保存为db.properties
然后就附上一个调用的Demo
package com.java.web.myjdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select * from user";
try {
conn= JdbcUtil.getMySqlConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtil.close(rs);
JdbcUtil.close(stmt);
JdbcUtil.close(conn);
}
}
}
最后要注意的是Statement这个接口效率不是很高,而且不太安全,所以可以用它的子接口PreparedStatement来替代,在Connection里面有一个方法叫prepareStatement(String sql),事先存进去需要运行的sql语句.这个接口效率会比Statement高些,而且更加安全,这里所说的安全是指防止sql注入,就是说不让用户对数据库进行一些超过用户权限的非法操作。
conn = JdbcUtil.getMySqlConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();