JDBC,预编译,DAO设计,事务

JDBC(Java DataBase Connectivity) 【JDBC,预编译,DAO设计,事务】JDBC是用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成,为多种关系型数据库提供了统一的访问基准。
JDBC隶属于JavaSE的范畴,伴随着JavaSE的版本升级。
Java6开始:JDBC4.0开始无需加载注册驱动。
Java7开始:JDBC4.1提供RowSetProvider工具类
JDBC访问数据库的形式主要有两种

  • 直接使用JDBC API去访问数据库服务器(MySQL/Oracle)。
  • 间接使用JDBC的API去访问数据库服务器
    如第三方工具,Hibernate,,MyBatis等(底层依然是JDBC)。
获取JDBC的连接对象的步骤 1.导入驱动
  • 将MySQL的驱动Jar包添加到项目中
    MySQL驱动下载地址
2.获取连接
public static void demo() throws ClassNotFoundException, SQLException { 1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); 2.获取连接对象 拼接方式:jdbc:使用什么类型的数据库:数据库地址:数据库端口号:哪个数据库 url = jdbc:mysql://localhost(127.0.0.1):3306/jdbcdemo user = root 数据库账号 password = root 数据库密码Connection conn = DriverManager .getConnection("jdbc:mysql://localhost:3306/demo", "root", "root"); }

3.使用PreparedStatement预编译
public static void demo() throws ClassNotFoundException, SQLException {//?表示占位符 String sql = "SELECT * FROM t_student WHERE id = ?"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager .getConnection("jdbc:mysql://localhost:3306/demo", "root", "root"); PreparedStatement ps = conn.prepareStatement(sql); //参数:占位符,对应查询条件 ps.setLong(1, 1L); //获取结果查询结果集 ResultSet rs = ps.executeQuery(); while (rs.next()) { //获取数据 String name = rs.getString("name"); System.out.println(name); } }

DDL
创建表public static void demo() throws ClassNotFoundException, SQLException {String sql = "CREATE TABLE t_demo(" + "id BIGINT PRIMARY KEY AUTO_INCREMENT," + "name VARCHAR(20)," + "age INT); "; Class.forName("com.mysql.jdbc.Driver"); Connection conn = getConnection(); Statement st = conn.createStatement(); st.executeLargeUpdate(sql); st.close(); conn.close(); }public static Connection getConnection() { try { return DriverManager .getConnection("jdbc:mysql://localhost:3306/demo", "root", "root"); } catch (SQLException e) { throw new RuntimeException(e); } }

DML
插入数据public static void demo() throws ClassNotFoundException, SQLException {String insertSql = "INSERT INTO t_demo(id,name,age)VALUES(1,'测试',18)"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = getConnection(); Statement st = conn.createStatement(); st.executeLargeUpdate(insertSql); st.close(); conn.close(); }

修改数据public static void demo() throws ClassNotFoundException, SQLException {String updateSql = "UPDATE t_demo SET name = '修改',age = 20 WHERE id = 1"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = getConnection(); Statement st = conn.createStatement(); st.executeLargeUpdate(updateSql); st.close(); conn.close(); }

删除数据public static void demo() throws ClassNotFoundException, SQLException {String deleteSql = "DELETE FROM t_demo WHERE id = 1"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = getConnection(); Statement st = conn.createStatement(); st.executeLargeUpdate(deleteSql); st.close(); conn.close(); }

DQL
public static void demo() throws ClassNotFoundException, SQLException {//?表示占位符 String sql = "SELECT * FROM t_student WHERE id = ?"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager .getConnection("jdbc:mysql://localhost:3306/demo", "root", "root"); PreparedStatement ps = conn.prepareStatement(sql); //参数:占位符,对应查询条件 ps.setLong(1, 1L); //获取结果查询结果集 ResultSet rs = ps.executeQuery(); while (rs.next()) { //获取数据 String name = rs.getString("name"); System.out.println(name); }rs.close(); ps.close(); conn.close(); }

Dao设计思想和规范 DAO层在业务逻辑与数据库资源中间,是一个数据访问的接口。
用程序设计的语言来说,就是建立一个接口,将所有对数据源的访问操作,抽象封装起来。
public interface IStudentDao {void add(Student student); void delet(Long id); void update(Student student); Student get(Long id); List list(); }

分包规范 com.w.pss.util :工具包,存放工具类 com.w.pss.domian/modle/bean :模型包,存放封装的对象类 com.w.pss.dao :DAO接口包,存放DAO接口 com.w.pss.impl :接口实现包,存放接口的实现类 com.w.pss.test :存放测试类命名规范 接口:IXxx,如:IWidget 实现:XxxImpl,如:KeyImpl 测试:XxxTest Dao:XxxDao

Domain组件的设计思想 Domain组件是把数据封装到一个类中,用来负责组件间的数据传递。
如果方法的形参需要传递过多的参数,那就将这些参数封装成一个实体类传递,这个实体类即Domain。
void update(Student student);

JDBC的异常处理
传统方式处理 public static void demo() {String deleteSql = "DELETE FROM t_demo WHERE id = 1"; Connection conn = null; Statement st = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager .getConnection("jdbc:mysql://localhost:3306/demo", "root", "root"); st = conn.createStatement(); st.executeLargeUpdate(deleteSql); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); }finally { if (conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } }

AutoCloseable处理IO异常public void testHandlerException() { String sql = "CREATE TABLE t_demo( id BIGINT PRIMARY KEY AUTO_INCREMENT, age INT); "; try ( Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/demo", "root", "root"); Statement st = conn.createStatement(); ) {st.execute(sql); } catch (SQLException e) { e.printStackTrace(); } }

事务 在数据库中,开启事务后操作数据,只要出现一点异常,这组数据将不执行任何修改提交的操作,反之则完整的执行。
极端惨烈的要成功都成功,要失败都失败。
事务相关细节1.默认情况下,事务在执行完DML操作就自动提交。 2.查询操作,其实是不需要事务的,但是在开发中也把查询放入其中。 3.记得commit()提交事务。 4.事务不应该在DAO层处理,应该在service层控制。

事务模板
@Test public void testTx() {PreparedStatement ps = null; ResultSet rs = null; Connection conn = null; try {//取消自动提交 conn.setAutoCommit(false); //逻辑语句//成功后提交 conn.commit(); } catch (Exception e) { try { //回滚 conn.rollback(); } catch (SQLException e1) { throw new RuntimeException(e1); } } }

    推荐阅读