数据库
char与varchar区别:char用于数据长度一致的字段,varchar用于长度不一样的字段。
修改数据
update 表名 set 修改的数据 where 条件
增加数据
insert into 表名(字段) values (数据)
删除数据
delete from 表名
查找数据
select 列名 from 表名
JDBC
首先需要将数据库连接包*mysql-connector-java-5.1.48-bin.jar*导入到项目中,导入到项目的资源中。
1.加载驱动
Class.forName("com.mysql.jdbc.Driver");//加载驱动
2.创建连接
String url = "jdbc:mysql://127.0.0.1:3306/test";
Connection con = DriverManager.getConnection(url, "root", "root");//创建数据库的连接
3.获取对象
Statement statement = con.createStatement();//获取数据库处理的对象
4.执行语句
resultSet = statement.executeQuery("select id,name,mobile,adress from user_info");//执行查询语句
String sql = "delete from user_info";//删除语句
int result = statement.executeUpdate(sql);//executeUpdate函数返回值为一个boolean值类型。增删改语句一致。
String sql = "insert into user_info(id,name,mobile,adress) values('001','张三','18234856259','河南省郑州市高新技术开发区')";//插入语句
String sql = "update user_info set name='李四',mobile='182348566' where id='001'";//修改语句
5.处理结果
//查询语句的结果处理
while(resultSet.next()) {//返回一个boolean值,如果表中的下一行中有数据返回true
//如果没有,返回false
String id = resultSet.getString("id");//获取表中列名的数据
String name = resultSet.getString("name");
String moblie = resultSet.getString("mobile");
String adress = resultSet.getString("adress"); System.out.println(id+","+name+","+moblie+","+adress);
6.释放资源
遵循倒序的原则释放资源
try {
if(resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
SQL注入
含义
将一个字符串拼接到某一个sql语句中,有可能会导致该sql语句改变其原有的含义,产生意想不到的结果。
也就是说在拼接sql语句时,传入的是为true的条件,例如'1'='1',那么他将不会考虑其他情况,会造成sql注入的问题。
代码
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
Connection con = DriverManager.getConnection(url, "root", "root");
Statement statement = con.createStatement();
String where = "1' or '1'='1";
String sql = "delete from user_info where id ='"+where+"'";
System.out.println(sql);
if(statement.executeUpdate(sql)>0) {
System.out.println("Yes");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//在数据库中虽然没有找到id为1的数据,但是'1'='1'该条件恒成立立,or与||效果一致,所以会导致该条件一直成立,因此会不断的执行该sql语句,会将数据库的所有信息全部删除。这就是sql注入
String where = "1' or '1'='1";
String sql = "delete from user_info where id ='"+where+"'";
改造后的sql语句
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
Connection con = DriverManager.getConnection(url, "root", "root");
Statement statement = con.createStatement();
String where = "1' or '1'='1";
String sql = "delete from user_info where id =?";//?表示一个占位符,并没有真实的数据
PreparedStatement prepareStatement = con.prepareStatement(sql);//使用sql注入
//此时执行sql语句就不会将数据全部删除
prepareStatement.setObject(1, where);//使用prepareStatement的方法setObject将where注入到sql语句中
System.out.println(sql);
if(prepareStatement.executeUpdate()>0) {//这里方法的参数sql可以省略,因为sql语句已经存在与对象中
System.out.println("Yes");
}else {
System.out.println("NO");//使用prepareStatement方法后,并没有执行sql语句,而是执行了该行语句。
}
String where = "1' or '1'='1";
String sql = "delete from user_info where id =?";//?表示一个占位符,并没有真实的数据
PreparedStatement prepareStatement = con.prepareStatement(sql);//使用sql注入
prepareStatement.setObject(1, where);//将id与sql语句进行了拼接。1代表索引,where代表填入到索引的数据,也就是将where字符串填入到sql语句中