java学习之mysql第二十二一天( --JDBC--查询--登录--避免sql注入--)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 23:10   21   0

你想要多大的成功,你愿意为这份成功付出什么?

1. JDBC: 是Java提供的一套类和接口 是链接数据库的一套规范;

2. JDBC为我们提供了java连接数据库的驱动。而这个驱动也是由Java开发出来的,我们只需要将这个驱动放进项目中,通过这个 驱动,我们就可以用Java连接数据库,进行数据库的管理操作。

3: 了解:JDBC与ODBC的区别:

二者皆可以实现对数据库的操作(连接、增删改查、建库建表)。

1. JDBC是SUN开发的java连接数据库的标准;

2. ODBC是微软开发的,C语言的;

2. JDBC操作数据库的步奏:

注意: 每个驱动程序类必须实现的接口 Driver; DriverManager 管理一组 JDBC 驱动程序的基本服务。

1. 注册驱动 registerDriver( Driver driver ),

1. 第一种注册方式: DriverManger.registerDriver( new Driver() ); Driver里面有个静态代码块.执行了这一个过程.我们 只需要加载类的时候,就可以被调用; 因此我们用第二种方法;

2.第二种注册方式: 利用反射注册驱动,forName(里面填入的是带包名的类名);

2. 获取数据库连接对象:

getConnection(String url, user password );

3. 通过链接对象, 获取sql语句的执行对象;

connection.createStatement();

4. 通过 statement对象来执行sql语句;

1. statement. executeUpdate( sql ); 执行DML和DDL语句 返回值 int 受影响的行数;

2. statement.executeQuery( sql ); 执行DQL语句; 返回值resultSet

5. 处理执行sql 后得到的结果集;

6. 关闭资源( 调用close() 方法)

1. 练习 : 插入一条数据;

public class Demo01 {
 public static void main(String[] args) throws Exception {
  // 注册驱动
  // 如果这么注册 相当于注册了2遍驱动 DriverManager.registerDriver(new Driver());
  // Driver类源码中有静态代码块
  // 并且代码块中 已经注册了一次""
  // 该如何正确注册驱动?
  // 利用反射注册驱动 反射填进去的是全类名;带包名;
  Class<?> forName = Class.forName("com.mysql.jdbc.Driver");
  // 第二步获取连接对象
  // url 数据库的链接地址 固定格式 jdbc:mysql://主机ip地址: 数据库的端口号(默认3306)/数据库的名
  // 用jdbc链接的mysql //
  String url = "jdbc:mysql://localhost:3306/myjdbc01";

  String user = "root";
  String password = "123456";
  Connection connection = DriverManager.getConnection(url, user, password);
  // 这里打印是connection实现类;
  // System.out.println(connection);
  // 第三步: 通过连接对象获取sql语句的执行对象
  Statement statement = connection.createStatement();
  // 第四步: 执行sql语句;插入一条数据;
  String sql = "insert into goods" + "(sname,sprice,adesc)"
  + "values('手机',8000,'一台高级手机')";
  // 返回值是受影响的行数;
  int row = statement.executeUpdate(sql);
  System.out.println("受影响的行数" + row);
  // 关闭资源
  // 关闭连接对象,
  connection.close();
  // 关闭执行sql语句的对象
  statement.close();

 }
}

2. 查询一条数据;

public class Demo02查询 {
 public static void main(String[] args) throws Exception {
  // 注册驱动;
  Class.forName("com.mysql.jdbc.Driver");
  String url = "jdbc:mysql://localhost:3306/myjdbc01";
  String user = "root";
  String password = "123456";
  // 获取链接对象
  Connection connection = DriverManager.getConnection(url, user, password);
  // 获取sql语句对象
  Statement create = connection.createStatement();
  String sql = "select*from goods";
  // 返回查询结果的结果;
  ResultSet result1 = create.executeQuery(sql);
  while (result1.next()) {
   // 打印数据
   // 如果使用列的索引注意从1 开始;\
   // 如果使用*号查询: 索引是数据库中标的顺序;
   // 如果不适用* 直接使用字段顺序就是你sql语句中使用的顺序;
   // int int1 = result1.getInt(1);
   // String name = result1.getString(2);
   // int age = result1.getInt(3);
   // String adesc = result1.getString(4);
   // System.out.println(int1+name+age+adesc);

   // 直接往里面填字段名字 获取数据方式; 里面存在指针, 开始指在第一行最上方;
   String sname = result1.getString("sname");
   int sid = result1.getInt("sid");
   System.out.println(sid + sname + result1.getInt("sprice") + result1.getString("adesc"));

  }
  // 关闭资源
  connection.close();
  create.close();
  result1.close();
 }
}
打印结果

1娃娃100大海专用

2普洱20阿凡达专用

3本体10000对于自己来说很好用

4手机8000一台高级手机

5手机180012台高级手机

3. sql 注入设置:

  or'1=1   sql注入;  研究一 下
 * sql 注入測試;
 * 在sql語句拼接时候.可以加入一个恒等条件;
 * 让这条sql语句一定会成立. 
 * 可以通过这个方式来改变你sql语句原来的意思;
 * 
 * sql 注入设置;
 * 键盘输入账号密码
 * 查询数据库 ----打印用户信息;
 * 并且打印该账号和密码
 *  select * from goods where username= 'wanglong'and password ='123' 
public class Demo03登录 {
 public static void main(String[] args) throws Exception { 
  System.out.println("请输入賬號");
  Scanner scanner = new Scanner(System.in);
  String user1 = scanner.nextLine();
  System.out.println("請輸入密碼");
  String password1 = scanner.nextLine();
  Class.forName("com.mysql.jdbc.Driver");
  String url = "jdbc:mysql://localhost:3306/myjdbc01";
  String user = "root";
  String password = "123456";
  Connection connection = DriverManager.getConnection(url, user, password);
  Statement statement = connection.createStatement();
  String sql = " select * from users where username= '"+user1+"' and password= '"+password1+"'";
  ResultSet executeQuery = statement.executeQuery(sql);
  while (executeQuery.next()) {
   // String string = executeQuery.getString("uid");//
   System.out.println(executeQuery.getString("username") + " " + executeQuery.getString("password"));
  }
  connection.close();
  statement.close();
  executeQuery.close();

 }
}

//打印结果 由于字符串拼接原因, 我改变了sql语句本来的条件导致注入设置:

请输入賬號
王龙
請輸入密碼
123456'or'1=1
王龙 123456
坤儿 123456

4. 如何避免注入设置;

1. 获取预编译sql语句的对象; connction.prepareStatement( sql );

2. 使用占位符 ? : 使用占位符时候不用加引号;

3. 调用 statement. setObject ( 1 , user1 ); 替换掉问号;

1.参数1.问号的位置个数,

2.参数2. 问号要替换的变量

public class Demo04防止sql注入 {
 public static void main(String[] args) throws Exception {
  System.out.println("请输入賬號");
  Scanner scanner = new Scanner(System.in);
  String user1 = scanner.nextLine();
  System.out.println("請輸入密碼");
  String password1 = scanner.nextLine();
  Class.forName("com.mysql.jdbc.Driver");
  String url = "jdbc:mysql://localhost:3306/myjdbc01";
  String user = "root";
  String password = "123456";
  Connection connection = DriverManager.getConnection(url, user, password);
  //获取预编译sql语句的对象
  //使用占位符号 ? 
  //使用占位符不用加单引号
  String sql = "select * from users where username=? and password=?";
  PreparedStatement statement = connection.prepareStatement(sql);
  //设置占位符的值  下面给占位符赋值;
  //参数1 : 问号的索引, 从1开始;
  //参数2:  替换问号的值;
  statement.setObject(1, user1);
  statement.setObject(2,password1);
  
  //执行sql语句
  ResultSet resulute= statement.executeQuery();
  //处理结果街
   while (resulute.next()) {
   System.out.println(resulute.getString("username")+" "+resulute.getString("password"));
  }
  
 }
}

5.修改数据; 使用preparedStatement 修改id为1的数据;

public class Demo05修改数据 {
 public static void main(String[] args) throws Exception {

  Class.forName("com.mysql.jdbc.Driver");
  String url = "jdbc:mysql://localhost:3306/myjdbc01";
  String user = "root";
  String password = "123456";
  Connection connection = DriverManager.getConnection(url, user, password);
  String sql = "update goods set sname=?,sprice=? where sid =1 ";
  PreparedStatement statement = connection.prepareStatement(sql);
  statement.setObject(1, "充气娃娃");
  statement.setObject(2, 100);
  int row = statement.executeUpdate();
  System.out.println("受影响的行数" + row);
  connection.close();
  statement.close();
 }
}

6. 链接工具类:

public class JDBCUitl {

 // 声明链接的属性成员变量;
 private static Connection connection;

 // 私有化构造方法;
 private JDBCUitl() {
  // TODO Auto-generated constructor stub
 }

 // 使用静态态代码块
 static {
  try {
   Class.forName("com.mysql.jdbc.Driver");
  } catch (ClassNotFoundException e) {
   // 注册失败没有执行下去的意义
   // 直接抛出运行异常;
   throw new RuntimeException("数据库加载失败");

  }
 }

 // 提供get方法获取链接使用
 // 将可能使用到的时候,利用配置文件;proprites;
 // 驱动类 url user password ;
 public static Connection getConnection() {
  String url = "jdbc:mysql://localhost:3306/myjdbc01";
  String user = "root";
  String password = "123456";
  try {
   connection = DriverManager.getConnection(url, user, password);
  } catch (SQLException e) {
   throw new RuntimeException("数据库链接异常");
  }
  return connection;

 }

 // 关闭资源
 // 将需要关闭的资源当做参数穿进去;
 public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
  // 判断不为空再关闭;
  if (connection != null) {
   try {
    connection.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  if (statement != null) {
   try {
    statement.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  if (resultSet != null) {
   try {
    resultSet.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

 }

}



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP