首页 > 数据库 >JDBC连接数据库

JDBC连接数据库

时间:2023-12-08 20:55:41浏览次数:44  
标签:username JDBC String throwables 数据库 user sql 连接 pstm

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=UTC";

一、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=UTC";

    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;
    }
}

标签:username,JDBC,String,throwables,数据库,user,sql,连接,pstm
From: https://www.cnblogs.com/qy-blog/p/17889012.html

相关文章

  • 使用django连接MySQL
    使用python311+pycharm社区版+MySQL80,使用django连接MySQL1.下载1.1.官网下载pythonhttps://www.python.org/downloads/如我的python3.11.4,可以进入如下的页面进行hash校验https://www.python.org/downloads/release/python-3114/1.2.官网下载pycharmhttps://www.......
  • 通过C语言连接MySQL数据库
    一、如何连接MySQL首先需要安装MySQLsudoapt-getupdatesudoapt-getinstallmysql-serverC语言的API代码是与MySQL一起提供的,它包含在mysqlclient库中,并允许C程序访问数据库,如果安装MySQL后仍提示缺少库,则需要安装如下:sudoapt-getinstalllibmysqlclient-devsudoa......
  • Linux虚拟机配置网络之Xshell远程连接
     ......
  • Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案
    生产环境中热key处理热key问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的key就是热key,往往这样的key也是存储在了一个redis节点中,对该节点压力很大那么对于热key的处理就是通过热key探测系统对热key进行计数,一旦发现了热key,就将热key......
  • mobaxterm连接sftp超时,ssh连接正常
    使用mobaxterm远程进入了服务器,传文件的时候发现sftp无法进入排查过程:防火墙及堡垒机并未做相应限制,端口正常locatesftp-server路径和sshd_config一致本机命令行连接本地sftp服务正常系统message和secure日志在mobaxterm建立sftp连接时并无报错关闭防火墙和selinux后还是不......
  • 【SQLServer2019备份恢复】查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置
    在SQLServer2019AlwaysOn节点备份策略失败:备份数据库(完整)(8502-HIS-SQLAG\HISAG)备份数据库所在的位置:本地服务器连接兼容性级别为70(SQLServer7.0版)的数据库将被跳过。数据库:所有用户数据库类型:完整追加现有任务开始:2023-12-08T14:10:07。任务结束:20......
  • C#连接RocketMQ发送消息
    publicstaticvoidCreateMessage(stringcontent,stringserverHost,stringstrTopic,stringstrkey,stringstrTag){try{//mq对象using(varmq=newProducer(){......
  • JetBrains DataGrip 2023.3 (macOS, Linux, Windows) - 数据库和 SQL 跨平台 IDE
    JetBrainsDataGrip2023.3(macOS,Linux,Windows)-数据库和SQL跨平台IDE请访问原文链接:https://sysin.org/blog/jb-datagrip-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsDataGrip-多种数据库,一个工具为什么选择DataGrip轻松处理数据......
  • MySQL数据库-1
    MySQL数据库-11.为什么要使用数据库持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以"固化”,而持久化的实现过程大多通过各种关系数据库来完成。持久化的主要作用是将内存中......
  • Druid数据源连接池
    配置缺省值说明name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-"+System.identityHashCode(this).另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。详情-点此处......