JDBC进阶使用(代码+注释)

news/2024/5/19 1:38:02 标签: jdbc, 数据库, java, mysql

JDBC进阶使用(代码+注释)

  • 前言
  • 一、JDBC工具类
  • 二、JDBC配置文件
  • 三、使用JDBC工具类的实例
  • 四、SQL语句采用字符串拼接的方式
  • 五、PreparedStatement方式
  • 六、JDBC的事务管理的实例
  • 总结

前言

全是JDBC代码,包括了JDBC的所有用法。主要记录自己的jdbc的学习,并且在将来可以回顾。

一、JDBC工具类

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

public class JdbcUtils {

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

    static {
        //读取资源文件,获取值

        //1、创建Propertiies集合类
        Properties pro = new Properties();

        //获取src路径下的文件方式-classLoder 类加载器
        ClassLoader classLoader =JdbcUtils.class.getClassLoader();
        URL res = classLoader.getResource("jdbc.properties");
        String path = res.getPath();
        //2.加载文件
        try {
            pro.load(new FileReader(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //3.获取数据,数值
        url = pro.getProperty("url");
        user = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");
        //注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    //获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    //关闭所有打开的资源
    public static void close(Statement stmt, Connection conn)
    {
        close(null,stmt,conn);
    }

    public static void close(ResultSet rs,Statement stmt, Connection conn)
    {
        if(rs != null)
        {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(stmt != null) {
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

}

二、JDBC配置文件

jdbc.properties文件中

java">url=jdbc:mysql://localhost/test
user=li
password=123456
driver=com.mysql.jdbc.Driver

三、使用JDBC工具类的实例

java">import pojos.Emp;

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

public class jdbcDemo5 {
    static String url="jdbc:mysql://localhost/test";
    static String user="li";
    static String password="123456";
    public static void main(String[] args){
        //1.导入驱动jar包
        //2.注册驱动
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Emp> res = new ArrayList<Emp>();
        try {
            conn = JdbcUtils.getConnection();
            //4.定义sql
            String sql = "select * from emp";
            //5.获取执行sql的对象Statement
            stmt = conn.createStatement();
            //6.执行sql
            rs = stmt.executeQuery(sql);
            while(rs.next())
            {
                Emp emp = new Emp();
                int id = rs.getInt(1);
                String name= 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.setId(id);
                emp.setEname(name);
                emp.setJobId(job_id);
                emp.setMgr(mgr);
                emp.setJoindate(joindate);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDeptId(dept_id);
                res.add(emp);
            }
            for(Emp s : res)
            {
                System.out.println(s.toString());
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils.close(rs,stmt,conn);
        }
    }
}

四、SQL语句采用字符串拼接的方式

java">import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class jdbcDemo6 {

    //登陆方法
    public boolean login(String username,String password){

        if(username == null || password == null) {
            //没有输入账号或密码,返回不成功
            return false;
        }

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        //连接数据库,判断是否登录成功
        //1、获取连接
        try {
            conn = JdbcUtils.getConnection();
            //2、定义SQL
            String sql = "SELECT * FROM user WHERE username = '" + username + "' AND password = '" + password + "'";
            //3、获取执行SQL的对象
            stmt = conn.createStatement();
            //4、执行查询
            rs = stmt.executeQuery(sql);
            //5、判断if(rs.next()) {//如果有下一行,则返回true
            //                return true;
            //            }
            //            else{
            //                return false;
            //            }
            return rs.next();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils.close(rs,stmt,conn);
        }
        return false;
    }
    //'a' or '1'='1'跳过登录
    public static void main(String[] args) {
        //1、键盘录入,接收用户名和密码
        Scanner sc = new Scanner(System.in);
        String username,password;
        System.out.println("请输入用户名");
        username = sc.nextLine();
        System.out.println("请输入密码");
        password = sc.nextLine();
        //2、调用方法
        boolean flag = new jdbcDemo6().login(username,password);
        //3、判断结果,输出不同语句
        if(flag){
            //登陆成功
            System.out.println("登录成功");
        }
        else{
            //登陆失败
            System.out.println("登陆失败");
        }
    }
}

五、PreparedStatement方式

SQL字符串拼接导致的跳过用户查询是极其不安全的方法,从而使用PreparedStatement方式去代替传统的Statement的方式。

java">import java.sql.*;
import java.util.Scanner;

public class jdbcDemo7 {

    //登陆方法
    public boolean login(String username,String password){

        if(username == null || password == null) {
            //没有输入账号或密码,返回不成功
            return false;
        }

        Connection conn = null;
        //Statement stmt = null;
        PreparedStatement stmt =null;
        ResultSet rs = null;

        //连接数据库,判断是否登录成功
        //1、获取连接
        try {
            conn = JdbcUtils.getConnection();
            //2、定义SQL
            String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
            //3、获取执行SQL的对象
            stmt = conn.prepareStatement(sql);
            //添加数据
            stmt.setString(1,username);
            stmt.setString(2,password);
            //4、执行查询
            rs = stmt.executeQuery();
            return rs.next();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils.close(rs,stmt,conn);
        }
        return false;
    }
    //'a' or '1'='1'跳过登录
    public static void main(String[] args) {
        //1、键盘录入,接收用户名和密码
        Scanner sc = new Scanner(System.in);
        String username,password;
        System.out.println("请输入用户名");
        username = sc.nextLine();
        System.out.println("请输入密码");
        password = sc.nextLine();
        //2、调用方法
        boolean flag = new jdbcDemo7().login(username,password);
        //3、判断结果,输出不同语句
        if(flag){
            //登陆成功
            System.out.println("登录成功");
        }
        else{
            //登陆失败
            System.out.println("登陆失败");
        }
    }
}

六、JDBC的事务管理的实例

java">import java.sql.*;

public class jdbcDemo8 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement stmt = null;
        PreparedStatement stmt2 = null;
        //1.获取连接
        try {
            conn = JdbcUtils.getConnection();
            //开启事务
            conn.setAutoCommit(false);
            //2.定义sql
            //2.1 张三-500
            String sql = "update account set balance = balance - ? where id = ?";
            //2.2 李四+500
            String sql2 = "update account set balance = balance + ? where id = ?";
            //3.获取执行sql对象
            stmt = conn.prepareStatement(sql);
            stmt = conn.prepareStatement(sql);
            stmt2 = conn.prepareStatement(sql2);
            //4.设置参数
            stmt.setDouble(1,500);
            stmt.setInt(2,1);

            stmt2.setDouble(1,500);
            stmt2.setInt(2,2);
            //5.执行sql
            stmt.executeUpdate();
            //手动异常
            int i = 3/0;
            stmt2.executeUpdate();
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            try {
                if(conn != null){
                    conn.rollback();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JdbcUtils.close(stmt,conn);
            JdbcUtils.close(stmt2,null);
        }
    }
}

总结

里面包含了所有的JDBC的用法,给自己看,同时如果有喜欢的小伙伴可以评论讨论。


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

相关文章

ElasticSearch入门介绍之会当凌绝顶(一)

ElasticSearch也是一款非常优秀的开源的全文检索框架&#xff0c;以大名鼎鼎的Apache Lucene为基础&#xff0c;高度封装了更丰富&#xff0c;易用的API&#xff0c;同时与Apache Solr一样&#xff0c;提供了非常强大的分布式集群功能&#xff01; 有不懂ElasticSearch&#…

Druid数据库连接池

Druid数据库连接池前言一、Druid需要的jar包二、Druid的配置文件三、Druid工具类库四、使用工具类的实例总结前言 数据库连接池&#xff08;包括需要的jar包、用Druid写的工具类&#xff0c;使用Druid工具类实现的JDBC操作&#xff09; 一、Druid需要的jar包 二、Druid的配置…

C常见笔试题(一)

一.strcat、strcpy、strcmp、strlen函数的实现1实现strcat函数格式&#xff1a;extern char *strcat(char *dest,char *src);功能&#xff1a;把src所指字符串添加到dest结尾处并添加\0&#xff1b;返回&#xff1a;指向dest的指针。实现&#xff1a;char *Mystrcat(char*dest,…

Spring的JavaBean处理null字段

Spring的JavaBean处理null字段前言一、产生这种问题的原因二、解决方法一、修改实体类字段名的属性值二、重载JavaBean类方法总结前言 今天遇到一个问题&#xff0c;在用Spring框架提供的JavaBean方法时&#xff08;将数据库查询的内容封装自己写的实体类的时候&#xff09;&a…

攻城师们,你懂女孩子么?

[b][colorgreen][sizelarge]相信还有不少的同行程序员&#xff0c;都是单身贵族&#xff0c;那么问题来了&#xff0c;年关逼近&#xff0c;是否有来自父母催婚的压力呢&#xff1f; 是否有打算过年回家相亲的计划呢&#xff1f;是否还有找不到女朋友的种种感慨么&#xff1f;是…

IDEA的一些玄学问题

IDEA的一些玄学问题前言玄学问题一、IDEA下载文件找不到二、resource资源文件的xml找不到三、mybaits在使用&#xff08;Mapper.方法名&#xff09;找不到Mapper四、重载java与数据库类型转化方法时出现的注册不上的问题总结前言 当很多人看到这个标题的时候&#xff0c;是不是…

ElasticSearch入门介绍之安装部署(二)

散仙&#xff0c;在上篇文章对ElasticSearch整体入门作了个介绍&#xff0c;那么本篇我们来看下&#xff0c;如何安装&#xff0c;部署es&#xff0c;以及如何安装es的几个比较常用的插件. es的安装和部署&#xff0c;是非常简单方便的&#xff0c;至少这一点散仙在es和solr之…

C常见笔试题(二)

第一章C语言常见问题 1.1关作键字static的用 这个简单的问题很少有人能回答完全。在C语言中&#xff0c;关键字static有三个明显的作用&#xff1a; 1)在函数体内&#xff0c;一个被声明为静态的变量在这一函数被调用过程中维持其值不变&#xff08;该变量存放在静态变量区&…