JDBC
jdbc api
DriverManager 作用:负责管理JDBC驱动
Connection 作用:负责数据库的连接,担任数据的传输
Statement 作用:负责执行sql语句
Resu'l'tSet 作用:负责封装查询的结果,即结果集
jdbc 入门
1.导入JDBC的jar包
项目下创建一个lib的目录,选择jar右击选择Add as Library
2.加载驱动包
Class.forName(驱动名称);
[mysq]: com.mysql.jdbc.Driver
[sqlServer]:com.microsoft.sqlserver.jdbc.SQLServerDriver
[oracle]:oracle.jdbc.driver.OracleDriver
3.连接数据库
Connection con = DriverManager.getConnection(url,username,password);
例如:
url:jdbc:mysql://127.0.0.1:3306/demo?
useUnicode=true&characterEncoding=utf8&useSSL=false
4.获取Statement对象接口
Statement stm = con.createStatement();
5.执行sql语句
boolean execute(String sql): 返回是否返回结果集
ResultSet executeQuery(String sql):返回结果集
int executeUpdate(String sql):返回受影响的函数
addBatch(String sql):批量数据添加
6.连接数据库的字符串
MySql
URL: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=false driverClassName: com.mysql.jdbc.Driver
SQLServer
URL: jdbc:sqlserver://localhost:1433;DataBase=mydb driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
Oracle
URL: jdbc:oracle:thin:@localhost:1521:shop driverClassName:oracle.jdbc.driver.OracleDriver
PreparedStatement对象
注意:Statement执行sql语句,可能操作sql注入,sql不安全
执行原理:
1.先预编译SQL语句
String sql = "INSERT INTO emp
VALUES (?,?,?,?,?,?,?,?)";
PreparedStatement pstm = con.prepareStatement(sql);
2.向SQL语句中注入SQL的参数值。
后续注入的任何SQL的参数内容无论你释放有类似与SQL的语句,都会认为时SQL参数值,而不认为是SQL语句的一部分。
方法: setObject(int paramIndex,Object paramValues)
pstm.setObject(1,7676); pstm.setObject(2,"TOMSON"); pstm.setObject(3,"CLERK"); pstm.setObject(4,7902); pstm.setObject(5,"1980-12-17"); pstm.setObject(6,1500); pstm.setObject(7,200); pstm.setObject(8,10);
CallableStatement对象
注意:原理与PreparedStatement类似,都是先预编译,后注入参数值,再执行。
应用:CallableStatement一般应用于存储过程的执行。
注入:setObject(String paramName,Object paramValues)
事务管理
1.概念
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
注意:每一条sql语句默认构成一条单独的事务,默认开始,默认提交
2.事务特点
•原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
•一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
•隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环 境下运行。
•持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3.事务的定义
开启事务:BEGIN | START TRANSACTION
事务提交:commit
事务回滚:ROLLBACK
例如: BEGIN;(开启事务) UPDATE user
set money = money - 500 WHERE uid
= 1; UPDATE user
set money = money + 500 WHERE uid
= 2; ROLLBACK;(事务回滚) COMMIT;(提交事务)
JDBC优化
1.使用工具类,减少繁琐的代码量
import org.apache.commons.dbutils.QueryRunner; private QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());
qr.query(String sql,ResultSetHandler<T> rsh,Object...params);
sql:预加载的sql语句
ResultSetHandler<T> rsh:结果集,例:BeanList'Handler<>(.class) 和 BeanHandler<888>(888.class)
Object...params:填充占位符所需要的元素集合
2.将一些相同的代码或方法进行封装,提高代码的复用性,便于修改
3.使用数据库连接池代替,以前的getConnection()
c3p0-config.xml连接池代替以前的连接
c3p0-config.xml文件必须再src目录下保存
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!--默认配置--> <default-config> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config> <!--配置连接池mysql--> <named-config name="mysql"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/soso?useUnicode=true&characterEncoding=utf8&useSSL=false</property> <property name="user">root</property> <property name="password">123456</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </named-config>
private static ComboPooledDataSource cpds = new ComboPooledDataSource("mysql"); public static DataSource getDataSource(){ return cpds; } 调用getDataSource()方法返回连接池对象,即可分配一个连接
开发模型MV
M:model
(javaBean:数据封装类型)
(dao:负责与数据库交互)编写sql语句
(service:负责业务处理)对查询出来的用户信息做业务处理,事务处理
V:view
视图是用户看到并与之交互的界面,在视图中其实没有真正的处理发生,只是作为一种输出数据并允许用户操纵的方式