《老罗Android》学习之JDBC框架

这篇博客详细介绍了如何使用JDBC框架连接不同的数据库,包括Oracle10g、MySQL5和SQLServer2005。通过具体的连接URL示例,如jdbc:oracle:thin:@localhost:1521:ORCL、jdbc:mysql://localhost:3306/test和jdbc:sqlserver://localhost:1433:DatabaseName=BookDB,阐述了连接过程,并提到了数据库的用户名和密码是建立连接的关键步骤。
摘要由CSDN通过智能技术生成
1. 服务器的技术
JDBC的编程
JDBC+JSP+servlet+mySQL
在服务端维护数据。
2. 什么是JDBC
JDBC(Java DataBase Connectivity)是 使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待, 实现数据库无关的 Java操作接口
开发人员使用 JDBC统一的API接口,并专注于标准 SQL 语句。 就可以避免直接处理底层数据库驱动程序与相关操作接口的差异性。
3. JDBC程序的工作原理
  JDBC API
提供者:Sun
作用:定义与数据库建立连接、执行SQL语句、处理结果的方法
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中
DriverManager类
提供者:Sun
作用:载入各种不同的JDBC驱动程序
JDBC驱动程序
提供者:数据库厂商
作用:针对具体的数据库产品实现JDBC API中的方法
Connection  ------------->   数据库
1. 数据库的用户名
2. 密码
3. 数据库所在的机器的IP地址和端口号。
该语句必须要通过statement来执行,获得执行的结果。
4. 安装MySQL数据库
   http://jingyan.baidu.com/article/f79b7cb3a25e759144023ee7.html
  然后安装 Naticat 8 for MySQL.
1. 在MySQL中添加数据库
 1. 打开   开始->所有程序->MySQL->MySQL Server5.5->MySQL5.5 command line client。
 在这里,出现一个问题: 闪一下就消失了
解决方法:
  1. ->MySQL5.5 command line client,右键查看属性。
   拷贝出来,内容是这样:"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql.exe" "--defaults-file=C:\Program Files\MySQL\MySQL Server 5.6\my.ini" "-uroot" "-p"
    指定的配置文件是 my.ini文件,到C:\Program Files\MySQL\MySQL Server 5.6中,没有发现这个文件,只有my-default.ini。
   把 my-default.ini重命令为my.ini,再次打开,成功了。
 2. 在弹出的命令窗口中创建数据库。
  mysql命令: http://wenku.baidu.com/view/8d8f4819964bcf84b9d57bc1.html
  用数据库管理工具SQLyog,可以很方便的添加数据库,表等操作。
5. JDBC程序访问数据库的步骤
步骤一:加载JDBC驱动程序
步骤二:提供连接参数
步骤三:建立一个数据库的连接
步骤四:创建一个statement
步骤五:执行SQL语句
步骤六:处理结果
步骤七:关闭JDBC对象
Step1:加载JDBC驱动程序
根据不同的数据库加载对应厂商提供的驱动程序:
把厂商提供的驱动程序Jar包添加到classpath
在Java代码中显示加载数据库驱动程序类
    try {
    Class.forName("com.mysql.jdbc.Driver"); //step1
} catch (ClassNotFoundException cnfe) {
    System.out.println("Error loading driver: " + cnfe);
}
不同数据库厂商的驱动类名不同
Oracle10g:oracle.jdbc.driver.OracleDriver
MySQL5:com.mysql.jdbc.Driver
SQLServer2005:com.microsoft.sqlserver.jdbc.SQLServerDriver
Step2:提供连接参数

连接URL
不同数据库产品的连接URL不同
Oracle10g:jdbc:oracle:thin:@主机名:端口:数据库SID
jdbc:oracle:thin:@localhost:1521:ORCL
MySQL5:jdbc:mysql://主机名:端口/数据库名
jdbc:mysql://localhost:3306/test
SQLServer2005:jdbc:sqlserver://主机名:端口:DatabaseName=库名
jdbc:sqlserver://localhost:1433:DatabaseName=BookDB
数据库的用户名和密码

Step3:建立一个数据库的连接

从DriverManager中获得Connection对象
Connection 是数据库连接的具体代表对象,一个Connection 对象就代表一个数据库连接,可以使用 DriverManager 的getConneciton()方法传入指定的连接URL、用户名和密码
驱动程序会自动通过DriverManager.registerDriver() 方法注册,这样DriverManager就可以跟厂商的驱动程序通信了。
java.sql.SQLException 是在处理 JDBC 时经常遇到的一个受检异常对象。
PreparedStatement的使用
PreparedStatement用于执行动态SQL语句
如果有些操作只是SQL语句中某些参数会有所不同,其余的SQL子句皆相同,则可以先把SQL语句预编译并存储在 PreparedStatement,然后可以使用此对象多次高效地执行该语句。
动态SQL语句:SQL中会变动的部分用?作为参数占位符。
SELECT * FROM emp WHERE empno=?
给参数占位符传递值
PreparedStatement提供的setXxx(int parameterIndex, 值)方法
Step4:关闭JDBC对象
数据库操作的代价是昂贵的。所以,在操作完成后要把所使用的JDBC对象全都显示关闭,以释放JDBC资源。
1.JdbcUtils.java
public class JdbcUtils {
	// 表示定义数据库的用户名
	private final String USERNAME = "root";
	// 定义数据库的密码
	private final String PASSWORD = "ymangu123456";
	// 定义数据库的驱动信息
	private final String DRIVER = "com.mysql.jdbc.Driver";
	// 定义访问数据库的地址
	private final String URL = "jdbc:mysql://localhost:3306/json";
	// 定义数据库的链接
	private Connection connection;
	// 定义sql语句的执行对象
	private PreparedStatement pstmt;
	// 定义查询返回的结果集合
	private ResultSet resultSet;
	public JdbcUtils() {
		try {
			Class.forName(DRIVER);
			System.out.println("注册驱动成功!!");
		} catch (Exception e) {
		}
	}
	// 定义获得数据库的链接
	public Connection getConnection() {
		try {
			connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return connection;
	}
	/**
	 * 完成对数据库的表的添加删除和修改的操作
	 */
	public boolean updateByPreparedStatement(String sql, List<Object> params)
			throws SQLException {
		boolean flag = false;
		int result = -1;// 表示当用户执行添加删除和修改的时候所影响数据库的行数
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		result = pstmt.executeUpdate();
		flag = result > 0 ? true : false;
		return flag;
	}
	/**
	 * 查询返回单条记录
	 */
	public Map<String, Object> findSimpleResult(String sql, List<Object> params)
			throws SQLException {
		Map<String, Object> map = new HashMap<String, Object>();
		int index = 1;
		pstmt = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		resultSet = pstmt.executeQuery();// 返回查询结果
		ResultSetMetaData metaData = resultSet.getMetaData();
		int col_len = metaData.getColumnCount();// 获得列的名称
		while (resultSet.next()) {
			for (int i = 0; i < col_len; i++) {
				String cols_name = metaData.getColumnName(i + 1);
				Object cols_value = resultSet.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}
				map.put(cols_name, cols_value);
			}
		}
		return map;	}
	/**
	 * 查询返回多行记录
	 */
	public List<Map<String, Object>> findMoreResult(String sql,
			List<Object> params) throws SQLException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		int index = 1;
		pstmt = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		resultSet = pstmt.executeQuery();
		ResultSetMetaData metaData = resultSet.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (resultSet.next()) {
			Map<String, Object> map = new HashMap<String, Object>();
			for (int i = 0; i < cols_len; i++) {
				String cols_name = metaData.getColumnName(i + 1);
				Object cols_value = resultSet.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}
				map.put(cols_name, cols_value);
			}
			list.add(map);
		}
		return list;
	}

	// jdbc的封装可以用反射机制来封装:
	public <T> T findSimpleRefResult(String sql, List<Object> params,
			Class<T> cls) throws Exception {
		T resultObject = null;
		int index = 1;
		pstmt = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		resultSet = pstmt.executeQuery();
		ResultSetMetaData metaData = resultSet.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (resultSet.next()) {
			// 通过反射机制创建实例
			resultObject = cls.newInstance();
			for (int i = 0; i < cols_len; i++) {
				String cols_name = metaData.getColumnName(i+1);
				Object cols_value = resultSet.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}				
				Field field = cls.getDeclaredField(cols_name);
				field.setAccessible(true);// 打开javabean的访问private权限
				field.set(resultObject, cols_value);				
			}
		}
		return resultObject;
	}

	/**
	 * 通过反射机制访问数据库
	 */
	public <T> List<T> findMoreRefResult(String sql, List<Object> params,
			Class<T> cls) throws Exception {
		List<T> list = new ArrayList<T>();
		int index = 1;
		pstmt = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		resultSet = pstmt.executeQuery();
		ResultSetMetaData metaData = resultSet.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (resultSet.next()) {
			T resultObject = cls.newInstance();
			for (int i = 0; i < cols_len; i++) {
				String cols_name = metaData.getColumnName(i + 1);
				Object cols_value = resultSet.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}
				Field field = cls.getDeclaredField(cols_name);
				field.setAccessible(true);
				field.set(resultObject, cols_value);
			}
			list.add(resultObject);
		}
		return list;
	}
	public void releaseConn() {
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JdbcUtils jdbcUtils = new JdbcUtils();
		jdbcUtils.getConnection();
		// String sql = "insert into userinfo(username,pswd) values(?,?)";
		// List<Object> params = new ArrayList<Object>();
 		// params.add("123");
		// try {
		// boolean flag = jdbcUtils.updateByPreparedStatement(sql, params);
		// System.out.println(flag);
		// } catch (SQLException e) {
		// // TODO Auto-generated catch block
		// e.printStackTrace();
		// }
		String sql = "select * from person where id=?";
		List<Object> params = new ArrayList<Object>();
		params.add(1);
		try {
//			List<UserInfo> list = jdbcUtils.findMoreRefResult(sql,
//					null, UserInfo.class);
			UserInfo user=jdbcUtils.findSimpleRefResult(sql,
					params, UserInfo.class);
//			Map<String,Object> map=jdbcUtils.findSimpleResult(sql, params);
			System.out.println(user);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			jdbcUtils.releaseConn();
		}
	}

}
查询多个对象时用:String sql = "select * from userinfo ";
List<UserInfo> list = jdbcUtils.findMoreRefResult(sql,null, UserInfo.class);
就可从localhost连接下的json数据库的person表中 取出数据。
2. UserInfo.java
定义3个变量:id,username,pswd.
然后自动实现它的toString,get/set方法,就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值