1、数据库驱动
不同数据库有不同的驱动。我们的程序会通过数据库驱动和数据库进行链接。
2.jdbc
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC。对开发人员来说,只需要掌握jdbc接口的操作即可。
3.书写第一个jdbc程序
// 1. 加载驱动,固定写法
Class.forName("com.mysql.jdbc.Driver");
// 2. 用户信息和url
String userName = "root"; //用户名
String password = "123456"; //密码
String url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true";
//3.获取连接
Connection connection = DriverManager.getConnection(url,userName,password);
//4.获得执行sql的对象
Statement statement = connection.createStatement();
//5.执行sql
String sql = "select * from user";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
system.out.println("id="+resultSet.getObject("id"));
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();
4.Statement对象详解
Jdbc中的statement对象用于向数据库发送sql语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完成后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
5.sql注入问题
什么是sql注入?
sql存在漏洞,会被攻击导致数据泄露。
6.PreparedStatement对象
PrepareStatement可以防止sql注入,效率更好。
PrepareStatement防止sql注入的本质就是把传递进来的参数当做字符,假设其中存在转译字符,会被直接转译。
// 1. 加载驱动,固定写法
Class.forName("com.mysql.jdbc.Driver");
// 2. 用户信息和url
String userName = "root"; //用户名
String password = "123456"; //密码
String url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true";
//3.获取连接
Connection connection = DriverManager.getConnection(url,userName,password);
//4.获得执行sql的对象
String sql = "select * from user where id = ?";
PrepareStatement statement = connection.prepareStatement(sql);
//5.执行sql
statement.setInt(1,1);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()){
system.out.println("id="+resultSet.getObject("id"));
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();
7. JDBC操作事务
Connection conn = null;
PrepareStatement ps = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection();
//关闭数据库自动提交,会自动开启事务
conn.setAutoCommin(false);
String sql1 = "update amount set money = money - 100 where id = 1";
ps = conn.prepareStatement(sql1);
ps.executeUpdate();
String sql2 = "update amount set money = money + 100 where id = 2";
ps = conn.prepareStatement(sql2);
ps.executeUpdate();
//提交事务
conn.commit();
}catch(Exception e){
try{
conn.rollback(); //如果失败则回滚事务
}catch(Exception e){
e.printStackTrace();
}
}finally{
try{
ps.close();
}catch(Exception e){
e.printStackTrace();
}
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
8. 数据库连接池
池化技术:准备一些预先的资源,过来就连接预先准备好的。
最小连接数
最大连接数
等待超时
编写连接池,需要一个接口,DataSource