Java链接mysql

    发了一篇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 ConnectiongetConnection(String url, String user, String password)
   DriverManager里面提供了这个静态方法,这里的url是类似于"jdbc:mysql://127.0.0.1:3306/mytest",其中mysql对应要访问的数据库的类型是mysql的,然后是它的IP跟端口和数据库的名字。user当然就是用户名了,然后password是密码。

//取得与MySQL数据库连接的桥梁
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mytest","root","123456");

3创建SQL对象

Connection这个类提供了一个方法可以返回一个Statement对象

 StatementcreateStatement()

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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值