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

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

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();
			}
		}

	}

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值