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

JDBC(Java DataBase Connectivity)

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);
            }
        }
    }

你可能感兴趣的:(JDBC,预编译,DAO设计,事务)