目录

一、防止sql注入

二、数据库连接池

1. C3P0:数据库连接池技术                  

2. Druid:数据库连接池实现技术,由阿里巴巴提供的


一、防止sql注入

sql注入:利用sql语句的语法特点,应用层输入特殊格式,让原有的sql语句失效

创建表结构 并加入数据

create table login(
    lid int primary key auto_increment,
    lname varchar(20),
    lpwd varchar(20),
    lsex varchar(2),
    laddr varchar(50)
);
insert into login(lname,lpwd,lsex,laddr)
values('zhangsan','123456','男','西安北大街');

正常写法

public static void main(String[] args) throws ClassNotFoundException, SQLException {

		Scanner input = new Scanner(System.in);
		// 1. 加载驱动
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2. 获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT",
				"root", "123456");

		System.out.println("请输入账号");
		String uname = input.next();
		System.out.println("请输入密码");
		String upwd = input.next();

		// 3.sql
		String sql = "select * from login where lname ='" + uname + "' and lpwd=' " + upwd + "'";
		Statement statement = conn.createStatement();// 不能防止sql注入
		ResultSet rs = statement.executeQuery(sql);

		// 4.执行sql语句
		if (rs.next()) {
			int lid = rs.getInt("lid");
			String lname = rs.getString("lname");
			String lpwd = rs.getString("lpwd");
			String lsex = rs.getString("lsex");
			String laddr = rs.getString("laddr");
			System.out.println(lid + lname + lpwd + lsex + laddr);
		} else {
			System.out.println("登录失败");
		}
	}

防止sql注入:

public static void main(String[] args) throws ClassNotFoundException, SQLException {

		Scanner input = new Scanner(System.in);
		// 1. 加载驱动
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2. 获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT",
				"root", "123456");

		System.out.println("请输入账号");
		String uname = input.next();
		System.out.println("请输入密码");
		String upwd = input.next();

//		// 3.sql
//		String sql = "select * from login where lname ='" + uname + "' and lpwd=' " + upwd + "'";
//		Statement statement = conn.createStatement();// 不能防止sql注入
//		ResultSet rs = statement.executeQuery(sql);

		// 防止sql注入 -- 利用sql语句的语法特点,应用层输入特殊格式,让原有的sql语句失效
		// 1.sql语句要变 -- 参数位置要使用 ?占位
		String sql = "select * from login where lname =? and lpwd =?";
		// 2. 执行对象要变 -- 预处理sql语句
		PreparedStatement prepareStatement = conn.prepareStatement(sql);
		// 3.给sql语句传参
		prepareStatement.setObject(1, uname);
		prepareStatement.setObject(2, upwd);
		ResultSet rs = prepareStatement.executeQuery();
		// 4.执行sql语句
		if (rs.next()) {
			int lid = rs.getInt("lid");
			String lname = rs.getString("lname");
			String lpwd = rs.getString("lpwd");
			String lsex = rs.getString("lsex");
			String laddr = rs.getString("laddr");
			System.out.println(lid + lname + lpwd + lsex + laddr);
		} else {
			System.out.println("登录失败");
		}
	}

使用PreparedStatement的优点:

  • 安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
  • 语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
  • 效率不同:对于更改参数的同一SQL语句,PreparedStatement可以使用sql缓存区,效率比Statment高

二、数据库连接池

其实就是一个容器(集合),存放数据库连接的容器。

        当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

优点:

  •         节约资源
  •         用户访问高效

实现:

1. 标准接口:DataSource   javax.sql包下的

        1. 方法:

                 获取连接:getConnection()

                归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接

 2. 一般我们不去实现它,有数据库厂商来实现

  • C3P0:数据库连接池技术
  • Druid:数据库连接池实现技术,由阿里巴巴提供的

1. C3P0:数据库连接池技术                  

  • 1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,

                  *不要忘记导入数据库驱动jar包

  • 2. 定义配置文件:

名称: c3p0.properties 或者 c3p0-config.xml文件名称不可以修改

路径:直接将文件放在src目录下即可,路径不可修改

  • 3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
  • 4. 获取连接: getConnection
public static void main(String[] args) throws SQLException {
		
		//获取连接池
		DataSource ds = new ComboPooledDataSource();
		//获取连接对象
		Connection conn = ds.getConnection();
		//测试
		System.out.println(conn);
		//释放资源	
		conn.close();
	}

2. Druid:数据库连接池实现技术,由阿里巴巴提供的

  • 1. 导入jar包 druid-1.0.9.jar

  •  2. 定义配置文件:

            是properties形式的

            可以叫任意名称,可以放在任意目录下

  • 3. 加载配置文件。Properties
  • 4. 获取数据库连接池对象:通过工厂来来获取  DruidDataSourceFactory
  • 5. 获取连接:getConnection
public static void main(String[] args) throws Exception {
		//加载配置文件
		FileInputStream inputStream=new FileInputStream("./src/druid.properties");
		Properties properties = new Properties();
		properties.load(inputStream);
		
		//创建连接池
		DataSource ds =  DruidDataSourceFactory.createDataSource(properties);
		
		//获取连接
		Connection conn =ds.getConnection();
		
		//测试
		System.out.println(conn);
		
		//释放资源
		conn.close();
	}

更多推荐