day1-JDBC技术
-
JDBC概述
-
JDBC六大步骤
-
JDBC执行DDL操作
-
Statement与PreparedStatement区别
-
getGeneratedKeys获取自动生成主键
-
数据传输对象DTO
-
封装通用连接工具类(DBUtils)
-
基于Java + Mysql完成CRUD
JDBC概述
JDBC(Java DataBase Connectivity,java数据库连接)是由SUN公司发布的一套用于执行SQL语句的Java API ,JDBC屏蔽了不同数据库系统之间的差异,使得操作数据库更为通用与一致。JDBC原理如下图:
JDBC学习前置知识
-
Java核心技术
-
数据库技术与SQL语句
JDBC常用接口与类
-
Connection
-
Statement&PreparedStatement
-
ResultSet
-
DriverManager
-
SQLException
JDBC连接数据库通用步骤
JDBC连接数据库包含以下通用六大步骤:
-
加载驱动(JDBC4之后无需手动加载)
-
获取连接
-
获取处理sql语句命令对象
-
执行
-
处理结果
-
关闭资源
注意事项:
因为JDBC是将操作数据库的具体实现交给了各个数据库产商实现,因此在使用JDBC前必须先引入数据库厂商提供的驱动包才能完成操作,如mysql数据库需要引入相关jar包到项目构建路径中:
mysql-connector-java-5.1.39-bin.jar
示例代码:
插入操作:
//1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 Collection Collections Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root"); //3.获取执行sql命令对象 Statement stat = conn.createStatement(); //4.执行 int i = stat.executeUpdate("insert into tbuser(name,pwd) values('softeem','123')"); //5.处理结果(返回更新操作影响的数据行数) System.out.println(i); //6.关闭资源 stat.close(); conn.close();
PreparedStatement
PreparedStatement是Statement的子接口,相比Statement,PreparedStatement具备更高的效率以安全性,使用Statement时,其原理为先创建对象,然后将sql语句发送到数据库执行,这个过程中可将用户输入的数据拼接到sql语句中,存在sql注入风险;因此使用PreparedStatement替代Statement成为了一个选择,PreparedStatement具备预编译功能,其首先对sql语句进行预编译,然后再将值填充到对应占位符处,从而有效避免了sql注入的风险。
PreparedStatement用法如下:
String sql = "select * from tbuser where username=? and password=?"; Connection conn = null; PreparedStatement ps = null; try { conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/test", "root", "root"); // stmt = conn.createStatement(); // ResultSet rs = stmt.executeQuery(sql); //获取sql语句的预编译命令(安全性方面保障,防止sql注入) ps = conn.prepareStatement(sql); //预处理,为占位符填充具体值 ps.setString(1, name); ps.setString(2, pwd); ResultSet rs = ps.executeQuery(); if(rs.next()){ System.out.println("登录成功!"); }else{ System.out.println("登录失败"); } } catch (SQLException e) { e.printStackTrace(); }finally{ try { if(ps != null){ ps.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } }
getGeneratedKeys()
该方法有Statement接口提供,用户获取数据库表中因产生插入操作而自动生成的列数据(通常指主键列),用法如下:
Connection conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/test?user=root&password=root&characterEncoding=utf-8"); //获取与处理命令并得到自动生成的键 PreparedStatement ps = conn.prepareStatement( "insert into tbuser(username,password) values(?,?)", Statement.RETURN_GENERATED_KEYS); ps.setString(1, "rrrrr"); ps.setString(2, "123456"); int i = ps.executeUpdate(); if(i>0){ System.out.println("添加成功。。。"); ResultSet rs = ps.getGeneratedKeys(); while(rs.next()){ //int id = rs.getInt("GENERATED_KEY"); int id = rs.getInt(1); ResultSetMetaData rsmd = rs.getMetaData(); System.out.println(rsmd); System.out.println("自动生成的ID--->"+id); } } ps.close(); conn.close();
DTO
DTO(Data Transfer Object),数据传输对象,是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象(DAO)从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。