Java的JDBC编程
数据库编程的必备条件
- 编程语言
- 数据库
- 数据库驱动包
API(应用程序接口)
这个API由 java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问但是数据库有很多种,他们出自不同的厂商,所以他们各自提供的API都是不一样的,所以java创建了一个API称为JDBC,这组API包含了一些类和一些方法,通过这些类和方法可以实现对数据库的操作,所以各大厂商也接受了这种方式,java组织各大厂商提供他们各自的“数据库驱动包”来和java的JDBC对接。
JDBC的使用
1.创建一个项目
2.在项目中new一个Directory,就叫lib(自己命名),然后把.jar文件拷贝进去,然后右键Directory,点击Add as Library,之后就可以在src中new一个class来编程了
JDBC编程的基本流程
插入,修改,删除操作
- 1.创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();//向上转型
一个父类引用子类的对象,向上转型
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/practice?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
再把dataSource向下转型为子类的类型,因为setUrl这些方法是子类的方法,父类无法调用,需要强转为子类的类型才能访问,那为什么要向上转型再向下转型呢,不能直接使用这种写法吗?
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUser("root");
这样写也是可以的,不过DataSource是提供给多种数据库的数据源,内置了数据库连接池,可以复用连接,提高连接服务器的效率 。如果你需要用到里面的方法,那么用上面的写法你就无法用到这些方法.
这里面的127.0.0.1是一个特殊的ip地址,表示环回ip,就是你本机的ip,日后可以写为别人的ip,可以访问到别人的地址
- 2.和数据库服务器建立连接
返回类型为Connecton并且有受查异常,这样就建立好了连接
- 3.构造sql语句并将sql语句包装成对象PrepareStatement
包装成对象PrepareStatement就是提前预编译一下,为什么要这样?如果请求是个sql字符串,服务器是可以处理的,服务器就需要对sql进行解析,理解这里的含义并且执行,对于服务器的压力就比较大,如果有几万个人客户都在发这个请求,就很崩溃,所以需要客户端对sql进行预编译,服务器做的工作就简单些,压力就会小不少
- 4.执行sql语句
ret就是执行影响了多少行,来判断有没有执行成功
- 5.释放必要的资源
这里要先释放后创建的资源,再释放先创建的资源,这样就完成了数据库的插入操作。
但是这样就是写死了,我需要自己输入来进行操作,所以有人这么做:
String sql = "insert into student value(" + id + ", '" + name + "')";
这么写容易引起“sql注入”的攻击,比如在后面输入删除数据库等操作
所以应该这么写:
String sql = "insert into student value(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
//这里的1,2代表的是第一个占位符和第二个占位符
这样就可以自输入来操作数据库了
删除和修改操作也是一样的
查询
查询操作的变化主要在sql语句开始:
//3.构造sql语句
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery(sql);//相当是一个光标,指向第一个结果的上一个,所以需要先next才能开始查询
while(resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
//5.释放必要的资源
resultSet.close();
statement.close();
connection.close();
- 注意:增删改的statemen.的是executeUpdate,而查询statemen.的是executeQuery
实际开发中最常用的是PreparedStatement对象,以下对其的总结:
1.参数化sql查询
2.性能比statemen高
3.sql预编译
4.占位符不能使用多值
5.占位符:?下标从1开始
6.阻止常见sql注入攻击