JDBC规范
持久化的概念
- 将程序中的数据保存到硬盘、U盘等可掉电式硬件中
为什么要使用JDBC规范?
- 在JDBC规范出来之前,各大数据库厂商使用自己的操作数据库的规范,使得广大开发者难以操作数据库,心力憔悴,开发成本增大;直到Sun公司统一了各个操作数据库的接口规范,迎来了开发者的新生;而这套操作关系型数据库的规范就是JDBC规范,极大地减少了开发成本
JDBC的基本操作
- 加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
- 获取连接对象
Connection conn = DriverManager.getConnection( //url "jdbc:mysql://127.0.0.1/jdbc:3306?characterEncoding=utf-8&useSSL=false", //数据库用户名 "root", //数据库密码 "root" );
- 获取语句对象
PreparedStatement pst = conn.prepareStatement(sql);
- 执行sql语句
//sql语句 String sql = "insert into t_students values (null, ?,?,?,?,?,?,?,?,?)"; //设置参数值 pst.setString(1, student.getUserName()); pst.setBoolean(2, student.getSex()); pst.setDate(3, new java.sql.Date(student.getBirthday().getTime())); pst.setBigDecimal(4, student.getSalary()); pst.setBigDecimal(5, student.getBalance()); pst.setString(6, student.getCollege()); pst.setString(7, student.getMajor()); pst.setString(8, student.getHobby()); pst.setInt(9, student.getClassRoom()); //执行sql语句,返回数据库表中数据的影响条数 int result = pst.executeUpdate();
- 释放资源
pst.close(); conn.close();
DAO思想
概念
- 通过编写一套接口和对应实现类的组件来完成对数据库的操作
DAO思想出现的意义
- 解耦,类与类之间的关联更清晰,使程序更易维护
使用JDBC规范和DAO思想实现CRUD的步骤
- 按照规范定义包(domain、dao、dao/impl、util、test)
- 在domain中定义JavaBean对象,对象属性和数据库表中字段一一对应
- 在dao包中按照IXxxDAO规范定义接口,接口中编写操作数据库的抽象方法
- 在impl中按照XxxDAOImpl的规范定义dao包中接口的实现类并编写操作数据库的语句
- 在test包中按照规范定义测试impl包中类的实现类,并使用@Test注解编写测试方法
提取工具类
- 将impl实现类中操作数据库的重复语句提取出来并在util包中定义工具类
- 将加载驱动、获取数据库连接对象的语句编写在工具类的static静态代码块中
- 将释放资源等重复语句编写在工具类中定义工具方法
Jdbc工具类
- jdbc.properties文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///mybatis?characterEncoding=utf-8&useSSL=false username=root password=root
- JdbcUtils类
public class JDBCUtils { private JDBCUtils() {} public static DataSource dataSource = null; public static Properties properties = new Properties(); /** * 加载jdbc.properties文件,读取到properties对象中 */ static { InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); try { properties.load(in); } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 使用Druid连接池工厂创建连接池对象 * @return 连接池对象 */ public static DataSource getDataSource() { try { if (dataSource == null) { dataSource = DruidDataSourceFactory.createDataSource(properties); } } catch (Exception e) { e.printStackTrace(); } return dataSource; } /** * 释放资源 * @param conn * @param pst * @param rs */ public static void close(Connection conn, PreparedStatement pst, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pst != null) { pst.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 释放资源 * @param conn * @param pst */ public static void close(Connection conn, PreparedStatement pst) { close(conn, pst, null); } }