mysql数据库第三天

帅比萌擦擦* 提交于 2019-12-17 03:43:38

##jdbc

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

    2.jdbc 连接数据库的一个步骤 1.导入jar包
    2.通过反射来加载驱动
    3.得到连接对象 connection
    4.得到发送sql 对象(交通工具)
    5.得到返回的结果
    6.关闭资源 从下往上进行关闭
    注意点:所有的jar包都是导入的是 java.sql.*

package com.offcn.day09.test;

import java.sql.*;

public class Test {
    public static void main(String[] args) {
        //System.out.println("第一个java项目");
      /*  2.jdbc 连接数据库的一个步骤 1.导入jar包
        2.通过反射来加载驱动

        3.得到连接对象  connection
        4.得到发送sql 对象(交通工具)
        5.得到返回的结果
        6.关闭资源  从下往上进行关闭*/
        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", "root");
            sta = conn.createStatement();
            String sql = "select * from user";
            rs = sta.executeQuery(sql);
            while (rs.next()) {
                int uid = rs.getInt("uid");
                String uname = rs.getString("uname");
                System.out.println(uid + "\t" + uname);
            }
        } 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数据库的端口号,端口号后是数据库的库ming
    ? 后 都是表示设置的参数 characterEncoding=utf-8>设置其编码格式username:表示数据库的用户名
    password 表示数据库 密码
    3.conn.createStatement(); ==>表示通过连接对象来获取执行sql 的对象Statement(交通工具)
    4.sta.executeQuery(sql) 发送sql语句,数据库返回一个结果集 ResultSet

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

6.jdbc连接数据库使用的类:1.Driver 2.DriverManager ( 3.Connection 4.Statement 5.ResultSet)
2.getConnection(); createStatement() executeQuery(sql) colse()
3.prepareStatement() 获取到 PrepareStatement
4. ps.setString(1,“li”); ? 表示占位符 给站位符来进行赋值 第一参数是索引 索引是从1开始 第二个参数是具体设置的值
5. executeUpdate(sql) 执行增删改的方法 返回是int类型 是影响的行数
常见的错误:nknown database ‘us’ 数据库不存在
Access denied for user ‘root’@‘localhost’ (using password: YES) 用户名与密码不正确

package com.offcn.day09.test;

import java.sql.*;
import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        //登录功能
        Scanner input = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String uname = input.next();
        System.out.println("请输入密码:");
        String pwd = input.next();
        //与数据库的进行对比  ==》根据用户名与密码进行对比
        Connection conn = null;
        Statement sta = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///use_db", "root", "root");
            //得到执行sql 的对象
            sta = conn.createStatement();
            //正常的sql   String sql="select * from user  where uname='admin' and  upwd='123456'";

           // String sql = "select * from user  where uname='" + uname + "' and  upwd='" + pwd + "'";
            String sql ="select * from  user  where uname='"+uname+"'" +" or 1=1";
          //  String sql ="select * from  user  where uname=?";

            //执行sql
            rs = sta.executeQuery(sql);
            if (rs.next()) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }
        } 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();
            }

        }

    }
}

You have an error in your SQL syntax ==>sql 异常
4. Statement 产生的问题:1.sql注入,不安全,每次直接拼
PreparedStatement 1.他是 Statement 对象的一个子类
2.可以防止sql注入,保证sql语句的安全
3.预编译检验sql是否正确 ==>效率高 ==>替换Statement
4.避免sql语句的拼写

使用 PreparedStatement 对象


import org.junit.Test;

import java.sql.*;

public class Test3 {
    public static void main(String[] args) {
        //通过反射来加载驱动
        Connection conn= null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
            //得到执行sql 对象
            String sql ="select * from user where uname=? and  upwd =?";
            PreparedStatement ps = conn.prepareStatement(sql);
            //填坑
            ps.setString(1,"lisi");
            ps.setString(2,"123");
            ResultSet 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();
        }


    }
    @Test
    public   void  insertUser(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection  conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
            String sql ="insert into user(uname,upwd)values(?,?)";
            PreparedStatement ps =   conn.prepareStatement(sql);
            //给占位符来填充值
            ps.setString(1,"admin");
            ps.setString(2,"123456");

            //发送
            int num =   ps.executeUpdate();
            if(num>0){
                System.out.println("增加成功");
            }else{
                System.out.println("增加失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }


    }

    @Test
    public    void     updateUser(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection  conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
            String sql ="update user  set  uname =?,upwd=? where uid=?";
            PreparedStatement ps =   conn.prepareStatement(sql);
            //给占位符来填充值
            ps.setString(1,"wangwu");
           // ps.setObject();
            ps.setString(2,"111111");
            ps.setInt(3,2);

            //发送
            int num =   ps.executeUpdate();
            if(num>0){
                System.out.println("修改成功");
            }else{
                System.out.println("修改失败");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    //删除
      @Test
     public void  deleteById(){
         try {
             Class.forName("com.mysql.jdbc.Driver");
             Connection  conn = DriverManager.getConnection("jdbc:mysql:///use_db","root","root");
             String sql ="delete  from  user  where uid=?";
             PreparedStatement ps =   conn.prepareStatement(sql);
             //给占位符来填充值
             ps.setInt(1,2);
          /*   ps.setString(2,"111111");
             ps.setInt(3,2);*/

             //发送
             int num =   ps.executeUpdate();
             if(num>0){
                 System.out.println("删除成功");
             }else{
                 System.out.println("删除失败");
             }
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         } catch (SQLException e) {
             e.printStackTrace();
         }
     }
}

在这里插入代码片

6junit 测试 主要是用于测试 使用的步骤 1.导包 添加依赖
2.编写一个测试方法(不是main) 注意点:1.需要使用 public void 2.这个方法没有返回值 3.这个方法没有参数
3.在方法加注解 @Test
4.直接运行 绿色表示没有错误 红色表示产生了错误

jdbcUtils工具类的封装:

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

package com.offcn.day09.test;

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

public class JDBCUtils {
 /*    1.导入jar包
                                2.通过反射来加载驱动
                                3.得到连接对象  connection
                                4.得到发送sql 对象(交通工具)
            5.得到返回的结果
                                6.关闭资源  从下往上进行关闭
*/
 // 2.通过反射来加载驱动

    //定义四个常量
    private  final  static  String driver ="";
    private  final  static  String url ="";
    private  final  static  String username ="";
    private  final  static  String password ="";

    static{
     try {
         Class.forName(driver);
     } catch (ClassNotFoundException e) {
         e.printStackTrace();
     }
 }

   // 得到连接对象  connection 增删改 等方式都需要使用  ,所有需要封装成一个方法 返回值就是connection

     public    static Connection  getConnection(){
         Connection con = null;
         try {
             con = DriverManager.getConnection(url,username,password);
         } catch (SQLException e) {
             e.printStackTrace();
         }
         return con;
     }

     //增删改  返回值都是影响的行数  int  发送指令都是调用同一个方法
      // sql 语句不通(传参数)   站位符的个数不同(值的个数确定占位符的个数),类型也不能确定(Object)
    /*   public  static   int  updateUser(String sql,Object[]objects){

           Connection con = null;
           //获取到连接对象
            con =    getConnection();
            //通过连接对象,获取到执行sql的对象
            PreparedStatement ps = con.prepareStatement(sql);
            if(objects !=null && objects.length>0){
                for (int i=0;i<objects.length;i++){
                    ps.setObject(i+1,objects[i]);
                }
            }

            //发送sql
           int num=  ps.executeUpdate();

            return  num;

            //关闭资源

       }
*/

    //

    public  static List<User> selectAll(String sql, Object[]objects){
        List<User>  list  = new ArrayList<>();
        Connection con = null;
        //获取到连接对象
        con =    getConnection();
        //通过连接对象,获取到执行sql的对象
        PreparedStatement ps = con.prepareStatement(sql);
        if(objects !=null && objects.length>0){
            for (int i=0;i<objects.length;i++){
                ps.setObject(i+1,objects[i]);
            }
        }

     // 发送指令
       ResultSet 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);
        }

        return  list;
        //

    }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!