JDBC(Java Data Base Connection)Java中提供的一套操作数据库的API接口,用于java语言连接操作数据库
常用API组件
DriverManager:这个类是驱动管理类,管理一系列数据库驱动程序,用于简历和数据库的连连接 Connection:该接口具有接触数据库所有的方法,表示和数据库通信的上下文对象 Statement:该对象将SQL提交的数据库 ResultSet:SQL查询语句的结果集通过resultSet返回给用户 SQLException:该类是和数据库交互中任何错误
JDBC使用
1、引入MySQL驱动 通过maven引入依赖
<!--MySQL的驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
2、jdbc连接数据库编程
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
System.out.println("连接成功");
Statement statement = connection.createStatement();
String sql1 = "update student set Sname='tulun' where SID=18 ";
int i = statement.executeUpdate(sql1);
String sql ="select * from student";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
String sname = resultSet.getString("Sname");
System.out.println(sname);
}
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
System.out.println("连接失败");
e.printStackTrace();
}
编程步骤: 1、引入mysql-connector-java依赖包 2、引入MySQL驱动 3、DriverManager连接数据库获取Connection对象 4、通过Connection获取Statement对象进行SQL操作 5、如果是查询操作处理结果集:ResultSet 6、关闭资源
常用API
Connection接口:数据库连接的对象 获取Statement对象: PreparedStatement prepareStatement(String sql) :获取PreparedStatement对象 Statement createStatement() :获取Statement对象 CallableStatement prepareCall(String sql) :获取CallableStatement对象 处理事务:void commit() 提交事务 Statement接口:用来执行SQL语句 boolean execute(String sql):提交SQL语句 返回Boolean类型 可以提交变更操作(插入、删除、修改) int executeUpdate(String sql) :提交执行DML语言,返回结果表示影响数据库数据行数 ResultSet executeQuery(String sql):执行查询操作,返回的结果在ResultSet中 ResultSet():返回结果集 boolean next():判断是否还有数据,每调用一次获取的是数据库对应的一行记录 问题:PreparedStatement和Statement的区别
Statement statement = connection.createStatement();
String sql1 = "update student set Sname='tulun' where SID=18 ";
int i = statement.executeUpdate(sql1);
String sql2="update student set Sname = ? where SID = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql2);
preparedStatement.setString(1,"tulun1");
preparedStatement.setString(2,"18");
preparedStatement.execute();
SQL注入问题及解决方案
SQL注入:利用非法的SQL拼接来达到入侵数据库的目的 以登录为例:
boolean doLogin(String name, String passwd) {
boolean result = false;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
System.out.println("连接成功");
Statement statement = connection.createStatement();
String sql = "select * from user where name='"+name+"' and passwd = '"+passwd+"'";
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()) result = true;
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
System.out.println("连接失败");
e.printStackTrace();
}
return result;
}
String name = "12345 ";
String passwd = "12343563445";
UserDao userDao = new UserDao();
boolean login = userDao.doLogin(name, passwd);
if (login) {
System.out.println("用户登录成功");
} else {
System.out.println("用户名或密码错误,请重新登录");
}
在上述代码中,用户名和密码来和SQL进行拼接查询数据库,查询操作是需要用户名和密码正确才能执行成功。 将name参数写成”name = 12345 or 1=1 and passwd=1234“ name参数拼接中通过非法的SQL拼接达到修改SQL语义,就达到了入侵数据库的目的 当name = 12345或者 1=1and passwd=1234 后面中只要任何一个成绩即可 1=1 为true ,就不在判断passwd是否正确,因此对应登录操作给定用户名,不知道密码情况下也能完成登陆。
SQL注入问题解决方案:
使用PreparedStatement解决: 将SQL及参数分别传递到MySQL服务端,会先进行SQL语义检查 能够规避SQL注入问题,建议使用prepareStatement来处理JDBC连接数据库问题
JDBC处理事务
connection.setAutoCommit(false);
connection.commit();
connection.rollback();
|