Heim > Datenbank > MySQL-Tutorial > 数据库:JDBC编程

数据库:JDBC编程

WBOY
Freigeben: 2016-06-07 16:10:04
Original
1499 Leute haben es durchsucht

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。说白了,它用于直接调用 SQL 命令。 主要步骤: 1.加载JDBC驱动程序 2.建立于数据库的连接

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。说白了,它用于直接调用 SQL 命令。

主要步骤:

1.加载JDBC驱动程序
2.建立于数据库的连接
3.创建一个Statement,添加相关参数
4.执行SQL语句
5.处理执行结果
6.关闭JDBC的对象

几个重要的类:
(1)
public class DriverManager extends Object
管理一组 JDBC 驱动程序的基本服务。
主要方法是:
public static Connection getConnection(String url,String user,String password)throws SQLException
试图建立到给定数据库 URL 的连接。DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。

(2)
public interface PreparedStatement extends Statement
表示预编译的 SQL 语句的对象。 SQL 语句被预编译并存储在PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。 与Statement接口相比,Statement用于执行静态 SQL 语句并返回它所生成结果的对象。
主要方法是:
1. void setObject(int parameterIndex,Object x) throws SQLException
使用给定对象设置指定参数的值,其实就是为SQL语句占位符的设定实际参数。

2. intexecuteUpdate() throws SQLException

在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
返回:
(1) SQL 数据操作语言 (DML) 语句的行数 (2) 对于无返回内容的 SQL 语句,返回 0


3. ResultSet executeQuery() throws SQLException
在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。
返回:
包含该查询生成的数据的 ResultSet 对象;不会返回 null

(3)
留意执行executeUpdate()和executeQuery()方法返回的值发现executeQuery()返回的是一个结果集对象。
public interface ResultSet extends Wrapper
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

主要方法是:
1. ResultSetMetaData getMetaData() throws SQLException

获取此ResultSet对象的列的编号、类型和属性。
而ResultSetMetaData的主要方法就是 int getColumnCount() 返回此 ResultSet 对象中的列数; String getColumnName(int column) 获取指定列的名称。

2. Object getObject(int columnIndex) throws SQLException

以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值。

实例一:MySql+JDBC

Windows用户可以再http://dev.mysql.com/downloads/windows/installer/下载MySql的自动配置安装版

使用Navicat作为MySql的数据库管理工具

另外还需要下载JDBC驱动程序http://dev.mysql.com/downloads/connector/j/,工程需要引用里面的jar包

①新建一个工具类JdbcUtils

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JdbcUtils {
	// 数据库的登陆账号密码
	private final String USERNAME = "root";
	private final String PASSWORD = "123456";
	// JDBC驱动程序
	private final String DRIVER = "com.mysql.jdbc.Driver";
	// 数据库地址
	private final String URL = "jdbc:mysql://localhost:3306/test";

	// 三个重要类的对象
	private Connection connection;
	private PreparedStatement ps;
	private ResultSet resultSet;

	public JdbcUtils() {
		try {
			// 步骤1:加载驱动程序
			Class.forName(DRIVER);
			// 步骤2:建立连接,这里的处理是当实例化这个工具类对象时就完成这两个步骤
			connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

	// 封装的update函数
	public int update(String sql, List<Object> params) throws SQLException {
		int result = 0;
		// 步骤3:创建一个Statement,添加相关参数
		ps = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++)
				// 注意数据库的下标都是从1开始的,第i个占位符填充params的第i个值
				ps.setObject(i + 1, params.get(i));
		}
		// 步骤4:执行SQL语句,步骤5和6则留给客户端处理
		result = ps.executeUpdate();
		return result;
	}

	// 封装的query函数,返回的是List套个Map,数据库是以键值对的形式存储的
	public List<Map<String, Object>> query(String sql, List<Object> params)
			throws SQLException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		// 步骤3:创建一个Statement,添加相关参数
		ps = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++)
				ps.setObject(i + 1, params.get(i));
		}
		// 步骤4:执行SQL语句
		resultSet = ps.executeQuery();
		// 步骤5:处理执行结果
		// 获取此ResultSet对象的列的属性
		ResultSetMetaData metaData = resultSet.getMetaData();
		// 列的长度
		int col_len = metaData.getColumnCount();
		// 若有下一条记录
		while (resultSet.next()) {
			// 将该条记录以map形式存储
			Map<String, Object> map = new HashMap<String, Object>();
			for (int i = 0; i < col_len; i++) {
				// 根据列名获得键值并存放在map中
				String col_name = metaData.getColumnName(i + 1);
				Object col_value = resultSet.getObject(col_name);
				map.put(col_name, col_value);
			}
			// 将该记录添加到list中
			list.add(map);
		}
		// 遍历完resultSet返回list
		return list;
	}

	// 封装步骤6关闭JDBC对象
	public void release() {
		if (resultSet != null)
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		if (ps != null)
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		if (connection != null)
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
	}
}
Nach dem Login kopieren
②TestMain类

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class TestMain {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		JdbcUtils jdbcUtils = new JdbcUtils();
		/*执行一:新建表*/
		// String sql0 =
		// "create table userinfo(id int primary key auto_increment, username varchar(64), password varchar(64))";
		// try {
		// jdbcUtils.update(sql0, null);
		// } catch (SQLException e) {
		// // TODO 自动生成的 catch 块
		// e.printStackTrace();
		// }
		
		/*执行二:增加一条记录*/
		// String sql = "insert into userinfo (username,password) values(?,?)";
		// List<Object> params = new ArrayList<Object>();
		// params.add("jack");
		// params.add("123456");
		// try {
		// jdbcUtils.update(sql, params);
		// } catch (SQLException e) {
		// // TODO 自动生成的 catch 块
		// e.printStackTrace();
		// }
		
		/*执行三:修改一条记录*/
		// String sql1 = "update userinfo set username = ? where id = ?";
		// List<Object> param1 = new ArrayList<Object>();
		// param1.add("tommy");
		// param1.add(2);
		// try {
		// jdbcUtils.update(sql1, param1);
		// } catch (SQLException e) {
		// // TODO 自动生成的 catch 块
		// e.printStackTrace();
		// }
		
		/*执行四:删除一条记录*/
		// String sql2 = "delete from userinfo where username = &#39;tommy&#39;";
		// try {
		// jdbcUtils.update(sql2, null);
		// } catch (SQLException e) {
		// // TODO 自动生成的 catch 块
		// e.printStackTrace();
		// }

		/*执行五:查询所有记录*/
		// String sql3 = "select * from userinfo";
		// try {
		// List<Map<String, Object>> list = jdbcUtils.query(sql3, null);
		// System.out.println(list);
		// } catch (SQLException e) {
		// // TODO 自动生成的 catch 块
		// e.printStackTrace();
		// }
	}

}
Nach dem Login kopieren
执行步骤一:创建一个新的表(以下说的执行步骤没有说明的话都是指单独执行,其他步骤都注释掉)

\

执行步骤二:创建一个表,有三个字段,id是主键

\

连续执行步骤三两次:增加两条记录

\

执行步骤四:将第二条记录修改

\

执行步骤五:删除第二条记录

\

执行步骤六:查询到一条记录

\

再次执行步骤一和步骤五:查询到多条记录

\

实例二:应用反射机制来实现查询数据库记录

①新建一个和数据库字段匹配的类UserInfo<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:sql;">public class UserInfo { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "UserInfo [id=" + id + ", username=" + username + ", password=" + password + "]"; } } ②在JdbcUtils类中添加一个应用反射机制的数据库查询函数

public <T> List<T> queryRef(String sql, List<Object> params, Class<T> cls)
		throws Exception {
	List<T> list = new ArrayList<>();
	ps = connection.prepareStatement(sql);
	if (params != null && !params.isEmpty()) {
		for (int i = 0; i < params.size(); i++)
			ps.setObject(i + 1, params.get(i));
	}
	resultSet = ps.executeQuery();
	ResultSetMetaData metaData = resultSet.getMetaData();
	int col_len = metaData.getColumnCount();
	while (resultSet.next()) {
		// 存在记录时,实例化一个对象
		T record = cls.newInstance();
		for (int i = 0; i < col_len; i++) {
			String col_name = metaData.getColumnName(i + 1);
			Object col_value = resultSet.getObject(col_name);
			// 将列对应的值赋给对象的相应字段
			Field field = cls.getDeclaredField(col_name);
			field.setAccessible(true);
			field.set(record, col_value);
		}
		// 将这条记录添加到List中
		list.add(record);
	}
	return list;
}
Nach dem Login kopieren
③TestMain类,添加一个执行操作

/*执行六:反射机制查询记录*/
String sqlQuery = "select * from userinfo";
try {
	List<UserInfo> list = jdbcUtils.queryRef(sqlQuery, null,
			UserInfo.class);
	System.out.println(list);
} catch (Exception e) {
	// TODO 自动生成的 catch 块
	e.printStackTrace();
} finally {
	jdbcUtils.release();
}
Nach dem Login kopieren
执行步骤六





Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage