JAVA第二阶段第九天 JAVA代码操作mysql数据库

一、jdbc(java database connectivty) 概述:

1.使用java来操作数据库
2.jdbc:提供了一些方法与接口(规范),实现是由数据库的厂商来实现 (驱动包)
3.驱动包:也就是连接数据提供的一个jar包

二、jdbc 连接数据库的一个步骤:

1.在项目里面导入jar包:mysql-connector-java-5.1.0-bin.jar
在这里插入图片描述
2.通过反射来加载驱动:Class.forName(“com.mysql.jdbc.Driver”)
3.得到连接对象:connection()
4.得到发送sql对象(交通工具):prepareStatement()
5.得到返回的结果:1.executeQuery()查询 2.executeUpdate()增删改
6.关闭资源(从下往上进行关闭):close()

注意点:所有的jar包都是导入的是:java.sql.*

package com.offcn.day09.test;

import java.sql.*;

public class Test {
    public static void main(String[] args) {
        //1.导入jar包
        //2.通过反射加载驱动
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;
        try {
            //通过反射加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/use_db?characterEncoding=utf-8","root","1616");
            //操作数据库对象
            sta = conn.createStatement();
            //编写sql语句
            String sql = "select * from user";
            //执行sql语句
            rs = sta.executeQuery(sql);
            //进行判断
            while(rs.next()){
                int uid = rs.getInt("uid");
                String uname = rs.getString("uname");
                String upwd = rs.getString("upwd");
                System.out.println(uid+"\t"+uname+"\t"+upwd);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关流
            try {
                if (rs != null){
                    rs.close();
                }
                if(sta != null){
                    sta.close();
                }
                if (conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

三、jdbc的详细解释:

1.Class.forName(“com.mysql.jdbc.Driver”):通过反射来加载驱动 Driver:驱动类
2.DriverManager:驱动管理对象来获取连接对象
getConnection(“url”,“username”,“password”):返回值就是Connection 对象
url:表示连接数据库的地址
jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf-8||jdbc:mysql:///day03_db:只支持本地连接
jdbc:表示主的协议,也就是使用jdbc来连接数据库
mysql:表示子协议,也就是使用mysql数据库
localhost:表示本机的ip地址
3306:表示mysql数据库的端口号,端口号后是数据库的库名
? 后面都是表示设置的参数
characterEncoding=utf-8:设置其编码格式
username:表示数据库的用户名
password:表示数据库 密码

3.conn.createStatement():表示通过连接对象来获取执行sql的对象Statement(交通工具)

4.sta.executeQuery(sql):发送sql语句,数据库返回一个结果集 ResultSet

5.关闭资源(从下往上关闭):close()

6.jdbc连接数据库使用的类:
1.Driver
2.DriverManager
3.Connection
4.Statement
5.ResultSet

常用的方法:
1.getConnection()
2.createStatement()
3.executeQuery(sql)
4.colse()
5.prepareStatement() 获取到对象:PrepareStatement
6.ps.setString(1,“li”),?表示占位符,给占位符来进行赋值,第一个参数是索引(从1开始),第二个参数是具体设置的值
7.executeUpdate(sql) 执行增删改的方法,返回是int类型,是影响的行数
8.executeQuery(sql) 执行的是查询的方法,返回的是对象,需要遍历

常见的错误:
1.nknown database ‘us’:数据库不存在
2.Access denied for user ‘root’@‘localhost’ (using password: YES):用户名与密码不正确
3.You have an error in your SQL syntax :sql 异常

四、Statement产生的问题:

sql语法注入,不安全,每次都是直接拼

五、使用 PreparedStatement 对象:

1.是 Statement 对象的一个子类
2.可以防止sql注入,保证sql语句的安全
3.预编译检验sql是否正确,效率高,替换Statement
4.避免sql语句的拼写

package com.offcn.day09.test;

import org.junit.Test;

import java.sql.*;

public class Test3 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        //通过反射加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库对象
            conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","1616");
            //编写sql语句
            String sql = "select * from user where uname = ? and upwd = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,"张三");
            ps.setString(2,"222");
            rs = ps.executeQuery();
            while (rs.next()){
                System.out.println(rs.getInt("uid"));
                System.out.println(rs.getString("uname"));
                System.out.println(rs.getString("upwd"));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs != null){
                    rs.close();
                }
                if (ps != null){
                    ps.close();
                }
                if (conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

六、junit测试,主要是用于测试,使用的步骤:

1.导包、添加依赖(如图1)
2.编写一个测试方法(不是main方法)

注意点:
1.需要使用public void
2.这个方法没有返回值
3.这个方法没有参数
4.在方法上加注解:@Test
5.直接运行,绿色表示没有错误,红色表示产生了错误

	@Test
    public void insertUser(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","1616");
            String sql = "insert into user(uname,upwd)values (?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1,"liupian");
            ps.setString(2,"121212");
            int num = ps.executeUpdate();
            if(num > 0){
                System.out.println("添加成功!");
            }else {
                System.out.println("添加失败!");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

七、jdbcUtils工具类的封装:

1.加载驱动(只需要加载一次,写在静态代码块)
2.获取连接对象写成一个方法 (三个参数写成常量)
3.增删改
4.查询
5.关闭资源

package com.offcn.day09.test;

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

public class JDBCUtils {
    private final static String driver = "com.mysql.jdbc.Driver";
    private final static String url = "jdbc:mysql:///use_db";
    private final static String user ="root";
    private final static String password ="1616";
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取连接对象
    public static Connection getConnertion(){
        try {
            return DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //查询
    public static List<User> selectAll(String sql, Object[] objects){
        //实例化一个集合
        List<User> list = new ArrayList<User>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取连接对象
            conn = getConnertion();
            //获取执行sql语句对象
            ps = conn.prepareStatement(sql);
            //遍历填充占位符
            if(objects != null && objects.length > 0){
                for (int i = 0;i < objects.length;i++){
                    ps.setObject(i+1,objects[i]);
                }
            }
            //发送指令
            rs = ps.executeQuery();
            //进行迭代
            while(rs.next()){
                User user = new User();
                user.setUid(rs.getInt("uid"));
                user.setUname(rs.getString("uname"));
                user.setUpwd(rs.getString("upwd"));
                list.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(rs,ps,conn);
        }
        return list;
    }

    //增加 修改 删除
    public static int updateuser(String sql,Object[] objects) {
        int num = -1;
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            conn = getConnertion();
            ps = conn.prepareStatement(sql);
            if (objects != null && objects.length > 0) {
                for (int i = 0; i < objects.length; i++) {
                    ps.setObject(i + 1, objects[i]);
                }
            }
            num = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(null,ps,conn);
        }
        return num;
    }

    //关闭资源
    public static void close(ResultSet rs,PreparedStatement ps,Connection conn){
        try {
            if (rs != null){
                rs.close();
            }
            if (conn != null){
                conn.close();
            }
            if (ps != null){
                ps.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
package com.offcn.day09.test;

import java.io.Serializable;

public class User implements Serializable {
    private int uid;
    private String uname;
    private String upwd;

    public int getUid() {
        return uid;
    }

    public String getUname() {
        return uname;
    }

    public String getUpwd() {
        return upwd;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }
}
package com.offcn.day09.test;

import java.util.List;

public class Test4 {
    public static void main(String[] args) {
        //添加
        /*String sql = "insert into user(uname,upwd)values(?,?)";
        Object[] objects = {"haha","1616"};
        int num = JDBCUtils.updateuser(sql,objects);
        System.out.println(num > 0 ? "添加成功" : "添加失败");*/

        //删除
        /*String sql = "delete from user where uid = ?";
        Object[] objects = {8};
        int num = JDBCUtils.updateuser(sql,objects);
        System.out.println(num > 0 ? "删除成功" : "删除失败");*/

        //修改
       /* String sql = "update user set uname =?, upwd =? where uid =?";
        Object[] objects = {"刘翩","1616",5};
        int num = JDBCUtils.updateuser(sql,objects);
        System.out.println(num > 0 ? "修改成功" : "修改失败");*/

       //查询
       /* String sql = "select * from user limit ?,?";
        Object[] objects = {0,3};
        List<User> list = JDBCUtils.selectAll(sql,objects);
        for (User u : list) {
            System.out.println(u.getUid()+"\t"+u.getUname()+"\t"+u.getUpwd());
        }*/

        String sql = "select * from user where uname like ?";
        Object[] objects = {"%刘%"};
        List<User> list = JDBCUtils.selectAll(sql,objects);
        for (User u : list) {
            System.out.println(u.getUid()+"\t"+u.getUname()+"\t"+u.getUpwd());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值