jdbc的xmind
认识JDBC
JDBC的本质
就是JAVA访问mysql数据库的一个API。
JDBC访问数据库编码步骤
基本步骤
1:加载一个Driver驱动
2:创建数据库连接(Connection)
3:创建SQL命令发送器Statement
4:通过Statement发送SQL命令并得到结果
5:处理结果(select语句)
6:关闭数据库资源ResultSet Statement Connection
两种方式
不能防止注入攻击
示例
// 有两种方式加载驱动
// Driver driver = new com.mysql.cj.jdbc.Driver();
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.加载驱动
// DriverManager.registerDriver(driver);
String url = "jdbc:mysql://localhost:3306/mytest?serverTimezone=GMT%2B8&useSSL=FALSE&characterEncoding=utf-8";
String user = "root";
String password = "12345";
// 2.创建连接
Connection connection = DriverManager.getConnection(url, user, password);
// 3.创建SQL命令发送器
Statement statement = connection.createStatement();
String sql = "insert into dept values(50,'教学部','北京')";
// 4.发送SQL命令得到结果
int rows = statement.executeUpdate(sql);
System.out.println("影响到的行数是" + rows);
// 5.关闭资源
statement.close();
connection.close();
正常的步骤存在的问题
通过特殊的输入参数,可以改变SQL语句的本意
加入预编译防止注入攻击
1.加载驱动
Class.forName(driver);
2.创建连接
connection = DriverManager.getConnection(url, user,password);
3.sql语句
String sql="select * from account where username = ? and password = ?";
4.发送sql语句
preparedStatement = connection.prepareStatement(sql);
5.设置参数
preparedStatement.setString(1,username );
preparedStatement.setString(2,pwd );
6.执行CURD
resultSet =preparedStatement.executeQuery();
preparedStatement主要的方法其实就是两个,一个是查询,一个是更新(包括的语句有,insert del update)三个。
preparedStatement.executeQuery();
preparedStatement.executeUpdate();
还有一个就是对返回的集合拨开
while(resultSet.next()){
int empno = resultSet.getInt("empno");
String ename = resultSet.getString("ename");
String job = resultSet.getString("job");
int mgr = resultSet.getInt("mgr");
Date hiredate = resultSet.getDate("hiredate");
double sal= resultSet.getDouble("sal");
double comm= resultSet.getDouble("comm");
int deptno= resultSet.getInt("deptno");
Emp emp =new Emp(empno, ename, job, mgr, hiredate, sal, comm, deptno);
list.add(emp);
}
效率问题
开启预编译
useServerPrepStmts是否开启预编译
cachePrepStmts 是否启用预编译缓存
"jdbc:mysql://localhost:3306/mydb?*****&useServerPrepStmts=true&cachePrepStmts=true";
批处理
减少了与数据库的交互次数,效率会大大提高
示例
Class.forName(driver);
connection = DriverManager.getConnection(url, user,password);
String sql="insert into dept values (DEFAULT ,?,?)";
preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
//设置参数
for (int i = 1; i <= 10663; i++) {
preparedStatement.setString(1, "name");
preparedStatement.setString(2, "loc");
preparedStatement.addBatch();// 将修改放入一个批次中
if(i%1000==0){
preparedStatement.executeBatch();
preparedStatement.clearBatch();// 清除批处理中的数据
}
}
/*
* 整数数组中的元素代表执行的结果代号
* SUCCESS_NO_INFO -2
* EXECUTE_FAILED -3
* /
/int[] ints = */
preparedStatement.executeBatch();
preparedStatement.clearBatch();
数据库连接池
解决问题:connection对象的反复创建和销毁,占用资源的问题
事务
认识事务
在逻辑上一组不可分割的操作,由多个sql语句组成,多个sql语句要么全都执行成功,要么都不执行. 原子性 一致性 隔离性 持久性
JDBC中,每条语句执行完毕之后,系统会自动提交。
通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交
事务的操作步骤
1.设置事务的手动提交
connection.setAutoCommit(false);
2,回滚事务
connection.rollback();
3,提交事务
connection.commit();
设置回滚点
1.设置回滚点的链表
LinkedList
1.设置回滚点
Savepoint savepoint = connection.setSavepoint();
2.添加回滚点
savepoints.addLast(savepoint);
3.回滚
connection.rollback(sp);
日志的使用log4j
日志的级别
FATAL: 指出现非常严重的错误事件,这些错误可能导致应用程序异常中止
ERROR: 指虽有错误,但仍允许应用程序继续运行
WARN: 指运行环境潜藏着危害
INFO: 指报告信息,这些信息在粗粒度级别上突出显示应用程序的进程
DEBUG: 指细粒度信息事件,对于应用程序的调试是最有用的
使用方法
1.加入jar包 log4j-1.2.8.jar
2.加入属性文件 src 下 log4j.properties
properties配置文件
log4j.rootLogger=debug,stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=d:/msb.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m %t %n
log4j.rootLogger=debug,stdout,logfile
这个地方是设置错误级别和日志的记录方式的
他的意思是,记录debug以及以上的错误日志,其实也就是记录所有的错误啦。
还有就是两种方式,一种是控制台打印,一种是日志打印的。
浙公网安备 33010602011771号