JDBC--day01

JDBC–day01

什么是jdbc?
在java技术中,访问数据库的技术就叫做jdbc
jdbc(java database connectivity,java数据库链接技术),是一组用来执行sql语句的javaAPI。
可以为多种关系型数据库提供统一的访问方式。
是由一组用java语言编写的类和接口组成的。

jdbc的特点
实现了数据库链接的标准化和对象话,使用起来方便。
支持不同的关系型数据库。

jdbc:sun公司提供的一套操作数据库的标准规范(接口)— jdbcAPI
数据库厂商或者第三方中间商根据该接口规范提供针对不同的数据库的具体实现---- jdbc 驱动。
jdbc和数据库驱动的关系:接口和实现类的关系。

jdbc规范

jdbc规范在哪里?
在jdk中的 java.sql.* 包中。
数据库厂商提供的驱动:jar包在:mysql-connection-java.jar

4个核心对象

DriverManager:用于注册驱动
Connection:表示和数据库的链接对象
Statement:操作数据库sql语句的对象
ResultSet:结果集对象

使用jdbc操作数据库的步骤

注册驱动
建立链接
创建发送sql语句的对象
执行对应的数据库操作
处理结果
关闭资源

开发一个jdbc程序
需求:查询数据库中的数据显示到控制台上。
准备好库,表,以及数据
创建java项目,添加数据库驱动jar包
右键–add as library
按照操作步骤操作即可。

/**
 * 查询数据库中的数据显示到控制台上
 */
public class JdbcDemo1 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //注册驱动 不建议这样写,导致驱动被注册两次,不利于后期维护
        //DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        //使用反射的机制
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建立连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC", "root", "1234");
        //创建发送sql语句的对象
        Statement stmt = conn.createStatement();
        //执行对应的操作
        String sql="select * from dept";
        //查询 stmt.executeQuery(sql);
        //插入,更新,删除  stmt.executeUpdate()
        ResultSet rs = stmt.executeQuery(sql);
        //处理结果
        while (rs.next()){
            System.out.print(rs.getObject(1)+"\t");
            System.out.print(rs.getObject(2)+"\t");
            System.out.print(rs.getObject(3)+"\t");
            System.out.println(rs.getObject(4)+"\t");
        }
        //关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

jdbc规范常用类和接口的讲解
1.java.sql.DriverManager
用于管理一组JDBC驱动程序的基本服务
常用方法:
static void registerDriver(Driver driver) 注册驱动
不建议使用,原因:
会导致驱动被注册2次,看源码
不方便后期的维护
建议使用:
Class.forName(“com.mysql.cj.jdbc.Driver”);

获取链接的方法:尝试建立与给定数据库URL的连接。
static Connection getConnection(String url)
static Connection getConnection(String url, Properties info)
static Connection getConnection(String url, String user, String password)
URL:sun公司和数据库厂商之间定义的一种协议。

 //        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&user=root&password=1234");
      
 
		Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","1234");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC", properties);


 //Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC", "root", "1234");

​ jdbc:mysql://localhost:3306/lianxi
​ 协议 子协议 ip 端口号 数据库名
​ jdbc:mysql:///lianxi 默认链接本地的

Properties:类表示一组持久的属性 要参考的数据库的文档
​ Object setProperty(String key, String value)
​ void load(InputStream inStream) //从输入字节流读取属性列表(键和元素对)。
​ void load(Reader reader) //从输入字符流读取属性列表(键和元素对)。
​ String getProperty(String key) 通过键获取值

jdbc执行增删改查

/**
 * 查询
 */
public class JdbcDemo1 {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //使用反射的机制
        Class.forName("com.mysql.cj.jdbc.Driver");
        //建立连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC", "root", "1234");
        //创建发送sql语句的对象
        Statement stmt = conn.createStatement();
        //执行对应的操作
        String sql="select * from dept";
        //查询 stmt.executeQuery(sql);
        //插入,更新,删除  stmt.executeUpdate()
        ResultSet rs = stmt.executeQuery(sql);
        //处理结果
        while (rs.next()){
            System.out.print(rs.getObject(1)+"\t");
            System.out.print(rs.getObject(2)+"\t");
            System.out.print(rs.getObject(3)+"\t");
            System.out.println(rs.getObject(4)+"\t");
        }
        //关闭资源
        rs.close();
        stmt.close();
        conn.close();
    }
}
/**
 * jdbc添加数据
 */
public class Demo2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","1234");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC", properties);
        //创建方式sql的对象
        Statement statement = connection.createStatement();
        //执行sql
        int i = statement.executeUpdate("insert into dept values(60,'开发部','西安','123456')");
        if(i!=0){
            System.out.println("插入成功");
        }else {
            System.out.println("插入失败");
        }
        //关闭资源
        connection.close();
        statement.close();
    }

修改和删除与添加类似

int i=statement.executeUpdate("update dept set phone='88888888' where deptid=60");
int i=statement.executeUpdate("delete from dept where deptid=60");

4个核心对象的具体内容

java.sql.Connection 接口
1,与特定数据库的连接(会话)。
2,接口的实现在哪里?
在驱动中
所有和数据库的交互都是基于链接对象的。
Statement createStatement() 创建一个 Statement对象,用于将SQL语句发送到数据库。
PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。

java.sql.Statement
1,用于执行静态SQL语句并返回其生成的结果的对象。
ResultSet executeQuery(String sql) 只能执行select语句
执行给定的SQL语句,该语句返回单个 ResultSet对象。
int executeUpdate(String sql) 执行DML(insert,update,delete)语句,返回受影响的行数
boolean execute(String sql) 执行任意sql语句。返回的boolean类型表示是否返回了ResultSet结果集
仅当执行select语句,并且有返回结果集的时候才返回true,其他语句都返回false

boolean boo = stmt.execute("create table abc(id int,name varchar(10))");
System.out.println(boo);//false
    boolean boo2 = stmt.execute("select * from abc");
    System.out.println(boo2);//true

Java.sql.ResultSet 接口
1,表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
这个对象中有一个游标的概念,是ResultSet对象中一个可以移动的指针。
默认游标是在结果集的第一行数据之前
boolean next() 每调用依次next方法可以把游标向下移动一行
返回boolean类型,表示如果这行有数据返回真,没有返回假
boolean previous() 把游标向上移动一行
boolean absolute(int row) 把游标移动到指定行
void afterLast() 把游标移动的最后一行之后
void beforeFirst() 把游标移动到第一行之前
boolean first() 移动到第一行数据位置
int getRow() 检索当前行号。
boolean isAfterLast() 检索光标是否在此 ResultSet对象中的最后一行之后。
boolean isBeforeFirst() 检索光标是否在此 ResultSet对象中的第一行之前。
boolean isFirst() 检索光标是否在此 ResultSet对象的第一行。
boolean isLast() 检索光标是否位于此 ResultSet对象的最后一行。
boolean last() 将光标移动到此 ResultSet对象中的最后一行。

public class Demo6 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取链接
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","1234");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC",info);
        //创建发送sql语句的对象
        //Statement stmt = conn.createStatement();
        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        //执行sql
        ResultSet rs = stmt.executeQuery("select * from dept");

      /*  rs.afterLast();

        rs.previous();
        System.out.println(rs.getRow());
        rs.previous();
        System.out.println(rs.getRow());*/


     /*   rs.absolute(4);
        System.out.println(rs.getRow());

        rs.beforeFirst();
        System.out.println(rs.getRow());*/

      /* rs.first();
        System.out.println(rs.getRow());

        System.out.println(rs.isAfterLast());
        System.out.println(rs.isBeforeFirst());

        System.out.println(rs.isFirst());
        System.out.println(rs.isLast());*/

         rs.last();
        System.out.println(rs.getRow());
    }
}

还提供了一些get方法用来获取数据,方便我们进行数据的封装。
Object getObject(int columnIndex) 根据列序号取值 序号从1开始。
Object getObject(String columnLabel) 根据列名取值

因为我们最终要把结果集中的数据封装到javaBean中去。所以我们不使用getObject方法来获取数据。因为用这个获取将来封装的时候需要强制类型转换。
我们将来获取数据的时候直接使用指定的类型来获取。
int getInt(int columnIndex)
int getInt(String columnLabel)
String getString(int columnIndex)
String getString(String columnLabel)

/* *
 * jdbc查询数据库封装数据
 * */
public class Demo7 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取链接
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","1234");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC",info);
        //创建发送sql语句的对象
        Statement stmt = conn.createStatement();
        //执行sql
        ResultSet rs = stmt.executeQuery("select * from dept");
        //创建一个集合,用来保存多个dept对象 Dept为javaBean,和数据库中的列名一一对应
        ArrayList<Dept> list = new ArrayList<>();
        //处理结果,封装数据
        while (rs.next()){
            Dept d = new Dept();
            d.setDeptid(rs.getInt("deptid"));
            d.setDname(rs.getString("dname"));
            d.setAddress(rs.getString("address"));
            d.setPhone(rs.getString("phone"));

            list.add(d);
        }

        //遍历集合
        for(Dept d:list){
            System.out.println(d.getDeptid()+":"+d.getDname()+":"+d.getAddress()+":"+d.getPhone());
        }

        //释放资源
        rs.close();
        conn.close();
        stmt.close();
    }
}

java的数据类型和数据库中的数据类型的对应关系

​ byte tityint
​ short smallint
​ int int
​ long bigint
​ float float
​ double double
​ char nchar
​ boolean bit
​ String char varchar
​ Date date

sql的注入

有一个问题:

​ 输入错误的账号和密码也登陆成功了。

​ 这个问题叫做 sql的注入

​ 因为我们在输入账号和密码的时候 拼接了 一个 sql的关键字 or

​ SELECT * FROM USER WHERE ACCOUNT=‘sdfadsfa’ AND PASSWORD=‘sldfkjsdlk’OR’1=1’

为了解决这个问题,就给我们提供了另一个对象

  • Connection

    •    Statement createStatement()
      
    •    PreparedStatement prepareStatement(String sql)
          *   PreparedStatement  是Statement的子类
         *   表示预编译的SQL语句的对象
      
/**
 *模拟用户登录功能
 */
public class Demo5 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号:");
        String account = scanner.nextLine();
        System.out.println("请输入密码:");
        String password = scanner.nextLine();

        Class.forName("com.mysql.cj.jdbc.Driver");
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","1234");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/lianxi?serverTimezone=UTC", properties);
        //Statement stmt = conn.createStatement();
        PreparedStatement stmt = connection.prepareStatement("select * from user where account=? and password=?");
        stmt.setString(1,account);
        stmt.setString(2,password);

        // ResultSet rs = stmt.executeQuery("select * from user where account='"+account+"' and password='"+password+"'");
        ResultSet rs = stmt.executeQuery();

        if(rs.next()){
            System.out.println("登录成功,欢迎你:"+rs.getString("username"));
        }else{
            System.out.println("账号或密码错误");
        }
    }
}

PreparedStatement 是Statement的子类

  •   表示预编译的SQL语句的对象
    
  •   ResultSet executeQuery()
    

特点:
在创建该对象的时候就要sql,执行的时候就不需要传递sql了
会把sql预先编译
sql语句中的参数发生变化的时候,会过滤掉用户输入的关键字
性能高一些
提供了占位符 ?
“select * from user where account=? and password=?”
给占位符赋值的方法:
针对不同的类型提供了不同的赋值方法
void setString(int parameterIndex, String x)
第一个参数表示 第几个占位符 1表示第一个
第二个参数表示 要给占位符赋的值
注意:类型要匹配

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值