看了这篇文章你可以
- 什么是JDBC
- JDBC最原始的操作步骤
- SQL注入是什么
- 常用statement接口的方法
以及这些方法的区别 - 连接数据库的参数是什么、有什么作用
- 批处理的使用
- 数据库连接池的使用c3p0和德鲁伊数据库连接池的使用
- MyBatis框架连接数据库
- Spring框架 JDBCTemplate的使用
- 以及上述操作的细节
什么是JDBC
JDBC就是用于连接数据库的东西
JDBC最原始的操作步骤
- 加载驱动
- 建立连接
- 执行SQL语句
- 处理返回结果
- 关闭对象和连接
加载驱动
初学者要注意C是大写的哦
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
/**
* 这里要说明在MySQL数据库8版本前后 ,加载驱动的区别
* 8版本之前 Class.forName("com.mysql.jdbc.Driver");
* 8版本之后 Class.forName("com.mysql.cj.jdbc.Driver");、
*
*/
建立连接
这里的root是数据库的用户名,123456是密码
第一个参数是URI
其他的参数在下面会讲
//获取连接(建立连接是比较耗时的)
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/electrochemistry?useSSL=false&serverTimezone=UTC",
"root",
"123456");
System.out.println("连接数据库成功"+conn);
SQL注入、statement接口
处理返回
这里statement是一个接口接口有很多实现类,如何查看,在eclipse中(想要查看的类中)按CTRL+T就可以了
/**
* 使用statement会产生sql注入的情况
* 就是传入的参数自带判断值的时候,会无条件的执行
* statement传参都是采用拼接字符串的方式
*/
Statement sta = conn.createStatement();
String id="5 or 1=1";//这就发生了SQL注入的情况
String sql1="delete from test where id="+id;
sta.execute(sql1);//数据库中test表中的所有记录全被删除
/**
* 使用PrepareStatement来进行查询
* 效率要比statement高 且不会发生SQL注入的情况,因为PrepareStatement会先进行处理来防止SQL注入的情况
*/
String sql2="select * from test where id=?";
PreparedStatement ps = conn.prepareStatement(sql2);
ps.setInt(1, 1);
ResultSet rs = ps.executeQuery();
/**
* 遍历ResultSet结果集的方法
*/
while (rs.next()) {
System.out.println(rs.getObject(1));
System.err.println(rs.getString(2));
}
//在遍历结果集中也可以使用歌挺Object()方法,这样就不需要去区别数据类型了
关闭对象以及连接的顺序
常用statement接口的方法
以及这些方法的区别
这里需要注意,执行sql语句方法错误了,会返回不是所需的结果
executeQuery只可以执行SELECT语句
这些常用执行SQL语句的返回结果也是不同的
/**
* statement常用执行SQL语言的方法总结
* execute() 运行语句返回是否有结果集
* executeQuery() 运行select语句,返回ResultSet结果集
* executeUpdate() 运行insert/update/delete操作,返回更新的行数
*/
关闭对象和连接
关闭对象和连接时需要把对象声明放在try代码块的外面
批处理
什么是批处理,顾名思义批处理就是一下处理一批数据
/**
* 批处理一次插入20000条数据
* 注意
* 需要将事物的提交方式改为手动提交(默认是自动提交)
* 尽量不要使用PrepareStatement,因为PrepareStatement在预编译的过程中数据量太大可能会产生异常
* 尽量使用statement
*/
conn.setAutoCommit(false);//设置为手动提交
for(int i=1;i<=20000;i++) {
String p="insert into user (id,name) values('"+i+"',6666)";//拼接字符串
sta.addBatch(p);
}
sta.executeBatch();
conn.commit();//提交
conn.setAutoCommit(true);//设置为自动提交
在这里也要简单介绍一下事物
什么是事物
在数据库中事物就是
一组要么同时执行成功要么同时执行失败的的SQL语句,是数据库操作的一个执行单元
事物的四大特点
原子性:事物内的操作要么全部成功要么全部失败
一致性:一个事物内只要有一个操作失败,数据库就要回滚到修改前的状态
持久性:事物完成后,它对系统的影响是永久的
隔离性:简单来说就是我办事的时候你不能过来看
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
代码
、、、java
/**
* 有关事物的一些操作
*/
conn.setAutoCommit(false);//将事物的提交方式设置为手动(默认自动提交)
String SQL="";//sql语句
sta.execute(SQL);//执行SQL语句
conn.commit();//提交事物
conn.rollback();//事物执行失败需要进行回滚,应该写在catch语句中,这里为了方便展示写在了一起
数据库连接池的使用
数据库连接池的使用这里讲两个一个是C3P0另一个是德鲁伊
德鲁伊是由阿里巴巴开发的
阿里巴巴地表Java最强嘛,从性能上来说还是推荐使用德鲁伊的数据库连接池
先介绍C3P0数据库连接池的使用
这一篇写的已经很多了,所以换了一篇文章
链接在此
大哥,TM点个赞行不行