学习JavaWeb第九天

day09

jdbc

jdbc简介

  • 概述:

    • JDBC(Java DataBase Connectivity)SUN公司提供的一套操作数据库的标准规范

JDBC规范

  • 掌握四个核心对象

    jdbc 的相关的类与接口:

          Driver: 这个数据库厂商提供的驱动类 (数据库的基本信息)
    
          DriverManager :驱动管理类:   用于获取连接    需要传递三个参数
    
          Connection :得到数据库连接对象,才能对数据库进行增加删除 修改 查询等等
    
          Statement   给数据库发送sql 的对象 
    
          PreparedStatement   也是发送sql 的对象  是Statement 对象的子类
    
          ResultSet    返回的结果集对象
    

    ResultSet 就是一个结果集(迭代器) next 类似于迭代器的hasnext()判断是否有下一个元素

    • DriverManager驱动管理类
    • Connection连接对象
    • Statement操作数据库对象
    • ResultSet 结果集对象
  • JDBC规范(接口)在哪里:

    • JDK中:

    • java.sql.*;

    • javax.sql.*

      • 扩展包
    • 数据库厂商提供的驱动:jar文件

  • 如何使用:

    jdbc操作数据库的步骤

    • 1、创建项目 导入jar包

    • 2、注册驱动

      • Class.forName(“com.mysql.jdbc.Driver”);
    • 3、获取连接

      • DriverMananger.getConnection();

      • 参数:

        • url

          url:地址,一般是jdbc:mysql://localhost:3306/student?characterEncOding=utf-8&serverTimezone=GMT%2B8&useSSL=false,user:用户名,pwd:密码

          jdbc+表示主协议:也就是使用jdbc来进行连接的

          mysql:表示子协议:也就是连接的数据是mysql数据库

          localhost:表示本机的地址

          3306 数据库的端口号

          student 表示连接的

          ? 后面都表示拼接的参数(可不写)

          characterEncoding=utf-8 设置编码格式

          serverTimezone=GMT%2B8 设置时区 相差8个小时

          useSSL=false 解决兼容性问题

          如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称:

          • jdbc:mysql://localhost:3306/day08
          • jdbc:mysql:///day08
        • username 用户名

          • root
        • password 密码

          • root
    • 4、获取可执行对象

      • con.createStatement();
    • 5、获取结果集对象

      • ResultSet result =statement.executeQuery(sql);

        • 查询
      • int row =executeUpdate(sql)

        • 增删改
      • boolean flag =execute();

        • 执行查询如果查询到返回true
        • 执行增删改的时候 如果成功 返回false
    • 6、关闭资源

      • result.close();
      • stetament.close();
      • con.close();

事例:

//删除
	public void delete() {
		// TODO Auto-generated method stub
		try {
			// 注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 建立链接对象
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/secndsql", "root", "root");
			// 创建数据库对象
			Statement createStatement = con.createStatement();
			// 编写sql语句
			String sql = "delete from test where id=3";
			/* 查询调用该语句  executeQuery(sql)
			 * //创建查询语句 ResultSet executeQuery = createStatement.executeQuery(sql);
			 * 
			 * 返回的是一个结果集 while (executeQuery.next()) { executeQuery.getString(1); }
			 */
			/* 创建sql删除语句 增删改都是调用该方法 executeUpdate(sql) */    
			/* 返回的是受影响的行数 */
			int row = createStatement.executeUpdate(sql);
			if (row > 0) {
				System.out.println("删除成功!");
			}
			//关闭资源 executeQuery  createStatement con
			createStatement.close();
			con.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
  • 单元测试
    - junit test:测试,作用:局部测试,其实就是写一个方法
    • @Test @After @Before
      • 方法前调用写@Test:运行时调用该方法
      • 方法前调用写@After:运行后调用该方法
      • 方法前调用写@Before:运行前调用该方法
    • 要求:
      • 方法修饰符只能是public
      • 不允许有参数和返回值
      • 不允许是静态方法
//修改
	@Test   
	public void alter() {
		// TODO Auto-generated method stub
		
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接对象
			Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myfirstsql","root","root");
			//创建数据库对象
			Statement createStatement = connection.createStatement();
			String sql="update secsql set 绩点='9.9' where id=2";
			int i = createStatement.executeUpdate(sql);
			if (i>0) {
				System.out.println("修改成功!");
			}else {
				System.out.println("修改失败!");
			}
			createStatement.close();
			connection.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
  • JDBC实现增删改查
    JDBC实现增删改查
    • DML
      • executeUpdate()
        增删改时调用该方法,返回的是受影响的行数
    • DQL
      • executeQuery()
        查询是调用该语法,返回的是一个结果集
    • excute()
      • 该方法在调用时只会返回true or false
      • 在调用时如果对表格内的内容没有更改就返回true。对表格的内容有更改时就返回false
        查询成功返回true 失败返回false
        增删改 成功返回false 失败返回true
PreparedStatement接口: 预编译的 SQL 语句的对象

sql注入问题
演示sql注入

  • 产生的原因
  • 在输入框内写了sql语句,但是这个jdbc 的Statement这个对象去解析的时候 直接做成字符串拼接解析了,因此就会有sql语句执行的问题,然后就会有不安全问题

解决sql注入

  • PreparedStatement 为Statement子接口 里面支持预编译处理,他先把sql先编译好,用?做占位符来代替参数,将来你从页面传过来任何值他都会给你做字符串解析

PreparedStatement使用步骤:

  • 加载数据库驱动
  • 创建连接对象
  • 编写sql语句
  • 创建数据库对象
  • 设置占位符内容
  • 获取结果集或获取受影响的行数
  • 关闭资源

注意点:

  • 1.占位符跟你赋值的个数必须是一致(包括其类型)
  • 2.PreparedStatement只能用来为可以加引号’的参数(如参数值)设置动态参数,即用?占位,不可用于表名、字段名等
  • 3.赋值必须在 调用这个方法的前面进行操作executeUpdate()
    增删改查
//添加
	@Test
	public void increse() {
		
		try {
			//加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接对象
			Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myfirstsql","root","root");
			//编写sql语句
			String sql = "insert into secsql values(?,?,?)";
			//创建数据库对象
			PreparedStatement prepareStatement = connection.prepareStatement(sql);
			//设置占位符内容 
			prepareStatement.setInt(1, 6);
			prepareStatement.setString(2, "老王");;
			prepareStatement.setDouble(3, 9.9);
			//获取结果集或获取受影响的行数
			int update = prepareStatement.executeUpdate();
			if (update>0) {
				System.out.println("增加成功!");
			}else {
				System.out.println("增加失败!");
			}
			//关闭资源
			prepareStatement.close();
			connection.close();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值