JDBC操作

使用步骤

1.首先先导入驱动包,可以去官网下载,然后直接复制粘贴到你的项目里,再右键点击添加为库
在这里插入图片描述

在这里插入图片描述
2.加载驱动类,通过驱动管理器获取连接对象,代码如下:

 2. 加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
//        3. 通过驱动管理器获取连接对象   -- Java和数据库建立连接
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/student", "root", "123123");

这里的student为数据库名,root是数据库username,123123是数据库密码

3.创建sql语句

//增删改查
 String sql = "insert into score values(123,'456',12)";
 String sql = "update score set sno = 123 where sno=666";
 String sql = "delete from score where sno=123";
 String sql = "select * from student";

4.通过连接对象创建语句对象,用于执行SQL语句

Statement state = conn.createStatement();
ResultSet rs = state.executeQuery(sql);
//处理结果集对象 -->> 打印
 while(rs.next()){
                System.out.print(rs.getString(1)+"\t");
                System.out.print(rs.getString(2)+"\t");
                System.out.print(rs.getString(3)+"\t");
                System.out.print(rs.getDate(4)+"\t");
                System.out.println(rs.getString(5));
            }

5.关闭连接,释放资源

rs.close();
state.close();
conn.close();

完整代码:

import java.sql.*;

public class Demo1 {
    public static void main(String[] args) {
        try {
//        1. 导入驱动包
//        2. 加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
//        3. 通过驱动管理器获取连接对象   -- Java和数据库建立连接
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/student", "root", "123123");
//        4. 增删改查  --->>  创建sql语句
            String sql = "select * from student";
//        5. 通过连接对象创建语句对象  --->> 语句对象是用来执行sql语句
            Statement state = conn.createStatement();
//        6. 执行sql语句  executeQuery()   ResultSet  --  结果集对象
            ResultSet rs = state.executeQuery(sql);
//        7. 处理结果集对象 -->> 打印
            while(rs.next()){
                System.out.print(rs.getString(1)+"\t");
                System.out.print(rs.getString(2)+"\t");
                System.out.print(rs.getString(3)+"\t");
                System.out.print(rs.getDate(4)+"\t");
                System.out.println(rs.getString(5));
            }
//        8. 关闭连接,释放资源
            rs.close();
            state.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

在输入条件时可能会使传入的条件的sql字符串拼接后变成另外的sql语句这被称为SQL注入

为了解决这个问题所以使用预处理命令

Statement的问题在于:

  1. 有SQL注入的危险
  2. 拼接时不方便
  3. 效率不高

PreparedStatement:

  1. 能防止部分SQL注入
  2. 拼接的时候方便,不用管数据类型
  3. 在执行多条SQL语句的时候效率要高于Statement
//设置?(通配符)
            String sql = "select * from student where sno = ?";
            // 创建预编译语句对象
            PreparedStatement ps = conn.prepareStatement(sql);
            // 设置参数,这里的1代表第一个通配符
            ps.setString(1,sno);
            // 执行sql语句
            ResultSet rs = ps.executeQuery();
             while(rs.next()){
             //这里创建模型对象是为了存入集合中后续更好的处理信息
              Student stu = new Student();
                stu.setSno(rs.getString("sno"));
                stu.setSname(rs.getString("sname"));
                stu.setSsex(rs.getString("ssex"));
                stu.setSbirthday(rs.getDate("sbirthday"));
                stu.setSclass(rs.getString("class"));
                list.add(stu);
            }

代码优化:

package demo;

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

/**
 * @author peiqi
 * @Title:
 * @Package
 * @Description:
 * @date 2021/9/298:16
 */
public class BaseDao {
    public static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123123";
    public static final ArrayList<Student> list = new ArrayList<>();

    //首先驱动数据库
    static {
        try{
            Class.forName(DRIVER);
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    /**
     * 获取连接对象的方法
     * @return 返回连接对象
     */
    public Connection getCon(){
        Connection con = null;
        try {
            con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }


    /**
     * 关闭连接,释放资源
     * @param con 连接对象
     * @param state 语句对象
     * @param rs 结果集对象
     */
    public void close(Connection con, Statement state, ResultSet rs){

            try {
                if (rs!=null) {
                    rs.close();
                }
                if (state!=null) {
                    state.close();
                }
                if (con!=null) {
                    con.close();
                }
            } catch (SQLException sqlException) {
                sqlException.printStackTrace();
            }
        }

    /**
     * 没有参数的通用的增删改的方法
     * @param sql 要执行的sql语句
     * @return 受影响的行数
     */
        public int update(String sql){
            Connection conn = getCon();
            Statement state = null;
            int result = -1;
            try {
                state = conn.createStatement();
                result = state.executeUpdate(sql);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                close(conn,state,null);
            }
            return result;
        }

    /**
     * 带参数的通用的增删改方法
     * @param sql 要执行的sql语句
     * @param o 可变参数
     * @return 受影响的行数
     */
        public int update(String sql,Object ... o){
            Connection con = getCon();
            PreparedStatement ps = null;
            int result = -1;
            try{
                ps = con.prepareStatement(sql);
                for (int i = 0; i < o.length; i++) {
                    ps.setObject(i+1,o[i]);
                }
                result = ps.executeUpdate();
            }catch (SQLException e){
                e.printStackTrace();
            }finally {
                close(con,ps,null);
            }
            return result;
        }

    /**
     * 查询数据并存入集合中
     * @param sql
     * @return 集合
     */
    public void select(String sql){
            Connection con = getCon();
           PreparedStatement ps = null;
            ResultSet rs = null;
            try{
                ps = con.prepareStatement(
                        sql, ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT);
                rs = ps.executeQuery();
                while (rs.next()){
                    //建立学生对象
                    Student student = new Student();
                    //设置信息
                    student.setSno(rs.getString("sno"));
                    student.setSbirthday(rs.getDate("sbirthday"));
                    student.setSclass(rs.getString("class"));
                    student.setSname(rs.getString("sname"));
                    student.setSsex(rs.getString("ssex"));
                    //存如集合中
                    list.add(student);
                }
                //元数据操作
                ResultSetMetaData rsmd = rs.getMetaData();
                //输出列名和列的数据类型
                for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                    System.out.print(rsmd.getColumnName(i)+"\t"+"\t"+"\t");
                    if (i==rsmd.getColumnCount()){
                        System.out.println();
                    }
                }
                for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                    System.out.print(rsmd.getColumnTypeName(i)+"\t"+"\t"+"\t");
                    if (i==rsmd.getColumnCount()){
                        System.out.println();
                    }
                }
                //打印信息
                for (int i = 0; i < list.size(); i++) {
                    System.out.println(list.get(i).getSno()+"\t"+"\t"+"\t"
                            +list.get(i).getSname()+"\t"+"\t"+"\t"
                            +list.get(i).getSsex()+"\t"+"\t"+"\t"
                            +list.get(i).getSbirthday()+"\t"+"\t"+"\t"
                            +list.get(i).getSclass());
                }

            }catch (SQLException e){
                e.printStackTrace();
            }finally {
                close(con,ps,rs);
            }
        }

    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-irony-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值