不同数据库有不同的驱动。我们的程序会通过数据库驱动和数据库进行链接。
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC。对开发人员来说,只需要掌握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();
Jdbc中的statement对象用于向数据库发送sql语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完成后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
什么是sql注入?
sql存在漏洞,会被攻击导致数据泄露。
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();
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(); } }
池化技术:准备一些预先的资源,过来就连接预先准备好的。
最小连接数
最大连接数
等待超时
编写连接池,需要一个接口,DataSource