Java 数据库篇

一、简易封装JDBC工具类

package com.jackie.MyBatis.main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcHelper {

    private static Connection conn = null;
    
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8";
            String user = "jackie";
            String pass = "123456";
            conn = DriverManager.getConnection(url, user, pass);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
    
    private void close(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if(rs != null && !rs.isClosed()) {
                rs.close();
            }
            if(stmt != null && !stmt.isClosed()) {
                stmt.close();
            }
            if(conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public Role getRole(int id) {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            String sql = "select * from role where id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, id);    // 注意从1开始计数
            rs = ps.executeQuery();
            
            Role role = null;
            while(rs.next()) {
                int roleId = rs.getInt("id");
                String name = rs.getString("name");
                role = new Role(roleId, name);
            }
            return role;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        } finally {
            this.close(rs, ps, conn);
        }
    }
}

实体类Role:

package com.jackie.MyBatis.main;

public class Role {

    private int id;
    
    private String name;

    public Role(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "[" + id + "," + name + "]";
    }

    // getter and setter omitted
    
}

使用:

public class Test {
    public static void main(String[] args) {
        JdbcHelper helper = new JdbcHelper();
        System.out.println(helper.getRole(1));
    }
}

二、三层架构

配置数据源 context.xml(也可以使用一些第三方的数据源库,如 c3p0):

<?xml version="1.0" encoding="UTF-8"?>
<context>
    <resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" username="jackie"
        password="123456" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8" />
</context>

Dao层:

BaseDao:

package com.jackie.MyBatis.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class BaseDao {
    
    /**
     * 查找JNDI,获得数据源对象,再获得数据库连接对象
     */
    private Connection getConnection() {
        Connection conn = null;
        Context ctx = null;
        try {
            ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
            conn = ds.getConnection();
        } catch (NamingException | SQLException e) {
            e.printStackTrace();
        }
        if(conn == null) {
            System.err.println("无法建立数据库连接");
        }
        return conn;
    }
    
    private void closeAll(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if(rs != null & !rs.isClosed()) {
                rs.close();
            }
            if(stmt != null & !stmt.isClosed()) {
                stmt.close();
            }
            if(conn != null & !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    private void closeAll(Connection conn, Statement stmt) {
        closeAll(conn, stmt, null);
    }
    
    public int executeUpdate(String sql, Object... params) {
        int result = 0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = getConnection();
            if(conn != null && !conn.isClosed()) {
                pstmt = conn.prepareStatement(sql);
                if(params != null) {
                    for (int i = 0; i < params.length; i++) {
                        pstmt.setObject(i + 1, params[i]);
                    }
                }
                result = pstmt.executeUpdate();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeAll(conn, pstmt);
        }
        return result;
    }
    
    public Object executeQuery(RSProcessor processor, String sql, Object... params ) {
        Object result = null;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            if(conn != null && !conn.isClosed()) {
                pstmt = conn.prepareStatement(sql);
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
                rs = pstmt.executeQuery();
                result = processor.process(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeAll(conn, pstmt, rs);
        }
        return result;
    }
    
}

RSProcessor:

package com.jackie.MyBatis.dao;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 用于将Result对象指向的数据,转换成想要的对象
 */
public interface RSProcessor {
    Object process(ResultSet rs) throws SQLException;
}

数据Dao —— UserDao:

package com.jackie.MyBatis.dao;

import java.util.List;

import com.jackie.MyBatis.domain.User;

public interface UserDao {
    List<User> getAllUsers();
    User getUserByName(String userName);
    int addUser(User user);
}

 

posted @ 2017-01-13 22:21  不抛弃,不放弃  阅读(455)  评论(0编辑  收藏  举报