JDBC2(防止sql注入 数据库连接池)
·
目录
一、防止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(); }
更多推荐










所有评论(0)