JDBC: 2.初级教程

搭建

依赖

 <dependencies>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
    </dependencies>

jdbc.properties

url=jdbc:mysql://localhost:3306/phone_book_console?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username=root
pwd=root
driver=com.mysql.jdbc.Driver

封装JDBC工具类

package com.utils;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 */
public class JdbcUtils {

    //成员变量,作用全局
    private static String url;
    private static String username;
    private static String pwd;

    //静态块,只初始化一次,用来初始化jdbc.properties和注册数据库驱动
    static {
        try {
            //实例化Properties对象
            Properties properties = new Properties();
            //获取读取properties文件的字节输入流对象
            InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            //读取properties文件并解析
            properties.load(is);
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            pwd = properties.getProperty("pwd");
            String driver = properties.getProperty("driver");
            //加载并注册数据库驱动,一次即可
            Class.forName(driver);

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

    //获取数据库连接对象
    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, username, pwd);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }

    //关闭连接对象
    public static void closeConnection(Connection connection) {
        try {
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //提交事务
    public static void commit(Connection connection) {
        try {
            connection.commit();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //事务回滚
    public static void rollback(Connection connection) {
        try {
            connection.rollback();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //关闭Statement对象
    public static void closeStatement(Statement statement) {
        try {
            statement.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //关闭ResultSet
    public static void closeResultSet(ResultSet resultSet) {
        try {
            resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    //DML操作时关闭资源
    public static void closeResource(Statement statement, Connection connection) {
        //先关闭Statement对象
        closeStatement(statement);
        //在关闭Connection对象
        closeConnection(connection);
    }

    //查询时关闭资源
    public static void closeResource(ResultSet resultSet, Statement statement, Connection connection) {
        //先关闭ResultSet
        closeResultSet(resultSet);
        //在闭Statement对象
        closeStatement(statement);
        //最后关闭Connection对象
        closeConnection(connection);
    }
}

Driver接口

Driver接口的作用是来定义数据库驱动对象应该具备的一些能力,比如与数据库建立连 接的方法的定义,该接口是提供给数据库厂商使用的,所有支持 java 语言连接的数据库都实现了该接口,实现该接口的类我们称之为数据库驱动类

DriverManager类

简介

DriverManager是驱动程序管理器,是负责管理数据库驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 DriverManager 通过实例化的数据库驱动对象,能够建立应用程序与数据库之间建立连接并返回Connection接口类型的数据库连接对象

getConnection()

getConnection(String jdbcUrl, String user, String password) 该方法通过访问数据库的 url、用户以及密码,返回对应的数据库的 Connection 对象

示例:连接mysql数据库

String url = "jdbc:mysql://localhost:3306/test?useSSL=false";

String name = "root";

String pwd = "root";

//通过反射实现数据库驱动的加载与注册

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

Connection connection = DriverManager.getConnection(url, name, pwd); System.out.println(connection);

Connection接口

简介

Connection是数据库的连接(会话)对象,对数据库的一切操作都是在这个连接基础之上进行的,我们可以通过该对象执行sql语句并返回结果

方法

复制代码
createStatement():创建向数据库发送 sql 的 Statement 接口类型的对象
preparedStatement(sql):创建向数据库发送预编译 sql 的 PrepareSatement 接口类型的对象
setAutoCommit(boolean autoCommit):设置事务是否自动提交
commit():在链接上提交事务
rollback():在此链接上回滚事务

Statement

简介

用于执行静态 SQL 语句并返回它所生成结果的对象,由 createStatement 创建,用于发送简单的 SQL 语句(不支持动态绑定)

注意

由于Statement对象是一个执行静态SQL语句的对象,所以该对象存在SQL注入风险

方法

execute(String sql):执行参数中的 SQL,返回是否有结果集。

executeQuery(String sql):运行 select 语句,返回 ResultSet 结果集。 executeUpdate(String sql):运行 insert/update/delete 操作,返回更新的行数。 addBatch(String sql):把多条 sql 语句放到一个批处理中。

executeBatch():向数据库发送一批 sql 语句执行。

添加数据

/**
 * Statement对象的使用
 */
public class StatementTest {


    /**
     * 添加用户
     */
    public void insertUsers(String username,int userage){
        Connection connection = null;
        Statement statement = null;
        try{
            //获取Connection对象。
            connection = JdbcUtils.getConnection();
            //获取Statement对象
            statement = connection.createStatement();
            //定义需要执行的SQL语句
            String sql = "insert into users values(default,'"+username+"',"+userage+")";
            //执行SQL,返回boolean值,如果sql有结果集返回,那么返回值为true,如果没有结果集返回,则返回false。
            boolean execute = statement.execute(sql);
            System.out.println(execute);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(statement,connection);
        }
    }
}         

修改数据

 /**
     * 修改用户信息
     */
    public void updateUsers(int userid,String username,int userage){
        Connection connection = null;
        Statement statement = null;
        try{
            //获取连接对象
            connection = JdbcUtils.getConnection();
            //获取Statement对象
            statement = connection.createStatement();
            //定义sql语句
            String sql ="update users set username='"+username+"',userage="+userage+" where userid="+userid;
            //执行sql语句
            int i = statement.executeUpdate(sql);
            System.out.println(i);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(statement,connection);
        }
    }

删除数据

    /**
     * 根据用户ID删除用户
     */
    public void deleteUsersById(int userid){
        Connection connection =null;
        Statement statement = null;
        try{
            //获取数据库连接
            connection = JdbcUtils.getConnection();
            //获取Statement对象
            statement = connection.createStatement();
            //定义执行删除语句
            String sql = "delete from users where userid="+userid;
            //执行sql
            int i = statement.executeUpdate(sql);
            System.out.println(i);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(statement,connection);
        }
    }

preparedStatement

简介

继承自Statement接口,由preparedStatement方法创建, PreparedStatement具有预编译SQL语句能力,所以PreparedStatement对象比 Statement 对象的效率更高, 由于实现了动态的参数绑定,所以可以防止SQL注入,所以我们一般都使用PreparedStatement

特点

复制代码
1.PreparedStatement 接口继承 Statement 接口
2.PreparedStatement 效率高于 Statement
3.PreparedStatement 支持动态绑定参数
4.PreparedStatement 具备 SQL 语句预编译能力
5.使用 PreparedStatement 可防止出现 SQL 注入问题

方法

复制代码
addBatch():把当前 sql 语句加入到一个批处理中
execute():执行当前 SQL,返回个 boolean 值
executeUpdate():运行 insert/update/delete 操作,返回更新的行数。
executeQuery():执行当前的查询,返回一个结果集对象
setDate(int parameterIndex, Date x):向当前SQL语句中的指定位置绑定一个java.sql.Date值
setDouble(int parameterIndex, double x): 向当前 SQL 语句中的指定位置绑定一个 double值
setFloat(int parameterIndex, float x): 向当前 SQL 语句中的指定位置绑定一个 float 值
setInt(int parameterIndex, int x): 向当前 SQL 语句中的指定位置绑定一个 int 值
setString(int parameterIndex, String x):向当前 SQL 语句中的指定位置绑定一个 String 值

添加数据

 /**
     * PreparedStatement使用的测试类
     */
    public class PreparedStatementTest {
        /**
         * 添加用户
         */
        public void insertUsers(String username,int userage){
            Connection connection = null;
            PreparedStatement ps = null;
            try{
                //获取数据库连接
                connection = JdbcUtils.getConnection();
                //定义Sql。?是PreparedStatement对象中的绑定参数的占位符。问号的位置是从1开始计数的
                String sql = "insert into users values(default,?,?)";
                //创建PreparedStatement对象
                ps = connection.prepareStatement(sql);
                //完成参数的绑定
                ps.setString(1,username);
                ps.setInt(2,userage);
                int i = ps.executeUpdate();
                System.out.println(i);
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JdbcUtils.closeResource(ps,connection);
            }
        }
    }

更新数据

/**
     * 根据用户ID修改用户姓名与年龄
     */
    public void updateUsersById(int userid,String username,int userage){
        Connection connection = null;
        PreparedStatement ps = null;
        try{
            //获取数据库连接对象
            connection = JdbcUtils.getConnection();
            //创建PreparedStatement对象
            ps = connection.prepareStatement("update users set username = ?,userage=? where userid = ?");
            //参数绑定
            ps.setString(1,username);
            ps.setInt(2,userage);
            ps.setInt(3,userid);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(ps,connection);
        }
    }

删除数据

  /**
     * 根据用户ID删除指定用户
     */
    public void deleteUsersById(int userid){
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            //获取数据库连接对象
            conn = JdbcUtils.getConnection();
            //创建PreparedStatement对象
            ps = conn.prepareStatement("delete from users where userid = ? ");
            //绑定参数
            ps.setInt(1,userid);
            int i = ps.executeUpdate();
            System.out.println(i);
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(ps,conn);
        }
    }

ResultSet

简介

ResultSet用来存放数据库查询操作获得结果集,通过对ResultSet的操作可以获取查询到的结果集数据

注意

ResultSet 对象中存放的并不是我们查询到的所有的结果集,它采用分块加载的方式来载入结果集数据

特点

ResultSet对象具有指向其当前数据行的指针,最初指针被置于第一行之前,next方法将指针移动到下一行, 因为该方法在ResultSet对象中没有下一行时返回false,所以可以在 while 循环中使用它来迭代结果集, 默认的ResultSet对象仅有一个向前移动的指针,因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行, ResultSet接口提供用于获取当前行检索列值的获取方法(getBoolean、getLong 等),可以使用列的索引位置或列的名称检索值,

方法

复制代码
getString(int index)、getString(String columnName):获得在数据库里是 varchar、char 等类型的数据对象。
getFloat(int index)、getFloat(String columnName):Float(int index)、getFloat(String columnName)
getDate(int index)、getDate(String columnName):获得在数据库里是 Date 类型的数据。
getBoolean(int index)、getBoolean(String columnName):获得在数据库里是 Boolean 类型的数据。
getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。 

查询所有

 /**
         * 查询所有用户
         */
        public void selectUsersAll(){
            Connection connection = null;
            PreparedStatement ps = null;
            ResultSet resultSet = null;
            try{
                //获取数据库连接
                connection = JdbcUtils.getConnection();
                //创建PreparedStatement对象
                ps = connection.prepareStatement("select * from users");
                //执行查询
                resultSet = ps.executeQuery();
                //操作ResultSet对象获取查询的结果集
                while(resultSet.next()){
                    //获取列中的数据
                    int userid = resultSet.getInt("userid");
                    String username = resultSet.getString("username");
                    int userage = resultSet.getInt("USERAGE");
                    System.out.println(userid+" "+username+" "+userage);


                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JdbcUtils.closeResource(resultSet,ps,connection);
            }
        }

模糊查询

 /**
     * 根据用户名称模糊查找用户信息
     */
    public List<Users> fuzzyQuery(String username){
        List<Users> list= new ArrayList<>();


        Connection conn =null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            //获取数据库连接
            conn = JdbcUtils.getConnection();
            //创建PreparedStatement对象
            ps = conn.prepareStatement("select * from users where username like ?");
            //参数绑定
            ps.setString(1,username);
            //执行sql语句
            rs = ps.executeQuery();
            while(rs.next()){
                Users user = new Users();
                user.setUserid(rs.getInt("userid"));
                user.setUsername(rs.getString("username"));
                user.setUserage(rs.getInt("userage"));
                list.add(user);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(rs,ps,conn);
        }
        return list;
    }


    public static void main(String[] args) {
        FuzzyQueryTest ft = new FuzzyQueryTest();
        List<Users> users = ft.fuzzyQuery("%d%");
        for(Users user1:users){
            System.out.println(user1.getUserid()+" "+user1.getUsername()+" "+user1.getUserage());
        }
    }

动态条件查询

    /**
     * 动态条件查询Users
     */
    public List<Users> queryUsers(Users users){
        List<Users> list= new ArrayList<>();


        Connection conn =null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            //获取数据库连接
            conn = JdbcUtils.getConnection();
            //拼接查询SQL语句
            String sql = this.generateSql(users);
            System.out.println(sql);
            //创建PreparedStatement对象
            ps = conn.prepareStatement(sql);


            //执行sql语句
            rs = ps.executeQuery();
            while(rs.next()){
                Users user = new Users();
                user.setUserid(rs.getInt("userid"));
                user.setUsername(rs.getString("username"));
                user.setUserage(rs.getInt("userage"));
                list.add(user);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JdbcUtils.closeResource(rs,ps,conn);
        }
        return list;
    }


    /**
     * 生成动态条件查询sql
     */
    private String generateSql(Users users){
        StringBuffer sb = new StringBuffer("select * from users where 1=1 ");


        if(users.getUserid() > 0){
            sb.append(" and userid = ").append(users.getUserid());
        }
        if(users.getUsername() !=null &&users.getUsername().length() > 0){
            sb.append(" and username = '").append(users.getUsername()).append("'");
        }
        if(users.getUserage() > 0){
            sb.append(" and userage = ").append(users.getUserage());
        }
        return sb.toString();
    }


    public static void main(String[] args) {
        DynamicConditionQueryTest dt = new DynamicConditionQueryTest();
        Users users = new Users();
        users.setUsername("Oldlu");
        users.setUserage(20);
        List<Users> list = dt.queryUsers(users);
        for(Users user1:list){
            System.out.println(user1.getUserid()+" "+user1.getUsername()+" "+user1.getUserage());
        }
    }
相关推荐
IT技术分享社区6 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
桀桀桀桀桀桀7 分钟前
数据库中的用户管理和权限管理
数据库·mysql
极客代码9 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农15 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
代码之光_198016 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi21 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
&岁月不待人&37 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove40 分钟前
G1垃圾回收器日志详解
java·开发语言
对许44 分钟前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化