一, 最原始的使用方式:
1, 连接工具类:
抽取工具类:
1. 创建一个类, 并将其构造方法私有化
2. 准备一个空该类的对象, 用 private 修饰
3. 向外界提供一个可以获取到该类对象的方法 getIns()(ps: 该方法要用 static 修饰)
4. 将加载驱动的代码放到 getIns() 中
5. 在该类中创建一个可以获得链接对象一个公共的方法
6. 在该类中创建一个关闭资源的方法 (对于每一个资源的非空判断 需要使用 try catch finally 结构)
抽取配置文件 解决硬编码:
1. 准备一个叫 db.properties 的普通 file 文件, 并将连接数据库用到的相关属性用 key value 的形式写进来
2. 在工具类中读取资源文件调用 java 自带的工具类 Properties prop=new Properties();
加载资源文件 prop.load(Thread.currentThread().getClassContextLoader().getResourceAsStream("db.properties"));
获取资源文件中的值 prop.getProperty("对应的 key")
代码:
工具类:
- package cn.xx.utils;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.Properties;
- public class JdbcUtil {
- // 私有化构造方法
- private JdbcUtil(){}
- // 准备一个对象
- private static JdbcUtil ins;
- // 向外界提供一个公共的可获取该类对象方法
- private static Properties prop=new Properties();
- public static JdbcUtil getIns(){
- try {
- prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
- Class.forName(prop.getProperty("driverClassName"));
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- if (ins==null) {
- ins=new JdbcUtil();
- }
- return ins;
- }
- public Connection getConn(){
- Connection conn=null;
- try {
- conn = DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("username"), prop.getProperty("password"));
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return conn;
- }
- public void close(ResultSet rs,PreparedStatement pst,Connection conn){
- try {
- if (rs!=null) {
- rs.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }finally {
- try {
- if (pst!=null) {
- pst.close();
- }
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- try {
- if (conn!=null) {
- conn.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
数据库配置文件: db.properties
- driverClassName=com.MySQL.jdbc.Driver
- url=jdbc:MySQL:///....
- username=....
- password=....
2, 在 Dao 层调用工具类, 实现数据操作, 下面以查询操作为例:
- package cn.xx.dao.impl;
- import java.sql.*;
- import cn.xx.dao.UserDao;
- import cn.xx.domain.User;
- import cn.xx.utils.JdbcUtil;
- public class UserDaoImpl implements UserDao{
- @Override
- public User checkUser(String name, String password) {
- Connection conn = JdbcUtil.getIns().getConn(); // 获取连接对象
- User user = null;
- String sql = "select * from t_user where name=? and password=?"; // 查询语句, 其中? 为占位符
- try {
- PreparedStatement pst = conn.prepareStatement(sql); // 预编译 sql 语句
- pst.setString(1, name); // 给占位符 --? 赋值
- pst.setString(2,password);
- ResultSet rs = pst.executeQuery(); // 查询结果集
- while(rs.next()){ // 遍历查询结果
- user = new User(); // 封装结果集
- user.setName(rs.getString("name"));
- user.setPassword(rs.getString("password"));
- user.setId(rs.getLong("id"));
- }
- JdbcUtil.getIns().close(rs, pst, conn); // 关闭数据连接
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return user;
- }
- }
二, 在 Spring 框架中, 使用 JDBC, 可以在配置文件中写入数据库的连接配置, 然后通过实例化这个 bean, 再调用 jdk 已经封装了的类 (类似于以上方法)----QueryRunner 类, 将实例化的 bean 传入, 这个类中封装了数据库的连接方法, 数据的操作方法等所需要的方法, 因此比较简单快捷.
代码实现: 配置文件
- base-package="cn.xx">
- id="conf" location="classpath:db.properties">
- id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- name="driverClassName" value="#{conf.driverName}">
- name="url" value="#{conf.url}">
- name="username" value="#{conf.username}">
- name="password" value="#{conf.password}">
数据库连接配置: db.properties 同方法一
dao 层实现:
- package cn.xx.dao.daoimpl;
- import javax.annotation.Resource;
- import javax.sql.DataSource;
- import org.apache.commons.dbutils.QueryRunner;
- import org.apache.commons.dbutils.handlers.BeanHandler;
- import org.springframework.stereotype.Repository;
- import cn.xx.bean.User;
- import cn.xx.dao.UserDao;
- @Repository("userDao")// 依赖注入 bean 容器
- public class UserDaoImpl implements UserDao {
- @Resource(name="dataSource")// 通过注解, 实例化 DataSource Bean 的类对象
- private DataSource dataSource;
- @Override
- public User login(String username, String password) throws Exception {
- String sql="select * from t_user where username=? and password=?";
- QueryRunner runner = new QueryRunner(dataSource); // 将数据库连接配置传入 QueryRunner 类以完成自动装配
- return runner.query(sql, new BeanHandler<User>(User.class),username,password); } } // 返回查询结果
三, Mybatis 和从 c3p0: 下次补充
来源: http://www.bubuko.com/infodetail-2781498.html