- _nosay
JDBC学习记录
2017-11-23 15:16:54
1.什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是Java语言来操作数据库.原来我们操作数据库是在控制台使用Sql语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句.
2.JDBC的原理
早期SUN公司是想编写一套可以连接所有数据库的API,但是当他们刚刚开始的时候就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结论就是,由SUN提供一套访问数据库的规范(就是一组接口),并且提供数据库的协议标准,然后数据库厂商会按照SUM的规范提供一套访问自己公司的数据库服务器的API.SUN提供的规范名为JDBC,而各个厂商提供的,遵循了JDBC远东的,可以访问自己数据库的API被称之为驱动.
下载地址:
https://dev.mysql.com/downloads/file/?id=470333
3.获取连接
DriverManager.getConnection(url,username,password)
其中username和password是登陆数据库的用户名和密码
url相对复杂一点,它是用来找到要连接数库主库的"网址",就好比你要浏览器中查找百度时,也需要提供一个url,下面是mysql的url:
jdbc:mysql://localhost:3306/数据库的名字
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔.
第一部分是jdbc,这是固定的.
第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了.
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost),端口号(3306),以及DATABASE名称组成.
接下来我们把下载的mysql-connector-java-5.1.42-bin.jar放入根目录下的web->WEB-INF>lib下
右键lib,找到Add as library,点击后我们就可以使用mysql驱动了
下面是一个简单的mysql连接代码
package net.zixue.jdbc; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; public class Jdbc { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/jsp"; Connection connection = DriverManager.getConnection(url,"root","123456"); connection.close(); } }
Statement最为重要的方法是:
init executeUpdate(String sql):执行更新操作,即执行insert,update,delete语句
ResultSet ExecuteQuery(String sql):执行查询操作,执行查询操作会返回ResultSet,即结果集
ResultSet之获取列数据
可以通过next()方法使ResultSet的游标向下移动,当游标移动到你需要的行时,就需要来获取该行的数据了,ResultSet提供了一系列的获取列数据的方法
String getString(int columnIndex):获取指定列的String类型数据
int getInt(int columnIndex):获取指定列的int类型数据.
double getDouble(int columnIndex) :获取指定列的double类型数据
boolean getBoolean(int columnIndex):获取指定列的boolean类型数据;
Object getObject(int columnIndex):获取指定列的Object类型的数据.
上面方法中,参数columnIndex表示列的索引,列索引从1开始,而不是0,这第一点与数组不同.如果你清楚当前列的数据类型,那么可以使用getInt()之类的方法来获取,如果你不清楚列的类型,那么你应该使用getObject()方法来获取.
ResultSet还提供了一套通过列名称来获取列数据的方法:
String getString(String columnName):获取名称为columnName的列的String数据.
int getInt(String columnName);获取名称为columnName的列的int数据
double getDouble(String columnName)获取名称为columnName的列的double数据
Object getObject(String columnName)获取名称为columnName的列的object数据.
下面是一个查询的操作
package net.zixue.jdbc; import java.sql.*; public class query { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/zhihu"; Connection connection = DriverManager.getConnection(url,"root","123456"); Statement statement = connection.createStatement(); String sql = "select * from users"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { String name = resultSet.getString("name"); String email = resultSet.getString("email"); System.out.println("名字:" + name + "邮箱地址:" + email); } resultSet.close(); statement.close(); connection.close(); } }
运行结果如图:
预防SQL注入
什么是SQL注入
在需要用户进行输入的地方,例如登陆,恶意人员输入的是SQL语句的片段,最终输入的SQL片段与我们代码中定的SQL语句合成一个完整的SQL语句!例如用户在登陆时输入的用户名和密码都是为SQL语句的片段!
防止SQL注入
可以使用PreparedStatement.
在使用Connection创建PreparedStatement对象时需要给出一个SQL模板,所以SQL模板就是有"?"的SQL语句,其中"?"就是参数
在得到PreparedStatement对象后,调用它的setXXX()方法为"?"赋值,这样就可以得到把模板变成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery获取ResultSet对象.
注意PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery是需要参数(SQL语句)的.因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了.
PreparedStatement最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它.这才是真正高效率的原因.
所以,建议大家在今后的开发中,无论什么情况,都云需要PreparedStatement,而不是使用Statement.