1、什么是JDBC
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,是用Java语言编写的类和接口组成的,可以为多种关系型数据库提供统一访问的接口。JDBC提供了一种基准,说白了,也就是sun公司为各大数据库厂商的关系型数据库连接java所制定的规范,因此他们只需要实现JDBC的接口规范即可,而具体的实现是由各大数据库厂商去实现的,由于每种数据库的独特性,Java是无法控制的,所以JDBC是一种典型的桥接模式。我们据此也可以构建更高级的工具和接口,比如封装常用的CRUD工具类,使数据库开发人员能够更快速、高效、简便的开发数据库应用程序。
- 从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。
- 从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便。
- 从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用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();
}
}
}