Java DataBase Connectivity (java语言链接数据库)
properties文件中的内容是 className=MySql
ResourceBundle bundle=ResourceBundle.getBundle("jdbc); String className=bundle.getString("className"); Class c=Class.forName(className); JDBC jdbc=(JDBC)c.newInstance(); jdbc.getConnection();
jdbc 环境变量,针对文本编辑器.
用idea 不需要配置这个,用自己的配置方式.
jdbc 编程6步
遍历结果集&& 6步连接操作
注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //因为参数是字符串,可以通过properties文件获取 //以下方法不需要接受返回值,因为只想静态代码块加载 Class.forName("com.mysql.jdbc.Driver"); 获取连接 conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/zzy","root","222222"); 获取数据库中的操作对象 stmt=conn.createStatement(); //jdbc中的sql语句不需要分号结尾 String sql="delete from dept where deptno =40"; //增删改的时候 int count=stmt.executeUpdate(sql); System.out.println(count==1?"执行成功":"失败"); //查语句的时候 String sql="select empno as a,ename,sal from emp"; ResultSet rs=stmt.executeQuery(sql); while(rs.next()){ /*String empno=rs.getString(1);//不管数据库中的类型是啥,取出来都是String,jdbc中所有下标从1开始.不是从0开始 String ename=rs.getString(2); String sal=rs.getString(3); */ 以列名获取 int empno=rs.getInt("a");//因为前面列名变化了叫a 所以这里也是a String ename=rs.getString("ename"); double sal=rs.getDouble("sal"); System.out.println(empno+" "+ename+" "+ sal); } } 释放资源按照后开先关 依次执行 Class.forName("com.mysql.jdbc.Driver") ;' Connection conn=DriverManager.getConnection(); Statement stmt=conn.createStatement(); int count=stmt.executeUpdate(sql语句); stmt.close(); conn.close()
ResultSet是结果集,但和集合没有关系!
rs.next();返回boolean
使用idea 配置mysql驱动
导入模块
使用powerDesign 进行数据库的设计
注意保存的格式是ansi 格式 得把.sql脚本再通过记事本另存为utf-8
但是再docs命令中是gbk 所以中文还是乱码.
在navicat中是正确的
功能业务
pa
1.JDBC是什么
2.jdbc的本质是什么?
多态:
Animal a = new Cat ( ) --》面向抽象编程
父类型的引用 指向 子类型的对象
3.开发前准备工作
4.jdbc 过程
注册驱动方式两种
使用资源绑定器绑定属性配置文件
URL解析
5.遍历结果集
idea
导入.jar包
字符串中拼变量
(sql)单引号中 加双引号 加两个加号++ 加号里面加变量
解决Sql注入问题
PreparedStatement预编译
其中一个问号 表示一个占位符,占位符不能使用单引号括起来
4查(SELECT)
第四步用 rs = ps.executeQuery(“字段”);
增删改(INSERT DELETE UPDATE)
第四步用 rs= ps.executeUpdate(“字段”);
框架(select)
public static void main(String[] args){ Connection conn = null; PreparedStatement ps = null;//加d是名词 ResultSet rs = null; try { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/codeyuaiiao?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8","root","3615yuhaijiao"); //3.获取预编译的数据库操作对象 String sql = "select * from student"; ps = conn.prepareStatement(sql);//动词 //4.执行sql语句 rs = ps.executeQuery();//查询select //rs = ps.executeUpdate();//增删改都是用Update(INSERT DELETE UPDATE) //5.处理查询结果集 } catch (Exception e) { e.printStackTrace(); }finally { //6.释放资源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } }
}
用preparedStatement完整代码
Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/zzy?useSSL=true","root","222222"); //获取预编译的数据库操作对象 String sql="insert into dept(deptno,dname,loc) value(?,?,?)"; ps= conn.prepareStatement(sql); ps.setInt(1,41); ps.setString(2,"销售"); ps.setString(3,"上海"); //执行sql int count=ps.executeUpdate(); //如果是select 语句返回的是ResultSet //rs=ps.executeQuery(); 括号中不需要sql,输入输了,那就再编译了没有必要! System.out.println(count==1?"chenggong":"shibai"); // while(rs.next()) // { // System.out.println(rs.getString(1)); // } } catch (Exception e) { e.printStackTrace(); }finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
事务三件套 (开启 提交 回滚)
conn.setAutoCommit(false); 关闭自动提交 开启事务
conn.commit(); 手动提交
conn.rollback(); catch中写 回滚
if(conn != null){
try{
conn.rollback();
}catch(sqlException e1){
e1.printStackTrace();
}
}
JDBC 工具类DButil
public class DBUtil { /** * 工具类中的构造方法都是私有的 * 因为工具类当中的方法都是静态的,不需要new对象 */ private DBUtil(){ //构造方法私有化,防止调用,因为只需要调用静态方法就行了 } //静态代码块在类加载时执行,并且只执行一次. static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection("jdbc:mysql://localhost:3306/zzy","root","222222"); } /** * * @param conn 连接对象 * @param stmt 数据库操作对象 * @param rs 结果集 */ public static void close(Connection conn, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
工具类的调用
Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=DBUtil.getConnection(); String sql="select ename from emp where ename like ? "; ps=conn.prepareStatement(sql); ps.setString(1,"A%"); rs=ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString("ename")); } } catch (SQLException e) { e.printStackTrace(); }finally { DBUtil.close(conn,ps,rs); }
行级锁 (for Update)
悲观锁:事务没结束之前,事务必须排队,一整行记录不准改动,不允许并发。
乐观锁:支持并发,事务不排队,需要一个版本号。一个事务发现前后的版本号不一致了 就执行回滚操作 ,本次操作不执行。
代码 1
public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn = DBUtil.getConnection(); conn.setAutoCommit(false); String sql="select ename,job,sal from emp where job= ? for update "; ps = conn.prepareStatement(sql); ps.setString(1,"manager"); rs = ps.executeQuery(); while(rs.next()) { System.out.println(rs.getString("ename")+" "+ rs.getString("job") +" " +rs.getString("sal")); } conn.commit(); } catch (SQLException e) { if (conn != null) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } e.printStackTrace(); }finally { DBUtil.close(conn,ps,rs); } }
代码2
Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=DBUtil.getConnection(); conn.setAutoCommit(false); String sql="UPDATE emp SET sal=sal*9.9 where job=?"; ps=conn.prepareStatement(sql); ps.setString(1,"manager"); int i = ps.executeUpdate(); System.out.println(i); conn.commit(); } catch (SQLException e) { if (conn != null) { try { conn.close(); } catch (SQLException e1) { e1.printStackTrace(); } } e.printStackTrace(); }finally { DBUtil.close(conn,ps,rs); }