九、DAO和增删改查通用方法
DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息
作用:为了实现功能的模块化,更有利于代码的维护和升级。
1、DAO接口
package com.atguigu.dao; import com.atguigu.bean.User; public interface UserDAO { /** * 根据用户名和密码获取数据库中的记录 * * @param user * @return User:用户名和密码正确 null:用户名或密码不正确 */ public User getUser(User user); /** * 根据用户名获取数据库中的记录 * * @param user * @return true:用户名已存在, false:用户名可用 */ public boolean checkUserName(User user); /** * 将用户保存到数据库 * * @param user */ public void saveUser(User user); } |
package com.atguigu.dao; import java.util.List; import com.atguigu.bean.Book; public interface BookDAO { /** * 获取所有图书的方法 * * @return */ public List<Book> getBooks(); /** * 添加图书的方法 * * @param book */ public void addBook(Book book); /** * 根据图书的id删除图书的方法 * * @param bookId */ public void deleteBookById(String bookId); /** * 根据图书的id获取图书信息 * * @param bookId * @return */ public Book getBookById(String bookId); /** * 更新图书信息的方法 * * @param book */ public void updateBook(Book book); /** * 批量更新图书的库存和销量 * * @param params */ public void batchUpdateSalesAndStock(Object[][] params); } |
package com.atguigu.dao; import java.util.List; import com.atguigu.bean.Order; public interface OrderDAO { /** * 保存订单的方法 * * @param order */ public void saveOrder(Order order); /** * 获取所用订单的方法 * * @return */ public List<Order> getOrders(); /** * 获取我的订单的方法 * * @param userId * @return */ public List<Order> getMyOrders(int userId); /** * 更新订单的状态的方法,例如已发货、确认收货等 * * @param orderId * @param state */ public void updateOrderState(String orderId, int state); } |
package com.atguigu.dao; import java.util.List; import com.atguigu.bean.OrderItem; public interface OrderItemDAO { /** * 根据订单号获取对应的订单项 * * @param orderId * @return */ public List<OrderItem> getOrderItemsByOrderId(String orderId); /** * 批量插入订单项的方法 * * @param params */ public void batchInsertOrderItems(Object[][] params); } |
2、BasicDAOImpl
package com.atguigu.dao.impl; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import com.atguigu.util.JDBCTools; /** * 定义一个用来被继承的对数据库进行基本操作的Dao */ public class BasicDAOImpl { private QueryRunner queryRunner = new QueryRunner(); /** * 通用的增删改操作 * * @param sql * @param params * @return */ public int update(String sql, Object... params) { // 获取连接 Connection connection = JDBCTools.getConnection(); int count = 0; try { count = queryRunner.update(connection, sql, params); } catch (SQLException e) { //将编译时异常转换为运行时异常向上抛 throw new RuntimeException(e); } return count; } /** * 获取一个对象 * * @param sql * @param params * @return */ public <T> T getBean(Class<T> type,String sql, Object... params) { // 获取连接 Connection connection = JDBCTools.getConnection(); T t = null; try { t = queryRunner.query(connection, sql, new BeanHandler<T>(type), params); } catch (SQLException e) { //将编译时异常转换为运行时异常向上抛 throw new RuntimeException(e); } return t; } /** * 获取所有对象 * * @param sql * @param params * @return */ public <T> List<T> getBeanList(Class<T> type,String sql, Object... params) { // 获取连接 Connection connection = JDBCTools.getConnection(); List<T> list = null; try { list = queryRunner.query(connection, sql, new BeanListHandler<T>(type), params); } catch (SQLException e) { //将编译时异常转换为运行时异常向上抛 throw new RuntimeException(e); } return list; } /** * 获取一个单一值的方法,专门用来执行像select count(*)... 这样的sql语句 * * @param sql * @param params * @return */ public Object getSingleValue(String sql, Object... params) { // 获取连接 Connection connection = JDBCTools.getConnection(); Object value = null; try { value = queryRunner.query(connection, sql, new ScalarHandler(), params); } catch (SQLException e) { //将编译时异常转换为运行时异常向上抛 throw new RuntimeException(e); } return value; } /** * 进行批处理的方法 * 关于二维数组Object[][] params * 二维数组的第一维是sql语句要执行的次数 * 二维数组的第二维就是每条sql语句中要填充的占位符 * * @param sql * @param params */ public void batchUpdate(String sql , Object[][] params){ //获取连接 Connection connection = JDBCTools.getConnection(); try { queryRunner.batch(connection ,sql, params); } catch (SQLException e) { //将编译时异常转换为运行时异常向上抛 throw new RuntimeException(e); } } } |
3、DAO实现类
package com.atguigu.dao.impl; import com.atguigu.bean.User; import com.atguigu.dao.UserDAO; public class UserDAOImpl extends BasicDAOImpl implements UserDAO{ @Override public User getUser(User user) { // 写查询数据库的sql语句 String sql = "select id , username , password , email from users where username = ? and password = ?"; // 调用BaseDao中的getBean方法 User bean = getBean(User.class, sql, user.getUsername(), user.getPassword()); return bean; } @Override public boolean checkUserName(User user) { // 写查询数据库的sql语句 String sql = "select id , username , password , email from users where username = ?"; // 调用BaseDao中的getBean方法 User bean = getBean(User.class, sql, user.getUsername()); return bean!=null;//不为空,说明已存在,返回true,如果bEan是空的,没找到,bean!=null返回false,说明不存在 } @Override public void saveUser(User user) { //写添加数据到数据库的sql语句 String sql = "insert into users(username,password,email) values(?,?,?)"; //调用BaseDao中通用的增删改的方法 update(sql, user.getUsername(),user.getPassword(),user.getEmail()); } } |
十、案例:
一、向customers表中插入数据,效果如下:
请输入编号:55
请输入姓名:上官红
请输入邮箱:shangguan@126.com
请输入生日(要求按xxxx-xx-xx格式):1988-11-11
插入成功!
二、修改指定客户
请输入待修改的客户编号:3
请输入新的客户姓名:林小玲
修改成功!
三、查询所有客户信息
四、根据编号,查询客户的详细信息,效果如下:
请输入编号:1
---------------------------------------------------------------------------------
编号 姓名 邮箱 生日
1 汪峰 wf@126.com 2010-2-2
五、根据姓名,查询客户的详细信息,效果如下:
请输入姓名:王菲
---------------------------------------------------------------------------------
查无此人