您当前的位置: 首页 > 

Charge8

暂无认证

  • 5浏览

    0关注

    416博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDBC DAO设计与JdbcUtil工具类

Charge8 发布时间:2019-09-08 22:11:55 ,浏览量:5

前面了解了java.sql.Statement接口,现在了解java.sql.PreparedStatement接口

java.sql.PreparedStatement接口:

    表示预编译的SQL语句的对象,可以提高性能。

    无论是执行DML还是DQL语句,都必须先设置?占位符参数,然后在执行SQL语句前给对应的?设值,最后执行。

    • ResultSetexecuteQuery()

      执行此 PreparedStatement对象中的SQL查询,并返回查询 PreparedStatementResultSet对象。

      intexecuteUpdate()

      执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERTUPDATEDELETE ; 或不返回任何内容的SQL语句,例如DDL语句。

获取 PreparedStatement对象: 

    • PreparedStatementprepareStatement(String sql)

      创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。

PreparedStatement 与 Statement的区别:

1)PreparedStatement 拼接SQL语句上,操作更简单。

2)PreparedStatement 安全性更高,可防止SQL注入问题。

3)PreparedStatement 性能会更加高效,但是需要取决于数据库服务器是否支持。

     MySQL不支持PreparedStatement 的性能优化,Oracle支持

     比如:批处理问题,但是MySQL在新的JDBC驱动中,通过设置参数支持批处理操作,所以推荐使用PreparedStatement。 

    // PreparedStatement接口新增
    @Test
    public void testIUD() throws Exception {
        String sql = "INSERT INTO t_user(username,age) VALUES(?,?)";
        //1、加载注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2、获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
        //3、创建语句对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,"赵子龙"); //从1开始
        preparedStatement.setInt(2,17);
        //4、执行SQL语句
        int rows = preparedStatement.executeUpdate();
        //5、释放/关闭资源
        preparedStatement.close();
        connection.close();
        System.out.println(rows); //1
    }
一、DAO设计

1、什么是DAO思想?

      DAO(Data Access Object)是一个数据访问接口,夹在业务逻辑与数据库资源中间。封装了数据的增删改查(CRUD)操作。

2、DAO设计规范

     1)DAO组件:DAO接口和DAO实现类           

          包名规范:域名倒写.模块名称.组件名称

          接口和类名规范:

                damain包中的类:存储一个个JavaBean。

                dao包中的接口:用于表示一个个JavaBean对象的CRUD操作声明。

                dao.impl包中的实现类:用于表示一个个DAO接口的实现类,所以必须实现DAO接口。

    2)创建DAO对象

         面向接口编程:接口 变量 = new 实现类();

二、DAO设计实现与JdbcUtil工具类

       在开发中遵循DRY原则:Don't Repeat Yourself(不要编写重复代码)

需求:简单实现 对t_user表的CRUD操作

      1)提取db.properties文件

      2)使用PreparedStatement接口

      3)提取JdbcUtil工具类

直接看代码

          

1、db.properties

#key-value格式
#连接数据库的四要素信息
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=123456

2、JdbcUtil.java

     重点:静态代码块家在注册驱动和加载 db.properties文件(在项目根路径下加载)

Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
package cn.jq.jdbc.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

// JDBC的工具类
public class JdbcUtil {
    private static Properties properties = new Properties();

    // 当JdbcUtil类的字节码加载在进JVM时,立即执行
    static{
        try {
            //加载和读取db.properties文件
           InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
           properties.load(inStream);
           Class.forName(properties.getProperty("driverClassName"));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    // 创建并返回一个Connection对象
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),
                    properties.getProperty("password"));
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    //释放关闭资源
    public  static void close(Connection conn, Statement st, ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(st != null){
                    st.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                try {
                    if(conn != null){
                        conn.close();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

3、User.java

package cn.jq.jdbc.domain;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private Long id;
    private String username;
    private Integer age;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

4、IUserDAO.java

package cn.jq.jdbc.dao;

import cn.jq.jdbc.domain.User;

import java.util.List;

//封装User对象的CRUD操作
public interface IUserDAO {
    /**
     * 保存操作
     * @param user User对象
     */
    void save(User user);

    /**
     * 根据ID删除操作
     * @param id
     */
    void delete(Long id);

    /**
     * 根据ID更新修改操作
     * @param user User对象
     */
    void update(User user);

    /**
     * 查询指定ID的User对象
     * @param id 被查询User对象的主键id值
     * @return 如果id存在,返回该User对象,否则,返回null
     */
    User get(Long id);

    /**
     *  查询所有的User对象
     * @return 如果结果集为空,返回一个空的List对象
     */
    List listAll();

}

5、UserDAOImpl.java

package cn.jq.jdbc.dao.impl;

import cn.jq.jdbc.dao.IUserDAO;
import cn.jq.jdbc.domain.User;
import cn.jq.jdbc.util.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class UserDAOImpl implements IUserDAO {
    @Override
    public void save(User user) {
        String sql = "INSERT INTO t_user(username,age) VALUES(?,?)";
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JdbcUtil.getConnection();
            // 创建语句对象
            ps = conn.prepareStatement(sql);
            ps.setString(1,user.getUsername());
            ps.setInt(2,user.getAge());
            // 执行SQL语句
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(conn, ps, null);
        }
    }

    @Override
    public void delete(Long id) {
        String sql = "DELETE FROM t_user WHERE id=?";
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JdbcUtil.getConnection();
            // 创建语句对象
            ps = conn.prepareStatement(sql);
            ps.setLong(1, id);
            // 执行SQL语句
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(conn, ps, null);
        }
    }

    @Override
    public void update(User user) {
        String sql = "UPDATE t_user SET username=?,age=? WHERE id=?";
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = JdbcUtil.getConnection();
            // 创建语句对象
            ps = conn.prepareStatement(sql);
            ps.setString(1, user.getUsername());
            ps.setInt(2, user.getAge());
            ps.setLong(3, user.getId());
            // 执行SQL语句
            ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(conn, ps, null);
        }
    }

    @Override
    public User get(Long id) {
        String sql = "SELECT id,username,age FROM t_user WHERE id=?";
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtil.getConnection();
            // 创建语句对象
            ps = conn.prepareStatement(sql);
            ps.setLong(1, id);
            // 执行SQL语句
            rs = ps.executeQuery();
            if(rs.next()) {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setUsername(rs.getString("username"));
                user.setAge(rs.getInt("age"));
                return user;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(conn, ps, rs);
        }
        return null;
    }

    @Override
    public List listAll() {
        List list = new ArrayList();
        String sql = "SELECT id,username,age FROM t_user";
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtil.getConnection();
            // 创建语句对象
            ps = conn.prepareStatement(sql);
            // 执行SQL语句
            rs = ps.executeQuery();
            while(rs.next()) {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setUsername(rs.getString("username"));
                user.setAge(rs.getInt("age"));
                list.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.close(conn, ps, rs);
        }
        return list;
    }
}

6、UserDAOTest.java

package cn.jq.jdbc.test;

import java.util.List;

import org.junit.Test;

import cn.jq.jdbc.dao.IUserDAO;
import cn.jq.jdbc.dao.impl.UserDAOImpl;
import cn.jq.jdbc.domain.User;

public class UserDAOTest {
    private IUserDAO userDAO = new UserDAOImpl();
    
    @Test
    public void testSave() {
        User user = new User();
        user.setUsername("赵云");
        user.setAge(17);
        userDAO.save(user);
    }

    @Test
    public void testDelete() {
        userDAO.delete(3L);
    }

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(2L);
        user.setUsername("赵子龙");
        user.setAge(28);
        userDAO.update(user);
    }

    @Test
    public void testGet() {
      User user =  userDAO.get(2L);
      System.out.println(user);
    }

    @Test
    public void testListAll() {
        List list = userDAO.listAll();
        list.forEach(System.out::println);
    }

}

简单重构出JdbcUtil工具类,还可以继续重构

    站在前辈的肩膀上,每天进步一点点

ends~

 

关注
打赏
1661676204
查看更多评论
立即登录/注册

微信扫码登录

0.5185s