1:注册驱动(指挥部)Class.ForName("com.mysql.cj.jdbc.Driver")
2:获取链接(造桥)DriverManager.getConnection()
3:创建SQL执行器con.createStatement()
4:执行SQL语句,返回结果集sta.executeQuery(sql)
5:对结果进行处理while(rs.next()){int id = rs.getInt("id")}
6:关闭资源.close()
Example:
添加:
1:驱动注册
2:获取连接
Connection con = getConnection();
3:创建执行器
String sql="insert into student(name,age,birth,email) values(?,?,?,?)";
PreparedStatement pst = con.prepareStatement(sql);
3.1//给占位符赋值
pst.setString(1,"etoak");
pst.setInt(2,111);
pst.setDate(3,new java.sql.Date(new java.util.Date().getTime()));
pst.setString(4,"etoak@qq.com");
//执行SQL
int count = pst.executeUpdate();
System.out.println(count);
修改/删除:
1:注册驱动
2:获取连接
Connection con = getConnection();
//delete from xxx where id=?
3:创建执行器
String sql="update student set name=?,age=?,birth=?,email=? where id=?";
PreparedStatement pst = con.prepareStatement(sql);
3.1//给占位符赋值
pst.setString(1,"etoak");
pst.setInt(2,111);
pst.setDate(3,new java.sql.Date(new java.util.Date().getTime()));
pst.setString(4,"etoak@qq.com");
pst.setInt(5,1);
//4:执行SQL,返回结果
int count = pst.executeUpdate();
System.out.println(count);
Tip:
DML:增删改使用executeUpdate()
DQL:查使用executeQuery()
返回主键:
1:主键是数字类型
开关:
PreparedStatement pst = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS)
ResultSet keys = pst.getGenaratedKeys()
while(keys.next()){
int id = keys.getInt(1)
System.out.println(id)
}
同一个连接下查询:
PreparedStatement pst = con.prepareStatement(sql)
int count = pst.executeUpdate()
pst = con.prapareStatement("select last_insert_id()")
2:主键是字符串类型
先生成主键------>再添加主键
分页:
假分页:按需显示数据(滚动结果集,preparedStatement三参数)
真分页:limit/rownum
int pageNumber=当前页
int pageSize=每页记录数
int start = (pageNumber-1)*pageSize
Others:
1:获取资源加载
从当前Test.class这个类所在的目录开始寻找:从包内开始找
TestCon.class.getResourceAsStream("../../../db.properties")
获取类加载器:从包外开始找
TestCon.class.getClassLoader().getResourceAStream("db.properties")
2:Statement和PreparedStatement的区别
PreparedStatement extends Statement
1:PreparedStatement:预编译,当创建这个对象时,就会把该SQL语句发送到数据库编译保存,参数以?占位符的形式存在,执行时只需要给占位符复制即可
2:避免SQL注入
事务:
概念上:多条SQL语句为一个执行单元
特征:ACID
原子性,一致性,隔离性,持久性
多个事务相互影响的问题:脏读,不可重复读,幻读
隔离级别:读已提交,读未提交,可重复读,串行化
事务应用场景:
入职:emp+emp1
转账:A-100,B+100
清空购物车:支付->生成订单->通知卖家->生成操作日志->清空购物车
添加学生携带照片:添加学生->返回主键->添加照片
JDBC控制事务:
1:先禁用setAutoCommit(false)
2:提交commit()
3:回滚rollback()
数据源:
第二步DriverManager.getConnection的替代(JDK1.4之后)
数据源:JDK标准
资源池:解决方案
apache-commons-DBCP:产品