3.【JDBC工具类】

news/2024/5/18 21:49:23 标签: jdbc

简化书写:注册驱动、获取连接对象、释放资源等等。

需要抽取的代码

  • 加载sql配置文件、注册驱动:静态代码块(因为只需加载一次即可)
  • 获取连接对象:抽取为一个方法
  • 释放资源:抽取为一个方法

需求

  • 在获取连接对象时,不想传递参数(麻烦),还得保证工具类的通用性。
 conn = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");

思路

使用配置文件

jdbc.properties
	url=
	user=
	password=
	driver=

代码实现

package cn.luis.demo3.util;

import jdk.jfr.Description;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * @ClassName JDBCUtils
 * @Description JDBC工具类
 * @Author L
 * @Date 2020.01.18 11:45
 * @Version 1.0
 * @Remark 工具类一般都是静态的,方便调用
 **/
public class JDBCUtils {

    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /**
     * @Author Lius
     * @Description 静态代码块
     * @Date 12:22 2020.01.18
     * @Param 
     * @Return 
     * @Tip 只需读取一次即可拿到这些值,
     **/
    static {
        // 读取资源文件,获取值
        try {
            // 1.创建Properties集合类
            Properties pro = new Properties();
            // 2.加载文件
            // 2.1(动态)获取src路径下的文件的方式:Classloader 类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            // 资源定位
            URL resource = classLoader.getResource("jdbc.properties");
            // 绝对路径
            String path = resource.getPath();
            // System.out.println(path);
            // 2.2
            pro.load(new FileReader(path));
            // 3.获取属性,赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            // 4.注册驱动
            Class.forName(driver);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    /**
     * @Author Lius
     * @Description 获取连接
     * @Date 11:47 2020.01.18
     * @Param []
     * @Return java.sql.Connection 返回连接对象
     **/
    public static Connection getConnection() throws SQLException {

        return DriverManager.getConnection(url,user,password);
    }
    /**
     * @Author Lius
     * @Description 释放资源(增删改)
     * @Date 11:51 2020.01.18
     * @Param [stmt, conn]
     * @Return void
     **/
    public static void close(Statement stmt, Connection conn) {
        if(stmt != null) {
            // 注意:stmt、和conn最好不要写在一个try里面关闭,若stmt报错,conn无法关闭!
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * @Author Lius
     * @Description 释放资源(查询时)
     * @Date 11:51 2020.01.18
     * @Param [stmt, conn]
     * @Return void
     **/
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

演示JDBC工具类

package cn.luis.demo1.jdbc;

import cn.luis.demo2.domain.Emp;
import cn.luis.demo3.util.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description 定义一个方法
 * @Author L
 * @Date 2020.01.18 10:34
 * @Version 1.0
 * @Remark
 **/
public class JDBCDemo10 {

    public static void main(String[] args) {
        List<Emp> list = new JDBCDemo10().findALL();     
        System.out.println(list.size());
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * @Author Lius
     * @Description 演示JDBC工具类 数据库是:db2
     * @Date 10:36 2020.01.18
     * @Param []
     * @Return java.util.List<cn.luis.demo2.domain.Emp>
     **/
    public List<Emp> findALL() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Emp> list = null;

        try {
            // 1.注册驱动
            // 2.获取连接【使用JDBCUtil工具类】
            conn = JDBCUtils.getConnection();
            // 3.定义sql
            String sql = "select * from emp";
            // 4.获取执行sql对象
            stmt = conn.createStatement();
            // 5.执行sql语句
            rs = stmt.executeQuery(sql);
            // 6.遍历结果集,封装对象,装载集合
            // 创建emp对象
            Emp emp = null;
            list = new ArrayList<>();
            while (rs.next()) {
                // 6.处理结果("id"):要和数据库中的名称相同!!!
                int id = rs.getInt("id");
                String ename = rs.getString("ename");
                int job_id = rs.getInt("job_id");
                int mgr = rs.getInt("mgr");
                Date joindate = rs.getDate("joindate");
                double salary = rs.getDouble("salary");
                double bonus = rs.getDouble("bonus");
                int dept_id = rs.getInt("dept_id");
                // 创建emp对象
                emp= new Emp();
                emp.setId(id);
                emp.setEname(ename);
                emp.setJpb_id(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDept_id(dept_id);
                // 装载集合
                list.add(emp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs,stmt,conn);
        }
        return list;
    }
}

结果:

14
Emp{id=1001, ename='孙悟空',... salary=8000.0, bonus=0.0, dept_id=20}
...
Emp{id=1014, ename='关羽',...salary=13000.0, bonus=0.0, dept_id=10}

案例:使用JDBCUtil工具类模拟登陆功能

需求

  1. 通过键盘录入用户名和密码

  2. 判断用户是否登录成功

    如果这个sql有查询结果,则成功,反之,则失败

select * from user where username = "" and password = "";
  • 创建数据库表 user
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32),
	PASSWORD VARCHAR(32)

);

INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');

代码实现

package cn.luis.demo1.jdbc;

import cn.luis.demo2.domain.Emp;
import cn.luis.demo3.util.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @Description 定义一个方法
 * @Author L
 * @Date 2020.01.18 10:34
 * @Version 1.0
 * @Remark 
 **/
public class JDBCDemo11 {

    public static void main(String[] args) {
        // 1.键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.print("输入用户名:");
        String username = sc.next();
        System.out.print("输入密码:");
        String password = sc.next();
        // 2.调用方法
        boolean flag = new JDBCDemo11().login(username, password);
        // 3.判断结果
        if(flag) {
            System.out.println("登陆成功!");
        } else {
            System.out.println("用户名或密码错误!");
        }

    }
    /**
     * @Author Lius
     * @Description 练习,登录方法
     * @Date 10:36 2020.01.18
     * @Param []
     * @Return java.util.List<cn.luis.demo2.domain.Emp>
     **/
    public boolean login(String username, String password) {
        if(username == null || password == null) {
            return false;
        }
        // 连接数据库

        // 1.获取连接
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {

            // 1.获取连接
            conn = JDBCUtils.getConnection();
            // 2.定义sql
            String sql = "select * from user where username = '"+ username +"' and password = '"+  password +"'";
            // 3.获取执行sql对象
            stmt = conn.createStatement();
            // 4.执行sql语句
            rs = stmt.executeQuery(sql);
            // 5.判断
            /*if(rs.next()) { // 如果有下一行,则返回true
                return true;
            } else {
                return false;
            }*/
            return rs.next(); // 如果有下一行,则返回true
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs,stmt,conn);
        }
        return false;
    }
}

结果:

输入用户名:zhangsan
输入密码:123
Sat Jan 18 13:35:28 CST 2020 WARN: ...
登陆成功!

http://www.niftyadmin.cn/n/1850140.html

相关文章

jquery+ajax+C#实现无刷新操作数据库数据

我们知道同步执行和异步执行的区别&#xff0c;为了更好的提高用户的体验&#xff0c;我们都会采用异步方式去处理一些问题&#xff0c;毕竟单线程的同步可能回造成卡死等现象&#xff0c;很不友好&#xff0c;所以可以使用ajax来完成用户的体验&#xff0c;现在我们就来说说如…

4.【JDBC事务】

事务 概念&#xff1a;一个包含多个步骤的业务操作。如果这个业务操作被事务管理&#xff0c;则这多个步骤要么同时成功&#xff0c;要么同时失败。 操作 开启事务提交事务回滚事务 使用Connection对象来管理事务 开启事务&#xff1a;在执行sql前开启事务 调用该方法设置…

5.【数据库连接池】

概念 获取数据库连接的操作&#xff0c;是向系统底层申请资源的&#xff0c;是非常耗时的&#xff0c;为了避免资源浪费&#xff0c;我们使用连接池技术。 连接池&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。 当系统初始化好后&#xff0c;容器被…

C#之自动提交表单登录QQ空间...

本程序完整源码下载地址:http://download.csdn.net/download/friendan/4358792呵呵&#xff0c;用程序自动登录网站&#xff0c;那是我很想要的一个功能,用分析数据包&#xff0c;模拟发包的方式&#xff0c;难度不小...在网上找了很久&#xff0c;有关C#自动登录web的文章&…

6.【数据库连接池工具类】

搭建步骤 定义一个类提供静态代码块加载配置文件&#xff0c;初始化连接池对象提供方法 获取连接方法&#xff1a;通过数据库连接池获取连接释放资源获取连接池的方法 代码&#xff1a; package cn.luis.DataSource.util;import com.alibaba.druid.pool.DruidDataSourceFac…

Semantic Analysis

http://www.semanticsearchart.com/research.html转载于:https://www.cnblogs.com/stoneresearch/archive/2012/06/09/4336309.html

7.【Spring JDBC】

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象&#xff0c;用来简化JDBC的开发。 步骤 1. 导入jar包&#xff08;5个&#xff09; commons-logging-1.2.jar spring-beans-5.0.0.RELEASE.jar spring-core-5.0.0.RELEASE.jar spring-jdbc-5.0.0.RELEASE.jar spr…

C语言链接属性与extern、static关键字

标识符的链接属性决定如何处理在不同文件中出现的标识符&#xff0c;链接属性有三种&#xff1a;external&#xff08;外部&#xff09;、internal&#xff08;内部&#xff09;和none&#xff08;无&#xff09;&#xff0c;没有链接属性的标识符&#xff08;none&#xff09;…