# ubuntu
## DBUtils 基本介紹
commons-dbutils是Apache組織提供的一個開源JDBC工具類庫射富,它是對JDBC的簡單封裝羊始。簡化了jdbc編碼的工作量
## 地址
![image-20201217194115785](ubuntu.assets/image-20201217194115785.png)
## **代碼**
update()方法可用于Insert桥滨、update、delete
```java
public class JDBCTest06 {
? ? // 刪除delete
? ? public JDBCTest06() throws SQLException {
? ? ? ? // 1. 創(chuàng)建QueryRunner 的實現類
? ? ? ? QueryRunner queryRunner = new QueryRunner();
? ? ? ? // 2. 使用其update 方法
? ? ? ? String sql = "DELETE FROM customers " + "WHERE id IN(?,>)";
? ? ? ? DataSource dataSource = new ComboPooledDataSource("helloc3p0");
? ? ? ? // 3. 在連接池獲取連接
? ? ? ? Connection connection =? dataSource.getConnection();
? ? ? ? queryRunner.update(connection,sql,12,13); // update方法可用于刪除勒叠、更新、添加
? ? ? ? connection.close();
? ? }
}
```
通過實現ResultSetHandler接口實現查詢
創(chuàng)建 ResultSetHandler接口 的實現類与倡,實現handle方法狈茉,queryRunner.query()的返回值取決于handle的返回值
```java
public class DBUtilsTest {
? ? QueryRunner queryRunner = new QueryRunner();
? ? // 1. 創(chuàng)建 ResultSetHandler接口 的實現類刁卜,實現handle方法,queryRunner.query()的返回值取決于handle的返回值
? ? class MyResultSetHandler implements ResultSetHandler{
? ? ? ? @Override
? ? ? ? public Object handle(ResultSet rs) throws SQLException {
? ? ? ? ? ? List<Customer> customers = new ArrayList<>();
? ? ? ? ? ? while (rs.next()){
? ? ? ? ? ? ? ? Integer id = rs.getInt(1);
? ? ? ? ? ? ? ? String name = rs.getString(2);
? ? ? ? ? ? ? ? String email = rs.getString(3);
? ? ? ? ? ? ? ? Date birth = rs.getDate(4);
? ? ? ? ? ? ? ? Customer customer = new Customer(id,name,email,birth);
? ? ? ? ? ? ? ? customers.add(customer);
? ? ? ? ? ? }
? ? ? ? ? ? return customers;
? ? ? ? }
? ? }
? ? public void testQuery() throws SQLException {
? ? ? ? Connection connection = null;
? ? ? ? String sql = "select id,name,email,birth" + "from customers";
? ? ? ? Object object = queryRunner.query(connection, sql, new MyResultSetHandler());
? ? ? ? System.out.println(object);
? ? ? ? connection.close();
? ? }
}
```
queryRunner.query()源碼分析
```csharp
//1. QueryRunner 類的query()方法
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
? ? ? ? return this.<T>query(conn, false, sql, rsh, params);// 返回值是調用當前的類query的重載方法
? ? }
// 2.當前的類query的重載方法
private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params)
? ? ? ? ? ? throws SQLException {? ? ? ?
? ? ? ? PreparedStatement stmt = null;
? ? ? ? ResultSet rs = null;
? ? ? ? T result = null;
? ? ? ? try {
? ? ? ? ? ? stmt = this.prepareStatement(conn, sql);
? ? ? ? ? ? this.fillStatement(stmt, params);
? ? ? ? ? ? rs = this.wrap(stmt.executeQuery()); // wrap() 返回的是ResultSet
? ? ? ? ? ? result = rsh.handle(rs); //? handle()是ResultSetHandler接口定義的方法
? ? ? ? } catch (SQLException e) {
? ? ? ? ? ? this.rethrow(e, sql, params);
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? close(rs);
? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? close(stmt);
? ? ? ? ? ? ? ? if (closeConn) {
? ? ? ? ? ? ? ? ? ? close(conn);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result;
? ? }
```
通過BeanHandler類實現查詢
把結果集的第一條記錄轉為創(chuàng)建BeanHandler對象時傳入的class參數對應的對象
```java
? ? public void testBeanHandler() throws SQLException {
? ? ? ? QueryRunner queryRunner = new QueryRunner();
? ? ? ? Connection connection = null;
? ? ? ? String sql = "select id,name,email,birth" + "from customers where id >= ?";
? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);
? ? ? ? System.out.println(object);
? ? ? ? connection.close();
? ? }
```
通過BeanListHandler類實現查詢
把結果集轉為一個List,該List不為null韩玩,但可能為空集合(size()方法返回為0)杨箭,若SQL語句有查詢記錄牺陶,List中存放創(chuàng)建BeanListHandler轉入Class對象對應的對象
```java
? ? public void testBeanListHandler() throws SQLException {
? ? ? ? QueryRunner queryRunner = new QueryRunner();
? ? ? ? Connection connection = null;
? ? ? ? String sql = "select id,name,email,birth" + "from customers";
? ? ? ? List<Customer> customers = queryRunner.query(connection,sql,new BeanListHandler<Customer>(Customer.class));
? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);
? ? ? ? System.out.println(object);
? ? ? ? connection.close();
? ? }
```
通過MapHandler類實現查詢
返回SQL對應的第一條記錄對應的Map對象,鍵值對:鍵SQL查詢的列名(不是別名)掰伸,列的值
```dart
public void testMapHandler() throws SQLException {
? ? ? ? QueryRunner queryRunner = new QueryRunner();
? ? ? ? Connection connection = null;
? ? ? ? String sql = "select id,name,email,birth" + "from customers";
? ? ? ? Map<String,Object> customers = queryRunner.query(connection,sql,new MapHandler());
? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);
? ? ? ? System.out.println(object);
? ? ? ? connection.close();
? ? }
```
通過MapListHandler類實現查詢
將結果集轉為一個Map的List皱炉,Map對應查詢的一條記錄:鍵值堆:鍵SQL查詢的列名(不是列的別名),值:列的值狮鸭,而MapListHandler:返回的多條記錄對應的Map的集合
```dart
? ? public void testMapListHandler() throws SQLException {
? ? ? ? QueryRunner queryRunner = new QueryRunner();
? ? ? ? Connection connection = null;
? ? ? ? String sql = "select id,name,email,birth" + "from customers";
? ? ? ? List<Map<String,Object>> result = queryRunner.query(connection,sql,new MapListHandler());
? ? ? ? Object object = queryRunner.query(connection, sql, new BeanHandler(Customer.class),5);
? ? ? ? System.out.println(object);
? ? ? ? connection.close();
? ? }
```
ScalarHandler:把結果集轉為一個數值(可以是任意基本數據類型和字符串娃承,Date等)返回
```dart
public void ScalarHandler() throws SQLException {
? ? ? ? QueryRunner queryRunner = new QueryRunner();
? ? ? ? Connection connection = null;
? ? ? ? String sql = "select name" + "from customers"; // 如果是兩列的情況返回一列
? ? ? ? List<Map<String,Object>> result = queryRunner.query(connection,sql,new MapListHandler());
? ? ? ? Object object = queryRunner.query(connection, sql, new ScalarHandler<>(),5);
? ? ? ? System.out.println(object);
? ? ? ? connection.close();
? ? }
```
## 做的完善的欣知商城
entity
```Java
package com.xinzhi.entity;
import com.xinzhi.Cart;
/**
* @author 楊智超
* @date 2020/12/17
*/
public class User {
? ? private int id;
? ? //用戶名
? ? private String userName;
? ? //密碼
? ? private String passWord;
? ? //地址
? ? private String site;
? ? //余額
? ? private double balance;
? ? private Cart cart = new Cart();
? ? public String getUserName() {
? ? ? ? return userName;
? ? }
? ? public void setUserName(String userName) {
? ? ? ? this.userName = userName;
? ? }
? ? public String getPassWord() {
? ? ? ? return passWord;
? ? }
? ? public void setPassWord(String passWord) {
? ? ? ? this.passWord = passWord;
? ? }
? ? public String getSite() {
? ? ? ? return site;
? ? }
? ? public void setSite(String site) {
? ? ? ? this.site = site;
? ? }
? ? public double getBalance() {
? ? ? ? return balance;
? ? }
? ? public void setBalance(double balance) {
? ? ? ? this.balance = balance;
? ? }
? ? public Cart getCart() {
? ? ? ? return cart;
? ? }
? ? public void setCart(Cart cart) {
? ? ? ? this.cart = cart;
? ? }
? ? public int getId() {
? ? ? ? return id;
? ? }
? ? public void setId(int id) {
? ? ? ? this.id = id;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return "User{" +
? ? ? ? ? ? ? ? "id=" + id +
? ? ? ? ? ? ? ? ", userName='" + userName + '\'' +
? ? ? ? ? ? ? ? ", passWord='" + passWord + '\'' +
? ? ? ? ? ? ? ? ", site='" + site + '\'' +
? ? ? ? ? ? ? ? ", balance=" + balance +
? ? ? ? ? ? ? ? ", cart=" + cart +
? ? ? ? ? ? ? ? '}';
? ? }
}
```
service
```Java
package com.xinzhi.service;
import com.xinzhi.Order;
import com.xinzhi.dao.impl.FileUserDaoImpl;
import com.xinzhi.dao.impl.MysqlUserDaoImpl;
import com.xinzhi.entity.User;
import com.xinzhi.dao.UserDao;
import com.xinzhi.util.ScannerUtil;
import java.util.List;
/**
* @author 楊智超
* @date 2020/12/17
*/
public class UserService {
? ? UserDao userDao = new MysqlUserDaoImpl();
? ? public boolean longin(User user2){
? ? ? ? System.out.print("請輸入用戶名:");
? ? ? ? String userName = ScannerUtil.getInput();
? ? ? ? System.out.println();
? ? ? ? System.out.print("請輸入密碼:");
? ? ? ? String passWord = ScannerUtil.getInput();
? ? ? ? User user = userDao.getUsersByName(userName);
? ? ? ? if (!userName.equals(user.getUserName())){
? ? ? ? ? ? System.out.println("用戶不存在,登錄失敗");
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? if (!passWord.equals(user.getPassWord())){
? ? ? ? ? ? System.out.println("密碼不對怕篷,登錄失敗");
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? user2.setUserName(userName);
? ? ? ? user2.setPassWord(passWord);
? ? ? ? System.out.println("登錄成功歡迎" + user2.getUserName() +"用戶的到來历筝,祝您有個好的購物心情!");
? ? ? ? return true;
? ? }
? ? public boolean regist(){
? ? ? ? System.out.print("請輸入用戶名:");
? ? ? ? String userName = ScannerUtil.getInput();
? ? ? ? System.out.println();
? ? ? ? System.out.print("請輸入密碼:");
? ? ? ? String passWord = ScannerUtil.getInput();
? ? ? ? System.out.println();
? ? ? ? System.out.println("請輸入您的收貨地址:");
? ? ? ? String site = ScannerUtil.getInput();
? ? ? ? User user = new User();
? ? ? ? //創(chuàng)建用戶
? ? ? ? user.setUserName(userName);
? ? ? ? user.setPassWord(passWord);
? ? ? ? user.setSite(site);
? ? ? ? user.setBalance(0);
? ? ? ? userDao.saveUser(user,true);
? ? ? ? System.out.println("注冊成功");
? ? ? ? return true;
? ? }
? ? //查看購物車
? ? public void lookAtCart(User user){
? ? ? ? List<Order> cartMessage = user.getCart().getCartMessage();
? ? ? ? System.out.println("以下為購物車:");
? ? ? ? for (int i = 0; i < cartMessage.size(); i++) {
? ? ? ? ? ? System.out.println((i+1) + ":" +
? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getGoodsName() + "\t" +
? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getGoodsPrice() + "\t" +
? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getGoodsCount() + "\t" +
? ? ? ? ? ? ? ? ? ? cartMessage.get(i).getTotalMoney() + "\t"
? ? ? ? ? ? );
? ? ? ? }
? ? ? ? System.out.println("--------------------------------\n");
? ? }
? ? //結賬
? ? public void pay(User user2) {
? ? ? ? List<Order> cartMessage = user2.getCart().getCartMessage();
? ? ? ? double cartTotalMoney = 0;
? ? ? ? for (Order order : cartMessage) {
? ? ? ? ? ? cartTotalMoney += order.getTotalMoney();
? ? ? ? }
? ? ? ? User user = userDao.getUsersByName(user2.getUserName());
? ? ? ? if (user.getBalance() >= cartTotalMoney){
? ? ? ? ? ? double balance = user.getBalance() - cartTotalMoney;
? ? ? ? ? ? userDao.updateBalance(user2.getUserName(),balance);
? ? ? ? ? ? user.getCart().clear();
? ? ? ? ? ? System.out.println("支付成功");
? ? ? ? ? ? System.out.println("本次支付:" + cartTotalMoney + "廊谓,您的余額剩余:" + balance + "元");
? ? ? ? }else {
? ? ? ? ? ? System.out.println("余額不足梳猪,請在充值");
? ? ? ? }
? ? }
? ? //查看用戶信息
? ? public void userManger(User user2){
? ? ? ? User user = userDao.getUsersByName(user2.getUserName());
? ? ? ? System.out.println("用戶名:" + user.getUserName());
? ? ? ? System.out.println("剩余金額:" + user.getBalance());
? ? }
? ? //充值
? ? public void showUserManger(User user2){
? ? ? ? User user = userDao.getUsersByName(user2.getUserName());
? ? ? ? System.out.println("當前余額:" + user.getBalance() + "元");
? ? ? ? System.out.println("請輸入要充值的金額");
? ? ? ? String input = ScannerUtil.getInput();
? ? ? ? double newBalance = user.getBalance() + Double.parseDouble(input);
? ? ? ? userDao.updateBalance(user.getUserName(),newBalance);
? ? ? ? System.out.println("剩余金額:" + newBalance + "元。");
? ? }
? ? public boolean addGoodsToCart(String id, int goodCount,User user){
? ? ? ? user.getCart().addGoods(id, goodCount);
? ? ? ? return true;
? ? }
}
```
dao
![image-20201217194319164](ubuntu.assets/image-20201217194319164.png)
UserDao接口
```Java
package com.xinzhi.dao;
import com.xinzhi.Constant;
import com.xinzhi.entity.User;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author 楊智超
* @date 2020/12/17
*/
public interface UserDao {
? ? /**
? ? * 獲取所有USER
? ? * @param url
? ? * @return
? ? */
? ? List<User> getAllUsers(String url);
? ? /**
? ? * 修改價格
? ? * @param name
? ? * @return
? ? */
? ? User getUsersByName(String name);
? ? /**
? ? *? 修改余額
? ? * @param userName
? ? * @param newBalance
? ? */
? ? void updateBalance(String userName,double newBalance);
? ? /**
? ? *? 保存數據
? ? * @param user
? ? * @param append
? ? * @return
? ? */
? ? boolean saveUser(User user,boolean append);
}
```
FileUserDaoImpl
```Java
package com.xinzhi.dao.impl;
import com.xinzhi.Constant;
import com.xinzhi.dao.UserDao;
import com.xinzhi.entity.User;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author 楊智超
* @date 2020/12/17
*/
public class FileUserDaoImpl implements UserDao {
? ? @Override
? ? public List<User> getAllUsers(String url){
? ? ? ? List<User> users = new ArrayList<>();
? ? ? ? try (FileReader fs = new FileReader(url);
? ? ? ? ? ? BufferedReader bf = new BufferedReader(fs)){
? ? ? ? ? ? String userStr = null;
? ? ? ? ? ? while ((userStr = bf.readLine()) != null) {
? ? ? ? ? ? ? ? String[] str = userStr.split("---");
? ? ? ? ? ? ? ? User user = new User();
? ? ? ? ? ? ? ? user.setUserName(str[0]);
? ? ? ? ? ? ? ? user.setPassWord(str[1]);
? ? ? ? ? ? ? ? users.add(user);
? ? ? ? ? ? }
? ? ? ? }catch (IOException ex){
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? }
? ? ? ? return users;
? ? }
? ? @Override
? ? public User getUsersByName(String name) {
? ? ? ? List<User> users = getAllUsers(Constant.BASE_PATH);
? ? ? ? for (User user : users) {
? ? ? ? ? ? if (user.getUserName().equals(name)) {
? ? ? ? ? ? ? ? return user;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return null;
? ? }
? ? @Override
? ? //修改余額
? ? public void updateBalance(String userName,double newBalance){
? ? ? ? List<User> allUsers = getAllUsers(Constant.BASE_PATH);
? ? ? ? if (userName == null){
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? for (int i = 0; i < allUsers.size(); i++) {
? ? ? ? ? ? if (userName.equals(allUsers.get(i).getUserName())){
? ? ? ? ? ? ? ? allUsers.get(i).setBalance(newBalance);
? ? ? ? ? ? }
? ? ? ? ? ? if (i == 0){
? ? ? ? ? ? ? ? saveUser(allUsers.get(i),false);
? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? saveUser(allUsers.get(i),true);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? @Override
? ? //保存數據
? ? public boolean saveUser(User user,boolean append){
? ? ? ? FileWriter fw = null;
? ? ? ? BufferedWriter bw = null;
? ? ? ? try {
? ? ? ? ? ? fw = new FileWriter(Constant.BASE_PATH,true);
? ? ? ? ? ? bw = new BufferedWriter(fw);
? ? ? ? ? ? bw.append(user.getUserName()).append("---").append(user.getPassWord()).append("---").append(user.getSite());
? ? ? ? ? ? bw.newLine();
? ? ? ? ? ? bw.flush();
? ? ? ? }catch (IOException ex){
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? }finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (bw != null) {
? ? ? ? ? ? ? ? ? ? bw.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (fw != null) {
? ? ? ? ? ? ? ? ? ? fw.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }catch (IOException ex){
? ? ? ? ? ? ? ? ex.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return true;
? ? }
}
```
MysqlUserDaoImpl
```Java
package com.xinzhi.dao.impl;
import com.xinzhi.dao.UserDao;
import com.xinzhi.entity.User;
import com.xinzhi.util.PollUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @author 楊智超
* @date 2020/12/17
*/
public class MysqlUserDaoImpl implements UserDao {
? ? ResultSetHandler<User> userHandler = new ResultSetHandler<User>() {
? ? ? ? @Override
? ? ? ? public User handle(ResultSet resultSet) throws SQLException {
? ? ? ? ? ? User user = new User();
? ? ? ? ? ? resultSet.next();
? ? ? ? ? ? user.setId(resultSet.getInt("id"));
? ? ? ? ? ? user.setUserName(resultSet.getString("name"));
? ? ? ? ? ? user.setPassWord(resultSet.getString("password"));
? ? ? ? ? ? user.setSite(resultSet.getString("site"));
? ? ? ? ? ? return null;
? ? ? ? }
? ? };
? ? ResultSetHandler<List<User>> userListHandler = new ResultSetHandler<List<User>>() {
? ? ? ? @Override
? ? ? ? public List<User> handle(ResultSet resultSet) throws SQLException {
? ? ? ? ? ? List<User> users = new ArrayList<>();
? ? ? ? ? ? while (resultSet.next()) {
? ? ? ? ? ? ? ? User user = new User();
? ? ? ? ? ? ? ? user.setId(resultSet.getInt("id"));
? ? ? ? ? ? ? ? user.setUserName(resultSet.getString("name"));
? ? ? ? ? ? ? ? user.setPassWord(resultSet.getString("password"));
? ? ? ? ? ? ? ? user.setSite(resultSet.getString("site"));
? ? ? ? ? ? ? ? users.add(user);
? ? ? ? ? ? }
? ? ? ? ? ? return users;
? ? ? ? }
? ? };
? ? @Override
? ? public List<User> getAllUsers(String url) {
? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());
? ? ? ? List<User> users = null;
? ? ? ? try {
? ? ? ? ? ? users = runner.query("select * from comsumer",userListHandler);
? ? ? ? } catch (SQLException throwables) {
? ? ? ? ? ? throwables.printStackTrace();
? ? ? ? }
? ? ? ? return users;
? ? }
? ? @Override
? ? public User getUsersByName(String name) {
? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());
? ? ? ? User user = null;
? ? ? ? try {
? ? ? ? ? ? user = (User) runner.query("select * from comsumer where name=?",userListHandler,name);
? ? ? ? } catch (SQLException throwables) {
? ? ? ? ? ? throwables.printStackTrace();
? ? ? ? }
? ? ? ? return user;
? ? }
? ? @Override
? ? public void updateBalance(String userName, double newBalance) {
? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());
? ? ? ? try {
? ? ? ? ? ? runner.update("update consumer set site=? where name=?",newBalance,userName);
? ? ? ? } catch (SQLException throwables) {
? ? ? ? ? ? throwables.printStackTrace();
? ? ? ? }
? ? }
? ? @Override
? ? public boolean saveUser(User user, boolean append) {
? ? ? ? QueryRunner runner = new QueryRunner(PollUtil.getDataSource());
? ? ? ? int rowd = 0;
? ? ? ? try {
? ? ? ? ? rowd = runner.update("insert into consumer (name,password,site) values(?,?,?)",user.getId(),user.getUserName(),user.getPassWord(),user.getSite());
? ? ? ? } catch (SQLException throwables) {
? ? ? ? ? ? throwables.printStackTrace();
? ? ? ? }
? ? ? ? return rowd > 0;
? ? }
}
```