JDBC总结
首先介绍下JDBC是java写的,跟数据库建立Socket连接,采用具体网络协议把JDBC转换为直接的网络调用
1最基本的JDBC使用
1获取驱动
Driver driver = new OracleDriver();
2获取连接
Connection conn = driver.connect(url,info) url是连接地址 info用户名密码是properties类型
但是如上的写法直接创造了产商的实现类 绕过了java提供的JDBC接口 移植性不好
因为上述方法在编译时就确定了对象了 所以如果我们想在运行时创建对象,就可以用反射:
2利用反射获取连接
String driverClassName = "oracle.jdbc.driver.OracleDriver"
1获取驱动
Class clazz = Class.forName(driverClassName);
Driver driver =(Driver) clazz.newInstance();
如上的方法可以直接更改driverClassName字符串就可以改变所用的驱动 也可以放到文件中 可移植性增强!
但是如上方法info都是properties对象 我们更倾向用两个简单的String来处理
3驱动管理类DriverManager获取连接
1首先需要注册驱动
String driverClassName = "com.mysql.jdbc.Driver"
Class clazz = Class.forName(driverClassName);
Driver driver =(Driver) clazz.newInstance();
DriverManager.registerDriver(driver);//注册驱动
2获取连接
DriverManager.getConnection(url,username,password) 这里username password就都是String了!~
4然而让我们看看厂商提供的驱动,Driver类对象静态代码块中已经注册了驱动 所以我们加载类即可
最终方便简单方法:所以我们只需要把类加载了 驱动也就OK了 所以最后代码变成如下:
String driverClassName = "com.mysql.jdbc.Driver"
String url;
String user;
String password;
Class clazz = Class.forName(driverClassName);
DriverManager.getConnection(url,username,password)
可以将字符串提取到properties属性文件中 想要切换数据库的时候就可以直接改properties属性文件
分隔~~~~~~~~~~~~~~~~~~以下开始增删改查
利用PreparedStatement 发送sql语句给数据库服务器
PreparedStatement有个父接口 Statement 有很多弊端:
(1)需要使用拼串的形式,单双引号并用 麻烦
(2)用户可以输入 1‘ OR 1 = ’ 1字符串进行sql注入!
(3)效率比较低,PreparedStatement是预编译的sql 而 statement不是!
所以用PreparedStatement:
(1)获取连接 得到 Connection conn对象
(2)PreparedStatement ps = conn.prepareStatement(sql); //注意 此时sql的参数用? 即占位符 可以防止sql注入!
(3)ps.set....给占位符填参数
(4)int row = ps.executeUpdate() 增删改都通用 返回影响的行数~
查询:ResultSet rs = ps.executeQuery() 返回ResultSet对象,即查询得到的结果集
while(rs.next()){
rs.get....//此处可以用ORM对象关系映射原理封装成一个对象保存数据
}
(5)关闭连接 从下往上关(先关闭ResultSet PreparedStatement 后关闭Connection)
sql不明白咋写的请走 https://blog.csdn.net/weixin_40695328/article/details/89323481
上图方法中增删改是通用的 所以可以提出来用方法传参来给参数~
将以上方法改造成完全通用的形式(适用于任何表 通用地查询任何对象):
(1)利用泛型确定返回值类型,利用反射在运行时动态返回对象
(2)利用ResultSetMetaData结果集的元数据
PreparedStatement批量处理
有时候如果我们需要插入很多数据 可以用批量处理:
在循环当中设置属性后
调用PreparedStatement 的addBatch();
在达到你要的数量级后调用 executeBatch() 并且 clearBatch();
可以达到存储一定数量级的插入数据或者删除数据一次性执行~
(1)mysql批量处理默认是关闭状态:需要在jdbc的url后面添加?rewriteBatchedStatements=true
(2)也需要注意mysql驱动版本问题