9.JDBC
9.1数据库驱动
9.2JDBC
java.sql
javax.sql
还要导入一个数据库驱动包 mysql-connector-java-5.1.47.jar
9.3第一个jdbc程序
程序代码
public class JdbcTest {
public static void main(String[] args) throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try{
//注册驱动
//方式一
Class.forName("com.mysql.jdbc.Driver");
//方式二:DriverManager.registerDriver(new Driver());
//设置连接参数
String url = "jdbc:mysql://localhost:3306/school? useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
String username = "root";
String password = "Li980914";
//连接数据库
connection = DriverManager.getConnection(url, username, password);
//获得statement对象
statement = connection.createStatement();
//编写sql语句
String sql = "select * from subject";
//执行sql
resultSet = statement.executeQuery(sql);
//遍历结果集
while(resultSet.next()){
int subjectNo = resultSet.getInt("subjectNo");
String subjectName = resultSet.getString("subjectName");
int classHour = resultSet.getInt("classHour");
int gradeId = resultSet.getInt("gradeId");
System.out.println(subjectNo);
System.out.println(subjectName);
System.out.println(classHour);
System.out.println(gradeId);
System.out.println("==================");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}
}
步骤:
- 注册驱动
- 设置连接参数
- 连接数据库
- 获得statement对象
- 编写sql
- 执行sql
- 获得结果集
- 遍历结果集
- 释放资源
9.4相关对象解释
DriverManager
该类是数据库管理驱动的。
不同的数据库,都有不同的驱动,这些驱动由数据库厂商开发。
该类通过注册不同的驱动,去连接数据库。
//注册驱动
//方式一
Class.forName("com.mysql.jdbc.Driver");
//方式二:DriverManager.registerDriver(new Driver());
Connection
该类是数据库连接类,我们可以通过DriverManager获得连接对象,这个对象相当于数据库连接对象。
相当于你已经进入了数据库。
Statement
Statement类是一个执行sql语句的类。该类有执行增删改查sql的方法。并返回一些对象。
这些方法中我们我们经常用到的是:
executeUpdate()更新方法:返回影响的行数
executeQuery()查询方法:返回结果集
ResultSet
该类是一个结果集类。里面存放了查询的结果。
我们可以通过遍历该结果集获得查询到的结果。
//遍历结果集
while(resultSet.next()){
int subjectNo = resultSet.getInt("subjectNo");
String subjectName = resultSet.getString("subjectName");
int classHour = resultSet.getInt("classHour");
int gradeId = resultSet.getInt("gradeId");
System.out.println(subjectNo);
System.out.println(subjectName);
System.out.println(classHour);
System.out.println(gradeId);
System.out.println("==================");
}
9.5sql注入问题
//输入无sql注入,subjectNo1为用户输入的参数
String password = "1";
String sql = "select * from user where password ='" +subjectNo1 +"'";
//此时通过该sql语句只能查到对应的password的数据,成功登录。只有密码输入正确才能成功登录。
//sql注入,subjectNo1为用户输入的参数。
String subjectNo1 = "1' or '1=1";
String sql = "select * from user where subjectNo ='" +subjectNo1 +"'";
//存在sql注入,尽管不知道密码也可以登录,存在安全问题
9.6prepareStatement(解决失去了注入)
public class JdbcTest3 {
public static void main(String[] args) throws SQLException, IOException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try{
//获得连接
connection = JdbcUtil.getConnection();
//编写sql
String sql ="select * from subject where subjectNo = ?";
//获得statement对象
preparedStatement = connection.prepareStatement(sql);
//注入参数
preparedStatement.setInt(1,2);
//执行sql
resultSet = preparedStatement.executeQuery();
//遍历数据
while(resultSet.next()){
int subjectNo = resultSet.getInt("subjectNo");
String subjectName = resultSet.getString("subjectName");
int classHour = resultSet.getInt("classHour");
int gradeId = resultSet.getInt("gradeId");
System.out.println(subjectNo);
System.out.println(subjectName);
System.out.println(classHour);
System.out.println(gradeId);
System.out.println("==================");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.release(connection,preparedStatement,resultSet);
}
}
}
//工具类
public class JdbcUtil {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
try {
//读取数据库配置文件
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//获得连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//关闭资源
public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {
if(rs != null){
st.close();
}
if(st != null){
st.close();
}
if(conn != null){
conn.close();
}
}
}