JDBC
JDBC的开发步骤
1.实现驱动注册(DriverManager)
2.建立连接
3.创建以及发送SQL指令
4.获取以及处理响应
5.释放资源
增删改查案例
增
public static void insert(int deptno,String dname,String loc) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/db1711", "root", "123456"); Statement stmt = conn.createStatement(); String sql = "INSERT INTO dept VALUES("+deptno+",'"+dname+"','"+loc+"')"; int num = stmt.executeUpdate(sql); System.out.println(num); stmt.close(); conn.close(); }
删
public static void delete(int deptno) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/db1711", "root", "123456"); Statement stmt = conn.createStatement(); String sql = "delete from dept where deptno = "+deptno+""; int nums = stmt.executeUpdate(sql); System.out.println(nums); stmt.close(); conn.close(); }
改
public static void update(int deptno,String loc) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/db1711", "root", "123456"); Statement stmt = conn.createStatement(); String sql = "update dept set deptno = "+deptno+" where loc = '"+loc+"'"; int nums = stmt.executeUpdate(sql); System.out.println(nums); stmt.close(); conn.close(); }
查
public static void query() throws Exception{ // 1.借助DriverManager实现驱动的注册(mysql驱动就在DriverManager中管理) //DriverManager.registerDriver(new Driver()); // 反射(DriverManager.registerDriver()注册的唯一方法),注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.建立连接 // jdbc:mysql://localhost:3306/db1711 // 协议:子协议://IP:端口/数据库 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/db1711",//url统一资源定位符(路径)和mysql DBMS的哪个数据库建立连接 "root",//user用户 "123456");//password密码 // 查看是否连接成功 // System.out.println(conn);//com.mysql.jdbc.JDBC4Connection@4d405ef7 // 3.发送sql指令 String sql = "select * from emp"; // 创建Statement的实现类的对象 Statement stmt = conn.createStatement(); // executeUpdate():增删该,返回的是int类型,影响的行数,0是失败 // executeQuery():查询,返回的是结果集 ResultSet rs = stmt.executeQuery(sql); // 4.结果集的处理() // rs.next():boolean类型,游标,没有值的话返回false while(rs.next()) {//遍历每一行的数据 // 依次获取每一列的数据 int empno = rs.getInt("empno"); String ename = rs.getString("ename"); System.out.println(empno+"\t"+ename); } // 5.释放资源 rs.close(); stmt.close(); conn.close(); }
登录的问题
SQL注入
// 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.建立连接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/bd1711", "root", "root"); //3.发送sql, ?占位符 String sql = "select * from user where uname = ? and password = ? "; //支持sql的预编译(语法检查,语义检查 ... 查询) PreparedStatement ps = conn.prepareStatement(sql); //赋值 ps.setString(1, name); ps.setString(2, pwd); //发送命令 ResultSet rs = ps.executeQuery(); //4.处理响应结果 if(rs.next()){ System.out.println("登陆成功"); }else{ System.out.println("登录失败"); } //5.释放资源 rs.close(); ps.close(); conn.close(); 1. preparestatement能够避免sql的注入攻击,安全性更高。 2. preparedStatment实现预编译,因此在批量的数据操作中减少语法检查的时间,效率高。 3. 在批处理中,preparedstatement只能批量处理单一类型的操作;statement可以一次处理增删改等多种类型的操作。 //使用preparedStatement实现批处理 // 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.建立连接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/bd1711", "root", "root"); //3.发送sql String sql = "delete from user where uid = ?"; //预编译 PreparedStatement ps = conn.prepareStatement(sql); //赋值 ps.setInt(1, 1); ps.addBatch(); ps.setInt(1, 2); ps.addBatch(); //4.执行和处理响应 int[] rows = ps.executeBatch(); System.out.println(Arrays.toString(rows)); //5.释放资源 ps.close(); conn.close(); //使用Statement实现批处理 String sql2 = "insert"; String sql3 = "delete"; Statement stmt = conn.createStatement(); stmt.addBatch(sql2); stmt.addBatch(sql3); stmt.executeBatch();
开发DAO
data access object
分层开发(实现代码复用)
DAO主要负责与数据库之间的交互。
问题:
1.硬编码:配置文件
如何使用外部配置文件:
properties配置文件:
//创建properties对象 Properties properties =new Properties(); //将propertes文件加载为流 InputStream is = EmpDao2.class .getClassLoader() .getResourceAsStream("jdbc.properties"); //加载 properties.load(is); //通过key值获取value值 String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); String user = properties.getProperty("user"); String pwd = properties.getProperty("pwd"); // 1.注册驱动 Class.forName(driver); conn = DriverManager.getConnection(url,user,pwd);
封装BASEDAO
封装basedao
package dao; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import util.JdbcUtils; /** * * @author Administrator * 所有的dao的父类(通用的增删改查) */ public class BaseDao { protected Connection conn = null; protected PreparedStatement ps = null; protected ResultSet rs = null; //通用的增删改emp dept user //1.insert update delete / emp dept user : sql ? ? //2.赋值的参数的个数和类型不能确定 Object[] public int executeUpdate(String sql,Object[] params){ int rows = 0; try { //2.获取连接 conn = JdbcUtils.getConnecton(); //3.发送sql指令 //预编译 ps = conn.prepareStatement(sql); //赋值 for(int i=0;i<params.length;i++){ ps.setObject(i+1, params[i]); } //处理 rows = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtils.closeRes(rs, ps, conn); } return rows; } //通用查询 public<T> List<T> executeQuery(String sql,Object[] params,Class<T> clz){ //定义集合 List<T> lists = new ArrayList<>(); try { //1.获取连接 conn=JdbcUtils.getConnecton(); //2.发送sql ps = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ ps.setObject(i+1, params[i]); } ResultSet rs = ps.executeQuery(); //元数据:解释数据的数据 ResultSetMetaData md = rs.getMetaData(); //查询的字段的总数 int count = md.getColumnCount(); //3.处理 while(rs.next()){//遍历一行就需要创建一个对象进行封装 //创建t对象 (调用t的class对象创建t对象,调用无参构造创建对象) T t = clz.newInstance(); //获取每个字段的值(遍历获取每行中每个字段的值) for(int i=0;i<count;i++){ //先获取字段名称 String name = md.getColumnName(i+1); //根据字段名称获取字段的值 Object value = rs.getObject(name); //根据字段名称获取相应的属性,将字段的值赋给属性 Field field = clz.getDeclaredField(name); //设置允许赋值 field.setAccessible(true); //赋值 if(value!=null){ field.set(t, value); } } //添加到list集合 lists.add(t); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ JdbcUtils.closeRes(rs, ps, conn); } return lists; } }
调用basedao
package dao; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import entity.Emp; import util.JdbcUtils; public class EmpDao3 extends BaseDao{ //查询所有 public List<Emp> queryAll(){ String sql = "select * from emp"; Object[] params = {}; return executeQuery(sql, params, Emp.class); } //增加 public int insert(Emp emp){ String sql = "insert into emp(empno,ename,deptno) values(?,?,?)"; Object[] params = { emp.getEmpno(),emp.getEname(),emp.getDeptno() }; return executeUpdate(sql, params); } public int delete(int empno){ String sql = "delete from emp where empno=? "; Object[] params = { empno }; return executeUpdate(sql, params); } public static void main(String[] args) { EmpDao3 dao = new EmpDao3(); System.out.println(dao.queryAll()); } }