学习目标:
1、巩固面向对象的知识
2、巩固JDBC的使用
学习过程:
一、封装BaseDao类
昨天我们学习了JDBC连接和操作数据库,按照连接几个基本步骤操作就可以了,但是昨天我们写的代码有很多的冗余,大家可以看看,添加、删除和更新用户等等几个方法,几乎除了sql语句不同之外,其他都是一样的,这样可不是很符合我们面向对象的思想,我们已经适当封装一下,使代码更加简洁。
事实上我们可以封装一个BaseDao方法,把数据库操作的几个基本过程封装为几个独立的方法,把所有数据库操作类的共有属性抽象出来,然后数据库操作类都继承这个BaseDao类即可。
BaseDao实现代码如下:
public class BaseDao {
private String driver = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://192.168.11.144/first?useUnicode=true&characterEncoding=utf8";
private String dbusername = "root";
private String dbpass = "123456";
// 抽象公共类对象
protected Connection connection;
protected Statement statement;
protected PreparedStatement preparedStatement;
protected ResultSet resultSet;
// 建立连接
public Connection getCon() throws ClassNotFoundException, SQLException {
// 1、通过反射加载驱动。
Class.forName(driver);
// 2、通过驱动管理类建立一个连接 不同数据url写法是不同 ip端口 数据
connection = DriverManager.getConnection(url, dbusername, dbpass);
return connection;
}
// 设置sql和preparedStatement参数
public void preExe(String sql, Object[] params) throws SQLException {
// Prepared Statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i + 1, params[i]);
}
}
}
// 释放资源
public void closeAll() {
try {
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二、应用BaseDao类
应用这个BaseDao类也是非常简单,修改昨天UserDao的实现。部分代码如下:
public class UserDao extends BaseDao {
public int addUser(String userName, String userPass) {
int result = 0;
try {
// 1、建立连接
getCon();
// 2、设置sql和preparedStatement参数
String sql = "insert into tb_user(user_name,user_pass) values(?,?)";
preExe(sql, new Object[] { userName, userPass });
result = preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return result;
}
// 根据用户id删除数据
public int delUser(String uid) {
int result = 0;
try {
// 1、建立连接
getCon();
// 2、设置sql和preparedStatement参数
String sql = "delete from tb_user where user_id=" + uid;
preExe(sql, new Object[] { uid });
result = preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return result;
}
// 根据用户id,更新用户名称
public int updateUser(int uid, String userName) {
int result = 0;
try {
// 1、建立连接
getCon();
// 2、设置sql和preparedStatement参数
String sql = "update tb_user set user_name=? where user_id=?";
preExe(sql, new Object[] { userName, uid });
result = preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return result;
}
// 查询全部
public List<User> getAllUser() {
List<User> users = new ArrayList<User>();
try {
// 1、建立连接
getCon();
String sql = "select * from tb_user";
preExe(sql, null);
resultSet = preparedStatement.executeQuery();
// next 判断有没有下一行,rs指向下一行的位置
while (resultSet.next()) {
// System.out.println(rs.getInt("user_id")+":"+rs.getString("user_name"));
User user = new User();
user.setUserId(resultSet.getInt("user_id"));
user.setUserName(resultSet.getString("user_name"));
users.add(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return users;
}
public static void main(String[] args) {
UserDao userDao = new UserDao();
int result = userDao.addUser("张三", "123456");
if (result > 0) {
System.out.println("成功了。");
} else {
System.out.println("失败了。");
}
}
}