dao代码模板

Posted koushr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dao代码模板相关的知识,希望对你有一定的参考价值。

提供数据源以及回收资源的工具类DbUtils:

public class DbUtils {
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    static {
        try {
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");// 指定连接的数据库的地址
            dataSource.setUser("root");
            dataSource.setPassword("123");
            dataSource.setAcquireIncrement(5);
            dataSource.setInitialPoolSize(20);
            dataSource.setMinPoolSize(2);
            dataSource.setMaxPoolSize(50);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 单例模式
    public static DataSource getDataSource() {
        return dataSource;
    }

    public static void close(Connection con, PreparedStatement ps, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
                rs = null;
            }
            if (ps != null) {
                ps.close();
                ps = null;
            }
            if (con != null) {
                con.close();
                con = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

提供数据库连接、处理事务的工具类TransactionUtils:

public class TransactionUtils {
    private static DataSource dataSource = DbUtils.getDataSource();
    private static Connection con = null;

    public static Connection getConnection() {
        try {
//            System.out.println(dataSource);
            con = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    public static void beginTx() {
        try {
            con.setAutoCommit(false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void rollback() {
        try {
            con.rollback();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void commit() {
        try {
            con.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

一个测试dao类:

public class STDao {
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

    public void update() {
        con = TransactionUtils.getConnection();
        System.out.println(con);
        TransactionUtils.beginTx();
        String sql = "delete from student";
        try {
            ps = con.prepareStatement(sql);
            ps.executeUpdate();
            sql = "insert into student (name,age) values (?,?)";
            ps = con.prepareStatement(sql);
            ps.setString(1, "xiaosi");
            ps.setObject(2, "yy");
            ps.executeUpdate();
            TransactionUtils.commit();
        } catch (Exception e) {
            e.printStackTrace();
            TransactionUtils.rollback();
        } finally {
            DbUtils.close(con, ps, rs);
        }
    }

    public static void main(String[] args) {
        STDao dao = new STDao();
        dao.update();
    }
}

以上代码是比较好的,数据源单例、在catch块中写回滚,在finally块中回收资源。

需要了解的是,如果我们的sql语句错误,那么在ps.executeUpdate();后就会抛出java.sql.SQLException异常,直接进入到catch块中,根本不会执行下面的提交事务代码,不提交事务的情况下执行回滚也不会报错,此时数据库数据不会改变。如果sql语句正确,提交事务后因为网路问题造成操作失败,则此时也会进入到catch块中,执行回滚,数据库数据也不会发生改变。所以说,数据层代码这样写最合适。

以上是关于dao代码模板的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段2——.vue文件的模板

Eclipse 中的通用代码片段或模板

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

代码生成器小例