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 @   芊嵛  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
イエスタデイ(翻自 Official髭男dism) - 茶泡饭,春茶,kobasolo
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 藤原聡

作曲 : 藤原聡

何度失ったって

取り返して見せるよ

雨上がり 虹がかかった空みたいな

君の笑みを

例えばその代償に

誰かの表情を

曇らせてしまったっていい

悪者は僕だけでいい

本当はいつでも

誰もと思いやりあっていたい

でもそんな悠長な理想論は

ここで捨てなくちゃな

遥か先で 君へ 狙いを定めた恐怖を

遥か先で 君へ 狙いを定めた恐怖を

どれだけ僕は

はらい切れるんだろう?

半信半疑で 世間体

半信半疑で 世間体

気にしてばっかのイエスタデイ

ポケットの中で怯えたこの手は

まだ忘れられないまま

「何度傷ついたって

「何度傷ついたって

仕方ないよ」と言って

うつむいて君が溢した

儚くなまぬるい涙

ただの一粒だって

僕を不甲斐なさで 溺れさせて

理性を奪うには十分過ぎた

街のクラクションもサイレンも

街のクラクションもサイレンも

届きやしないほど

遥か先へ進め 身勝手すぎる恋だと

遥か先へ進め 身勝手すぎる恋だと

世界が後ろから指差しても

振り向かず進め必死で

振り向かず進め必死で

君の元へ急ぐよ

道の途中で聞こえたSOS さえ

気づかないふりで

バイバイイエスタデイ ごめんね

バイバイイエスタデイ ごめんね

名残惜しいけど行くよ

いつかの憧れと違う僕でも

ただ1人だけ 君だけ

守るための強さを

何よりも望んでいた この手に今

遥か先へ進め

遥か先へ進め

幼すぎる恋だと

世界が後ろから指差しても

迷わずに進め 進め

2人だけの宇宙へと

ポケットの中で震えたこの手で今

君を連れ出して

未来の僕は知らない

だから視線は止まらない

謎めいた表現技法

意味深な君の気性

アイラブユーさえ

アイラブユーさえ

風に 飛ばされそうな時でも

不器用ながら繋いだ この手はもう

決して離さずに

虹の先へ

点击右上角即可分享
微信分享提示