JDBC的源码解析、basedao和文件流封装讲解

JDBC三种封装思想

JDBC对后台来说是一个非常重要的东西,而且使用是很频繁的,对JDBC的熟练掌握是非常重要的。在此小编为大家分享三种JDBC的思想。分别是源码解析basedao封装文件流封装。在讲解JDBC三种思想之前要给数据库导入JDBC的包,此处我使用的是**mysql-connector-java-5.1.45-bin.jar**。网盘链接为:https://pan.baidu.com/s/1Dd4NWrjyBdHWOBWxU0La3w,密码:ot2j

JDBC源码解析

对数据库的操作最基本的就是增删改查,所以对JDBC源码解析也有增删改查四种。源码解析分为7个步骤,分别是:

  1. 加载数据库驱动
  2. 创建数据库连接
  3. 准备SQL语句
  4. 处理SQL语句
  5. 产生结果
  6. 处理结果
  7. 释放资源

增加源码

 public static void addUser(){
        try {
            //(1)加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //(2)创建数据库连接
            Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_sjpssm?useSSL=true&characterEncoding=utf8","root","sjp691157");
            //db_sjpssm是数据框名字,root是数据库用户名,sjp691157是数据库密码
            System.out.println("数据库连接成功!");

            //(3)准备SQL语句
            String sql="insert into tb_user values(null,?,?,?)";    //?代表占位符,占空座位,目的是放数据

            System.out.println("请输入用户名称:");
            String username=in.next();
            System.out.println("请输入用户密码:");
            String password=in.next();
            System.out.println("请输入用户类型:");
            int tid=in.nextInt();

            //(4)处理SQL语句
            PreparedStatement pstm=conn.prepareStatement(sql);
            pstm.setString(1,username);
            pstm.setString(2,password);
            pstm.setString(3, String.valueOf(tid));

            //(5)产生结果
            int num=pstm.executeUpdate();

            //(6)处理结果
            System.out.println("新增成功<"+num+">行受到影响");

            //(7)释放资源
            pstm.close();
            conn.close();

        }catch (Exception e){
            e.printStackTrace();
        }
	}

删除源码

 public static void DelUser(){
        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2.创建数据库连接
            Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_sjpssm?useSSL=true&characterEncoding=utf8","root","sjp691157");
			//db_sjpssm是数据框名字,root是数据库用户名,sjp691157是数据库密码
			System.out.println("数据库连接成功!");

            //3.准备写出数据库语句
            System.out.println("请输入要删除用户的名称:");
            String name=in.next();
            String sql="delete from tb_user where username='"+name+"'";

            //4.处理SQL语句
            PreparedStatement pstm=conn.prepareStatement(sql);

            //5.产生结果
            int num=pstm.executeUpdate();

            //6.处理结果
            System.out.println("删除成功<"+num+">行受到影响");

            //7.释放资源
            pstm.close();
            conn.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }

修改源码

 public static void ModUser(){

        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2.创建数据库连接
            Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_sjpssm?useSSL=true&characterEncoding=utf8", "root","sjp691157");
            //db_sjpssm是数据框名字,root是数据库用户名,sjp691157是数据库密码
			System.out.println("数据库连接成功!");

            //3.准备SQL语句
            System.out.println("请输入要修改用户名称:");
            String name=in.next();
            System.out.println("请输入更新后的密码:");
            String password=in.next();
            System.out.println("请输入更新后的类型");
            int tid=in.nextInt();
            String sql="update tb_user set password='"+password+"',tid='"+tid+"' where username='"+name+"'";

            //4.处理SQL语句
            PreparedStatement pstm=conn.prepareStatement(sql);

            //5.产生结果
            int num=pstm.executeUpdate();

            //6.处理结果
            System.out.println("更新成功<"+num+">行受到影响");

            //7.释放资源
            pstm.close();
            conn.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }

查询源码

public  static void printAllUser(){

        try {
            //(1)加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //(2)创建数据库连接
            Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_sjpssm?useSSL=true&characterEncoding=utf8","root","sjp691157");
            //db_sjpssm是数据框名字,root是数据库用户名,sjp691157是数据库密码
            System.out.println("数据库连接成功!");

            //(3)准备写出SQL语句
           String sql="select * from tb_user";

            //(4)数据库选中语句并执行他
            PreparedStatement pstm=conn.prepareStatement(sql);

            //(5)产生结果
            ResultSet rs=pstm.executeQuery();

            //(6)处理结果
            while (rs.next()){
                System.out.println("用户编号:"+rs.getInt(1)+",用户名称:"+
                        rs.getString(2)+",用户密码:"+rs.getString(3)+",用户类型:"+rs.getString(4));
            }

            //(7)释放连接
            rs.close();
            pstm.close();
            conn.close();

        }catch (Exception e){
            e.printStackTrace();
        }finally {
        }
    }

basedao封装

刚刚给大家分享了JDBC源码解析,每一次使用数据库的时候都需要连接一次数据库,每一次都要写个三四十行代码,是不是很繁琐。在小编认为不会偷懒的程序员不是一个好程序员,所以这里在分享一种JDBC的连接方法,就是对源码解析进行封装,每一次使用的时候只要对它引用就好了。

public class DBUtil {

    public Connection conn = null;
    public PreparedStatement pstm = null;
    public ResultSet rs = null;

    }

    // 1. 实现数据库连接的获取
    public Connection getConn(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_sjpssm?useSSL=true&characterEncoding=utf8","root","sjp691157");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }


    // 2. 实现增删改的BaseDao封装
    public int executeUpdate(String sql,Object[] params){   // Object[] 占位?不知道是什么数据类型,所有用了泛型处理
        int num = 0;

        try {
            pstm = conn.prepareStatement(sql);

            // 怎么处理占位符?
            if(params!=null){
                for(int i=0;i<params.length;i++){
                    pstm.setObject((i+1),params[i]);
                }
            }
            num = pstm.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return num;
    }

    // 3. 实现查询的BaseDao封装
    public ResultSet executeQuery(String sql,Object[] params){
        ResultSet rs = null;
        try {
            pstm = conn.prepareStatement(sql);

            // 怎么处理占位符?
            if(params!=null){
                for(int i=0;i<params.length;i++){
                    pstm.setObject((i+1),params[i]);
                }
            }
            rs = pstm.executeQuery();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs;
    }

    // 4. 实现数据库资源释放
    public void closeResource(ResultSet rs, PreparedStatement pstm,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(pstm!=null){
            try {
                pstm.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

文件流封装

basedao的方法给我们节省很多精力和代码,但是basedao方法还不是最好的方法。当项目交付给客户时,他需要连接到自己的数据库,则他要怎么修改呢?给他java文件不一定看得懂,所以产生了一种文件流封装思想
首先先编写一个数据库连接信息文件,把用户名和密码等都写在db.properties中,需要修改时只要打开这个文件即可。

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/db_java1ssm?useSSL=true&characterEncoding=utf8
jdbcuser = root
pwd = 123456

接着把这个文件引用到java文件中即可。

public class DBUtil {

	 // 解决维护性功能 properties
	    private static String driver ;
	    private static String url ;
	    private static String jdbcuser ;
	    private static String pwd ;
	
	    public static Properties properties = new Properties();
	
	    // 获取db.properties资源 , static方法代表软件一打开就会自动加载资源文件
	    static {
	        try {
	            properties.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
	            driver = properties.getProperty("driver");
	            url = properties.getProperty("url");
	            jdbcuser = properties.getProperty("jdbcuser");
	            pwd = properties.getProperty("pwd");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值