JDBC连接数据库

JDBC连接数据库

共六步

1.Class.forName()加载数据库连接驱动
2.DriverManager.getConnection()获取数据连接对象
3.根据SQL获取sq|会话对象
4.执行SQL,执行SQL前如果有参数值就设置参数值setXXX()
5.处理结果集
6.释放资源

0.前期工作

0.0文件jar包下载,配置,删除

目前常用的驱动版本就是5或者8(根据自己的数据库版本判断)-5和8的数据库驱动下载地址

1.建一个lib文件夹与src同级,把对应的jar包放进从(CV就行)

image

2.右击jar包->Add as Library

image

3.Name可以自己改,正常默认ok就行

image

4.出现下面这样就添加成功了

image

5.删除的方法

File->Project Structure->Libraries,然后在中间找到要删除的,点击减号就行,记得别忘了Apply->OK(我喜欢两步个人习惯,直接点OK也行)

image

下面这4步可以不写,写他的好处是为了方便修改

0.1、声明驱动

//5版本
private static String driver = "com.mysql.jdbc.Driver";
//8版本
private static String driver = "com.mysql.cj.jdbc.Driver";

他们的区别就是8版本比5版本多了一层.cj,这里只是看看,实际用的时候不要解压

image

image

0.2、声明用户名

正常情况下是root,如果修改了话根据你的实际情况而定

private static String username = "root";

0.3、声明密码

根据自身情况而定

private static String password = "123456";

0.4、数据库完整地址

127.0.0.1localhost(无网)或者本地IP(有网)
jdbc:mysql://localhost:3306不写后面的数据库名也不会报错多用于测试

useSSL:不建议在没有服务器身份验证的情况下建立SSL连接。如果不设置显式选项,则必须建立默认的SSL连接。需要通过设置useSSL=false来显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储。所以建议设置useSSL为false,有时遇到的问题可以这样来考虑

characterEncoding:设置字符集

timeZone:设置时区,这个如果设置错了,在处理时间问题时候显示的时间会跟自己想象的不太一样
举个例子:日本时间比中国早一个小时

private static String url = "jdbc:mysql://localhost:3306/数据库名字?useSSL=false&characterEncoding=utf8&timeZone=Asia/Shanghai";

一、Class.forName()加载数据库连接驱动

会让处理异常,这里直接try{}catch{}

Class.forName(driver);

二、DriverManager.getConnection()获取数据连接对象

DriverManager.getConnection(url, username, password);

三、根据SQL获取sq|会话对象

有2种方式StatementPreparedStatement 建议用PreparedStatement,用Statement连接的话容易被sql注入

private PreparedStatement pstm;
//?是要传入的数据,有几个写几个
String sql = "SELECT * FROM user WHERE id = ?;";
pstm = conn.prepareStatement(sql);

四、执行SQL,执行SQL前如果有参数值就设置参数值setXXX()

//查询用这个
private ResultSet rs= null;
//如上面第三步需要一个int类型的数据id
pstm.setInt(1,id);
rs = pstm.executeQuery();
//其他的增删改,不需要返回结果集,他们返回一个整数,代表改变了几条数据
n = pstm.executeUpdate();

五、处理结果集

//在查询的时候使用处理结果
//找下一个,通常写在while中
rs.next()
//获取
rs.getString()

六、释放资源

//这里我封装起来了省的来回写一大堆
//正着写,倒着关
//查询关三个
ResultSet.close;
PreparedStatement.close;
Connection.close;
//其他关两个
PreparedStatement.close;
Connection.close;

七、案例

案例一二六

整个可以直接全部复制,改改参数就行

import java.sql.*;

/**
 * @Auther QY
 * @Date 2023/11/16
 */
public class DBTools {
    //(1)声明驱动
    //我这里用的是8版本的
    private static String driver = "com.mysql.cj.jdbc.Driver";
    //(2)声明用户名
    private static String username = "root";
    //(3)声明密码
    private static String password = "qy666";
    //(4)数据库的完整地址
    private static String url = "jdbc:mysql://localhost:3306/数据库名字?useSSL=false&characterEncoding=utf8&timeZone=Asia/Shanghai";

    public static Connection ConnDB() {
        Connection connection = null;
        try {
            //一、Class.forName()加载数据库连接驱动
            Class.forName(driver);
            //二、DriverManager.getConnection()获取数据连接对象
            connection = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }

    //六、释放资源
    public static void closeDB(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
        //(1)关闭连接对象
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //(2)关闭数据操作对象
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //(3)关闭结果集对象
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

案例三四五

这里可以看看大概结构,部分代码可以复制

public class UserDaoImpl implements UserDao {
    //声明数据库连接对象
    private Connection conn = DruidTools.getConn();
    //声明数据库操作对象
    private PreparedStatement pstm;
    //声明结果集对象
    private ResultSet rs= null;

    /**
     * 通过id号查一个用户
     * @param id
     * @return
     */
    @Override
    public User selectUserById(int id) {
        //声明User
        User user = null;
        //写sql
        String sql = "SELECT * FROM user WHERE id = ?;";
        try {
            pstm = conn.prepareStatement(sql);
            //设置参数的值
            pstm.setInt(1,id);
            rs = pstm.executeQuery();
            if (rs.next()){
                user = new User();
                String username = rs.getString("username");
                String password = rs.getString("password");
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        //查不到返回null
        return user;
    }

    /**
     * 查询所有对象
     * @return
     */
    @Override
    public List<User> selectUsers() {
        List<User> users = new ArrayList<>();
        //写sql语句
        String sql = "select * FRom user;" ;
        User user;
        try {
            pstm = conn.prepareStatement(sql);
            rs = pstm.executeQuery();
            while (rs.next()){
                //跟实体类对应
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String password = rs.getString("password");
                user = new User();
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return users;
    }

    /**
     * 添加用户
     * @param user
     * @return
     */
    @Override
    public int insertUser(User user) {
        //声明变量
        int n = 0;
        String sql = "INSERT INTO user(username,password,realname,gender,address,email,regdate) " +
                "VALUES(?,?,?,?,?,?,?);";
        try {
            pstm = conn.prepareStatement(sql);
            pstm.setString(1,user.getUsername());
            pstm.setString(2,user.getPassword());
            pstm.setString(3,user.getRealname());
            pstm.setString(4,user.getGender());
            pstm.setString(5,user.getAddress());
            pstm.setString(6,user.getEmail());
            pstm.setTimestamp(7,user.getRegdate());
            //执行添加
            n = pstm.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return n;
    }

    @Override
    public Integer selectUserByUsername(String username) {
        //声明对象
        Integer temp = null;
        //写sql
        String sql = "SELECT id FROM user WHERE username = ?;";
        //创建对象
        try {
            pstm = conn.prepareStatement(sql);
            pstm.setString(1,username);
            rs = pstm.executeQuery();
            if (rs.next()){
                temp = rs.getInt("id");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return temp;
    }

    /**
     * 修改密码
     * @param username
     * @param newPassword
     * @return
     */
    @Override
    public int updateUser(String username, String newPassword) {
        int n = 0;
        String sql = "UPDATE user SET password = ? WHERE username = ?;";
        try {
            pstm = conn.prepareStatement(sql);
            pstm.setString(2,username);
            pstm.setString(1,newPassword);
            //执行修改
            n = pstm.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return n;
    }

    @Override
    public int deleteUser(String username) {
        int n = 0;
        String sql = "DELETE FROM user WHERE username = ?;";
        try {
            pstm = conn.prepareStatement(sql);
            pstm.setString(1,username);
            //执行修改
            n = pstm.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return n;
    }
}

posted @ 2023-12-08 20:53  芊嵛  阅读(85)  评论(0编辑  收藏  举报