JDBC的开发步骤以及连接的简单封装

jdbc的开发步骤以及封装连接

jdbc是一个规范:所有数据库开发厂商对这个规范进行编程,这样Java程序员就不用考虑众多数据库语法问题等等,
jdbc也是一组API,它提供了连接数据库的Connection接口,声明连接的Statement,以及增强的preparedStatment接口(继承Statment);
以上两点让对jdbc编程更加简单,跨数据库

下面介绍jdbc开发的基本步骤

1. 加载驱动(提前要引入数据库驱动的jar包,本文以MySQL为例):

Class.forName("com.mysql.jdbc.Driver")

注:JDBC4以上此句话可以省略,会自动加载;
主要功能
Class.forName(xxx.xx.xx)返回的是一个类
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类
记不住这句话的童鞋可以这样记com.mysql.jdbc是MySQL公司的包名,Driver是具体的驱动类

2. 获取连接
Connection conn = DriverManger.getConnection("jdbc:mysql://localhost:3306/DatabaseName?useSSL=false","root","123456")
DriverManger管理一组 JDBC 驱动程序的基本服务。
jdbc连接数据库底层使用的是TCP协议;所以url格式为getConnection第一个参数;
名词解释 : (jdbc(协议):mysql(子协议)://localhost(本地数据库地址):3306(MySQL默认端口号)/DatabaseName(数据库名称,以自己的为例));
root数据库连接名;123456:数据库密码;这个是自己看自己的配置,和本文不一样哦;
3. 获得声明
Statment stmt=conn.createStatment();
4. 执行
stmt.execute(sql);可执行DDL,DML,如果有返回记录,则返回值为true,否则返回为false
stmt.executeUpdate(sql);可执行update,delete,insert.返回值为int,更新或者删除的条数,
stmt.executeQuery(sql):查询方法:返回值为ResultSet

5. 返回结果
如果是查询:返回ResultSet;
6. 关闭连接
数据库连接数量有限,所以用完要关闭
stmt.close();
conn.close();

下面介绍对jdbc连接的简单封装

首先写一下我的思路:对JDBC程序的步骤进行分析:

  1. 加载驱动:一个工程只需要加载一次:所以封装
  2. 获取连接:配置文件不太需要改动,无需每次写,所以封装;
  3. 获取声明:sql语句每次需要手动写,所以不能封装
  4. 返回结果集:可以从需要的封装方法获取
  5. 关闭连接:获取连接之后,需要关闭资源,所以封装

1.封装connection

package com.tangbaobao.utils;

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

/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午5:00:17
* 封装连接数据库
*/
public class DaoConnection {
    //获取连接
    public static Connection  getConnection() {
        String url="jdbc:mysql://localhost:3306/jdbc_test";
        String DatabaseName="root";
        String DatabasePassword="123456";
        Connection conn=null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
             conn = DriverManager.getConnection(url,DatabaseName,DatabasePassword);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

}

 
2.封装查询以及更新方法(preparedStatement)


package com.tangbaobao.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 唐学俊
 * @version 创建时间:2017年10月21日 下午8:09:30
 * 
 */
public class QueryList {
    Connection conn = null;

    // 初始化连接
    public QueryList(Connection conn) {
        if (conn != null) {
            this.conn = conn;
        } else {
            new Exception("请先获取连接");
        }
    }

    // 声明连接
    public boolean updateQuery(String sql, Object... params) throws Exception {
        boolean isUpdate = false;
        int index = 0;
        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            if (regexInput(sql, params)) {

                // 传递参数
                for (Object o : params) {
                    index++;
                    pstmt.setObject(index, o);
                }
                // 执行
                int execute = pstmt.executeUpdate();
                if (execute != 0) {
                    isUpdate = true;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            pstmt.close();
            conn.close();
        }
        return isUpdate;
    }

    /**
     * 返回查询的条数
     * 
     * @param sql
     * @param params
     * @return
     */
    // 查询方法
    public int selectQuery(String sql, Object... params) {
        int query = 0;
        int index = 0;

        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            if (regexInput(sql, params)) {
                for (Object o : params) {
                    index++;
                    pstmt.setObject(index, o);
                }
                // 执行
                ResultSet execute = pstmt.executeQuery();
                // 返回结果
                while (execute.next()) {
                    query++;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return query;

    }

    // 匹配sql中的占位符
    /**
     * 匹配字符串中目标字符的个数
     * 
     * @param str传入的字符串
     * @param regexChar匹配的字符
     * @return
     */
    public int regexChar(String str, char regexChar) {
        String partten = "\\" + regexChar + "";
        Pattern compile = Pattern.compile(partten);
        Matcher matcher = compile.matcher(str);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        return count;
    }

    // 占位符和输入项是否匹配
    private boolean regexInput(String sql, Object[] params) throws Exception {
        boolean flag = false;
        // 解析sql中的占位符
        int regexChar = regexChar(sql, '?');

        // 判断输入参数长度和占位符个数是否相等
        if (params.length != regexChar) {
            throw new Exception("输入参数和sql语句中参数不匹配,输入为" + params.length + "sql占位符为:" + regexChar);
        } else {
            flag = true;
        }
        return flag;
    }
}

3.测试package com.tangbaobao.Contraller;

import java.util.Scanner;

import com.tangbaobao.service.LoginService;

/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午4:41:38
* 登录校验模块
*/
public class Login {
    String username;
    String password;
    //初始化用户名,密码
    public Login(String username,String password) {
        this.username=username;
        this.password=password;
        boolean success = isSuccess(username, password);
        if(success) {
            System.out.println("登录成功");
        }else {
            System.out.println("用户名或密码错误");
        }
    }

    //校验用户民密码是否正确方法
    public boolean isSuccess(String username,String password) {
        boolean flag=false;
        LoginService service = new LoginService();
        flag=service.checkLogin(username,password);
        return flag;
    }
//测试
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.next();
        System.out.println("请输入用密码");
        String password = sc.next();
        Login login=new Login(username, password);
    }
}
package com.tangbaobao.service;

import com.tangbaobao.dao.LoginDao;

/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午4:52:26
* 业务逻辑处理
*/
public class LoginService {

    public boolean checkLogin(String username, String password) {
        //没有业务处理,将请求传递到dao层
        LoginDao dao = new LoginDao();
        boolean isExist=false;
        try {
            isExist = dao.checkLogin(username,password);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return isExist;
    }
}
package com.tangbaobao.dao;



import com.tangbaobao.utils.DaoConnection;
import com.tangbaobao.utils.QueryList;

/**
* @author 唐学俊
* @version 创建时间:2017年10月21日 下午4:55:22
* 数据业务处理
*/
public class LoginDao {
//校验用户名密码是否存在方法
    public boolean checkLogin(String username, String password) throws Exception {
        //1.加载驱动,获取连接
        QueryList query =new QueryList(DaoConnection.getConnection());
        //2.书写sql语句
        String sql="select * from user where username=? and password=?";
        //返回结果
        int updateQuery = query.selectQuery(sql,username,password);
        return updateQuery>0?true:false;
    }
}

你可能感兴趣的:(javaee)