JDBC过程
-
创建数据源
DataSource dataSource = new MysqlDataSource();
-
建立与数据库的连接
由于mySQL是服务器与客户端连接形式的数据库软件, 需要建立客户端与服务器的联系, 但并不是所有数据库软件都是这种形式, 为了通用性, JDBC自带的DataSource类型并没有与服务器建立连接的方法, 所以需要向下转型, 使用MysqlDataSource建立与服务器的连接
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/bite?characterEncoding=UTF-8&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("2222"); Connection connection = dataSource.getConnection();
-
书写sql语句, 并对sql语句进行预处理
String sql = "insert into student values('张三',12)"; PreparedStatement statement = connection.prepareStatement(sql); //对sql语句进行预处理
服务器其实可以对sql进行预处理, 在客户端预处理为了减轻服务器的压力
-
进行sql操作
statement.executeUpdate(); //删除,插入,修改操作,返回值为涉及的行数 statement.executeQuery(); //查询操作, 需要用ResultSet类型接受结果, 如何查看数据见下
-
释放资源, 先创建的后释放
statement.close(); connection.close();
查看查询到的数据
String sql = "select * from student;";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()){//检测是否还有没读的行
System.out.println(resultSet.getInt("age"));//括号内可以是列名也可以是列数,从1开始,类型必须对应
System.out.println(resultSet.getString("name"));
}
通过外部数据进行sql操作
在实际工程中我们往往需要使用类似命令行中scanner的办法获取用户数据, 然后进行sql的操作, 最简单的办法就是直接读取数据, 然后以拼接字符串的方式进行操作, 但是这种做法不仅让代码可读性降低, 而且危险性很大, 我们无法确保用户输入的数据是什么样的。例如下面的例子:
Scanner scan = new Scanner(System.in);
System.out.println("输入您的姓名:");
String name = scan.next();
System.out.println("输入您的年龄:");
int age = scan.nextInt();
String sql = "insert into student values('" + name + "'," + age + ");";
PreparedStatement statement = connection.prepareStatement(sql);
statement.executeUpdate();
作为用户我可以这样输入: “; drop table student;”
这样输入虽然并不能真的删除student, 我只是拿来举个例子, 但是懂得如何输入的"用户"自然会成功, 这也就是所谓的sql注入
为了防止这一情况的放生, 我们使用库内的方法进行sql操作, 这样不仅增加了代码可读性, 也增加了代码的安全性。
String sql = "insert into student values(? , ?);";//问号为占位符
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,age);
statement.executeUpdate();