JDBC基础

# #JDBC

        概念:Java DateBase Connectivity Java 数据库链接,Java语言操作数据库

        *JDBC本质:其实是官方(sun)公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商区实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

        2.快速入门:

         *步骤:

                1.导入驱动jar包

                        1.复制jar包到项目的目录下

                        2.右键 --> add  as  Library

                2.注册驱动

                3.获取数据库链接对象  Connection 

                4.定义sql

                5.获取执行sql语句

                6.执行sql,接受返回结果

                7.处理结果

                8.释放资源

        代码实现:

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1.导入驱动jar包
        // 2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 3.获取数据库链接对象
        Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/db2","root","root");
        // 4.定义sql语句
        String sql = "update account set balance = 500 where id =1";
        // 5.获取执行sql的对象,Statement
        Statement stmt = conn.createStatement();
        // 6.指向sql
        int count = stmt.executeUpdate(sql);
        // 7.处理结果
        System.out.println(count);
        // 8 .释放资源
        stmt.close();
        conn.close();
    }

        3.详解各个对象:

                1.DriverManager:驱动管理对象

                *功能:

                        1.注册驱动:告诉程序该使用哪一个数据库驱动jar

                         static void registerDriver(Driver driver):注册与给定的驱动程序DriverManger

                                写代码使用:Class.forName("com.mysql.Driver");

                                *注意:mysql之后的驱动jar包可以省略注册驱动的步骤

                  2.获取数据库链接

                  *方法:static Connection getConnection(String url,String user,String password)

                  *参数:

                     *url:指定链接的路径

                        *语法:jdbc:mysql://ip地址(域名):端口号/数据库名称

                        *列子:jdbc:mysql://localhost: 3360/db3

                        *细节:如果链接的是本机mysql服务器,并且mysql服务默认为端口是3360,则URL可以简写为:jdbc:mysql://数据库名称

                *user: 用户名

                *password : 密码

                2.Connection :数据库链接对象 

                        1.功能:

                                1.获取执行sql的对象

                                *Statement  createStatement()

                                *PreparedStatement  preparStatement (String sql)

                                2.管理事务:

                                *开启事务:setAutoCommit (boolean autoCommit):调用该方法设置参数                                                        为false,即开启事务

                                *提交事务: commit()

                                * 回滚事务: rollback()

                3.Statement : 执行sql的对象

                        1.执行sql

                                1.boolean execute(String sql): 可以执行任意的sql了解

                                2.int executeUpdate(String sql) : 执行DML(insert、update、delete)语                                                                                          句、DDL(create、alter、drop)语句

                               *返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成                                                       功,返回值>0,则执行成功,反之则失败

                                3.ResultSet executeQuery(String sql) : 执行DQL(select)语句

public static void main(String[] args) {
        Statement stmt = null;
        Connection conn = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql = "create table student (id int,name varchar (20))";
            //3.获取Connection 对象
            conn = (Connection) DriverManager.getConnection("jdbc:mysql:///db2","root","root");
            //4.获取执行sql的对象 , Statement
            stmt = (Statement) conn.createStatement();
            //5.执行sql
            int count =stmt.executeUpdate(sql);
            //6.处理结果
            System.out.println(count);
            if(count>0){
                System.out.println("修改成功");
            }else{
                System.out.println("修改失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            //7.释放资源
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            //避免空指针异常
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

           4.ResultSet:结果集对象,封装查询结果

                * next() :游标向下移动一行

                * get Xxx(参数):获取数据

                        *Xxx:代表数据类型  如: int getInt(), String getString()

                        *参数:

                                1.int :代表列的编号,从1开始  如:getString(1)

                                2.String : 代表列的名称。 如:getDouble("balance")

                *注意:

                     *使用步骤:
                        1.游标向下移动一行

                        2.判断是否有数据

                        3.获取数据

//循环判断游标是否是最后一行末尾
            while (rs.next()){
                //6.1 让游标向下移动一行
                rs.next();
                //6.2 获取数据
                int id = rs.getInt(1);
                String name = rs.getString("name");
                double balance = rs.getDouble(3);

                System.out.println(id + "---" + name + "---"+ balance);
            }

                             *练习:

                                *定义一个方法,查询student表的数据将其封装为对象,然后装载返回 

    public static void main(String[] args) {
       List<Student> list = new JDBCPractice().findAll();
        System.out.println(list);
    }


    public List<Student> findAll(){
        Connection coon = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Student> list = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.定义sql
            String sql = "select * from student";
            //3.获取Connection对象
            coon = (Connection) DriverManager.getConnection("jdbc:mysql:///bd33","root","root");
            //4.获取执行sql对象
            stmt = coon.createStatement();
            //5.执行sql
            rs = stmt.executeQuery(sql);
            //6.遍历结果接,封装对象,装在集合
            Student stu;
            list = new ArrayList<Student>();
            while(rs.next()){
                //获取数据
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                String sex = rs.getString("sex");
                String address = rs.getString("address");
                double math = rs.getDouble("math");
                double english = rs.getDouble("english");


                //创建stu对象
                stu = new Student();
                stu.setId(id);
                stu.setName(name);
                stu.setAge(age);
                stu.setSex(sex);
                stu.setAddress(address);
                stu.setMath(math);
                stu.setEnglish(english);

                list.add(stu);

            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(coon !=null){
                try {
                    coon.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stmt !=null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(rs !=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        return list;
    }

 Student类

public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;
    private double math;
    private double english;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", math=" + math +
                ", english=" + english +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public double getMath() {
        return math;
    }

    public void setMath(double math) {
        this.math = math;
    }

    public double getEnglish() {
        return english;
    }

    public void setEnglish(double english) {
        this.english = english;
    }

    public Student(int id, String name, int age, String sex, String address, double math, double english) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
        this.math = math;
        this.english = english;
    }

    public Student() {
    }

                5.PreparedStatement:执行sql的对象

        1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全问题

        2.解决sql注入问题:使用PreparedStatement对象解决

        3.预编译的SQL:参数使用?作为占位符

        4.步骤:

                1.导入驱动jar包

                        1.复制jar包到项目的目录下

                        2.右键 --> add  as  Library

                2.注册驱动

                3.获取数据库链接对象  Connection 

                4.定义sql

                        *注意:sql的参数使用?作为占位符。

                5.获取执行sql语句

                6.给?赋值:

                        方法:setXxx(参数1,参数2)

                                参数1:?位置编号从1开始

                                参数2: ?的值

                6.执行sql,接受返回结果

                7.处理结果

                8.释放资源

        

## 抽取JDBC工具类:JDBCUtils

        *目的: 简化书写

        *分析:

                1.注册驱动也抽取

                2.抽取一个方法获取链接对象

                        *需求:不想传递参数(麻烦),还得保证工具类的通用性

                        *解决:配置文件

                                JDBC.properties

                                        url=         user=         password=   

                3.抽取一个方法释放资源

## JDBC控制事务:

        1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

        2.操作:

                1.开启事务

                2.提交事务

                3.回滚事务

        3.使用Connection 对象来管理事务

                  *开启事务:setAutoCommit (boolean autoCommit):调用该方法设置参数                                                        为false,即开启事务

                        *在执行sql之前开启事务

                  *提交事务: commit()

                        *当所有sql都执行完任务提交事务

                   * 回滚事务: rollback()

                        *在catch中回滚事务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值