Jdbc编程

1、什么是JDBC

  JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,是用Java语言编写的类和接口组成的,可以为多种关系型数据库提供统一访问的接口。JDBC提供了一种基准,说白了,也就是sun公司为各大数据库厂商的关系型数据库连接java所制定的规范,因此他们只需要实现JDBC的接口规范即可,而具体的实现是由各大数据库厂商去实现的,由于每种数据库的独特性,Java是无法控制的,所以JDBC是一种典型的桥接模式。我们据此也可以构建更高级的工具和接口,比如封装常用的CRUD工具类,使数据库开发人员能够更快速、高效、简便的开发数据库应用程序。

  1. 从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。
  2. 从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便。
  3. 从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。

使用JDBC进行CRUD操作

/**
*
* @description: JDBC连接MySQL数据库进行CRUD操作
* 
* 步骤: 
* 1、加载驱动和注册数据库信息。 
* 2、打开Connection,获取PreparedStatement对象。
* 3、通过PreparedStatement执行SQL,返回结果到ResultSet对象。
* 4、使用ResultSet读取数据,然后通过代码转换为具体的POJO对象。 
* 5、关闭数据库相关资源,先开的后关,后开的先关。
*
* @author: liuhongwei
*/
public class JdbcTest {
  private Logger logger = LoggerFactory.getLogger(getClass());
  private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  private static final String URL = "jdbc://mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
  private static final String USERNAME = "root";
  private static final String PASSWORD = "root";

  private Connection getConnection() {
    Connection conn = null;
    try {
      // 加载驱动和注册数据库信息
      Class.forName(JDBC_DRIVER);
      DriverManager.getConnection(URL, USERNAME, PASSWORD);
    } catch (ClassNotFoundException | SQLException e) {
      logger.info("Class={JdbcTest.class.getName()} not found", JdbcTest.class.getName(), e);
    }
    return conn;
  }

  /**
  * 
  * @description: 保存用户信息
  * @param user
  * @return
  */
  public int save(User user) {
    Connection conn = getConnection();
    int row = 0;
    // 5个问号(占位符)代表5个字段预先要保留的值
    String sql = "insert into tb_user (username,password,name,sex,email,tel) values(?,?,?,?,?,?)";
    PreparedStatement ps = null;
    try {
      /**
      * 使用PreparedStatement的优点:
      * 1、具有预编译功能,相同的SQL语句只需要编译一次,提高执行效率。
      * 2、可以防止SQL语句注入,提高安全性
      */
      // 使用PreparedStatement对象里来构建并执行SQL语句
      ps = conn.prepareStatement(sql);
      // 通过PreparedStatement对象里的set方法设置要插入的值
      ps.setString(1, user.getUsername());
      ps.setString(2, user.getPassword());
      ps.setString(3, user.getName());
      ps.setInt(4, user.getSex());
      ps.setString(5, user.getEmail());
      ps.setString(6, user.getTel());
      // 返回影响行数
      row = ps.executeUpdate();
    } catch (SQLException e) {
      logger.info("Bad SQL Grammer", e);
    } finally {
      close(null, ps, conn);
    }
    return row;
  }

  /**
  * 
  * @description: 修改用户信息
  * @param user
  * @return
  */
  public int update(User user) {
    Connection conn = getConnection();
    int row = 0;
    String sql = "update tb_user set password=? where username=?";
    PreparedStatement ps = null;
    try {
      ps = conn.prepareStatement(sql);
      ps.setString(1, user.getPassword());
      ps.setString(2, user.getUsername());
      row = ps.executeUpdate();
    } catch (SQLException e) {
      logger.info("Bad SQL Grammer", e);
    } finally {
      close(null, ps, conn);
    }
    return row;
  }

  /**
  * 
  * @description: 根据id删除用户
  * @param id
  * @return
  */
  public int delete(Long id) {
    Connection conn = getConnection();
    int row = 0;
    String sql = "delete from tb_user where id='" + id + "'";
    PreparedStatement ps = null;
    try {
      ps = conn.prepareStatement(sql);
      row = ps.executeUpdate();
    } catch (SQLException e) {
      logger.info("Bad SQL Grammer", e);
    } finally {
      close(null, ps, conn);
    }
    return row;
  }

  /**
  * 
  * @description: 根据id查询用户信息
  * @param id
  * @return
  */
  public User getAll(Long id) {
    Connection conn = getConnection();
    String sql = "select id,username,password,name,sex,email,tel from tb_user where id = ?";
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      ps = conn.prepareStatement(sql);
      ps.setLong(1, id);
      // 通过PreparedStatement执行Sql,返回结果到ResultSet对象
      rs = ps.executeQuery();
      // 遍历结果集
      while (rs.next()) {
        Long userId = rs.getLong("id");
        String username = rs.getString("username");
        String password = rs.getString("password");
        String name = rs.getString("name");
        Integer sex = rs.getInt("sex");
        String email = rs.getString("email");
        String tel = rs.getString("tel");
        User user = new User();
        user.setId(userId);
        user.setUsername(username);
        user.setPassword(password);
        user.setName(name);
        user.setSex(sex);
        user.setEmail(email);
        user.setTel(tel);
        return user;
      }
    } catch (SQLException e) {
      logger.info("Bad SQL Grammer", e);
    }
    return null;
  }

  /**
  * 
  * @description: 释放资源,注意:先开的后关,后开的先关
  * @param rs
  * @param ps
  * @param conn
  */
  public void close(ResultSet rs, PreparedStatement ps, Connection conn) {
    try {
      if (rs != null && rs.isClosed()) {
        rs.close();
      }
    } catch (SQLException e1) {
      e1.printStackTrace();
    }
    try {
      if (ps != null && ps.isClosed()) {
        ps.close();
    }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      if (conn != null && conn.isClosed()) {
        conn.close();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

猜你喜欢

转载自blog.csdn.net/ydonghao2/article/details/80213660