通过接口对数据库的增删改查进行代码改良:
第一步是创建代码与数据库进行的一系列连接:
package com.jdbc.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtil {
private static String driver;
private static String url;
private static String username;
private static String password;
static {
//创建properties对象,获取属性文件的内容
Properties p=new Properties();
//动态获取属性文件的读取流对象,,防止jdbc.properties移动位置找不到该文件
//其中JdbcUtil.class.getResourceAsStream动态定位到项目的bin文件
InputStream is=JdbcUtil.class.getResourceAsStream("/jdbc.properties");
try{
//加载属性配置文件
p.load(is);
//获取jdbc参数
driver=p.getProperty("driver");
url=p.getProperty("url");
username=p.getProperty("username");
password=p.getProperty("password");
//加载驱动,以便后续调用Connection方法
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取Connection对象
public static Connection getConnection() {
Connection conn=null;
try {
conn= DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//封装获取PreparedStatement对象
public static PreparedStatement getPreparedStatement(Connection conn,String sql) {
PreparedStatement ps=null;
try {
//由于一些时候我们需要设置手动提交及回滚,所以此处一般不要写成ps=getConnection().prepareStatement(sql);
ps=conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
//封装获取Statement对象
public static Statement getStatement(Connection conn) {
Statement stmt=null;
try {
stmt=conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
}
//关闭资源
//由于PreparedStatement是Statement的子对象,所以只创建stmt参数即可
public static void closeAll(ResultSet rs,Statement stmt,Connection conn) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
try{
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stmt,Connection conn) {
try{
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//封装DML,由于不确定sql中含有待传入的实参,因此采用可变参数
public static int executeDML(String sql,Object...objs) {
Connection conn=getConnection();
PreparedStatement ps=JdbcUtil.getPreparedStatement(conn,sql);
int i=-1;
try {
conn.setAutoCommit(false);
for (int j=0;j<objs.length;j++) {
//给占位符赋值
ps.setObject(j+1,objs[j]);
}
//执行sql命令
i=ps.executeUpdate();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
//关闭资源
JdbcUtil.close(ps, conn);
return i;
}
}
}
第二步是创建sql语句的相关操作:
package com.jdbc.dao;
import com.jdbc.pojo.User;
import java.util.ArrayList;
public interface UserDao {
//查询所有账户信息
public ArrayList<User> selAllUserInfo();
//根据id查询账户信息
public User selUserById(int id);
//添加账户信息
public int insUser(int id,String name,String password);
//修改账户信息
public int upUser(String newName,int id);
//删除账户信息
public int delUser(String name);
}
package com.jdbc.DaoImpl;
import com.jdbc.dao.UserDao;
import com.jdbc.pojo.User;
import com.jdbc.util.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class UserDaoImpl implements UserDao {
//查询所有用户信息
public ArrayList<User> selAllUserInfo() {
//声明Jdbc对象
Connection conn=null;
PreparedStatement ps = null;
ResultSet rs=null;
//声明集合对象
ArrayList<User> list=null;
try {
//获取连接对象
conn= JdbcUtil.getConnection();
//创建sql命令
String sql="select * from data";
//创建sql命令对象
ps=JdbcUtil.getPreparedStatement(conn,sql);
//执行sql
rs=ps.executeQuery();
list=new ArrayList<>();
//遍历查询结果
while (rs.next()) {
User u=new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
list.add(u);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭资源
JdbcUtil.closeAll(rs,ps,conn);
}
//返回结果
return list;
}
//根据id查询用户信息
public User selUserById(int id) {
//声明JDBC变量
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
//声明User对象
User u=null;
try {
//获取连接对象
conn=JdbcUtil.getConnection();
//创建sql命令
String sql="select * from data where id=?";
//获取sql命令对象
ps=JdbcUtil.getPreparedStatement(conn,sql);
//给占位符赋值
ps.setInt(1,id);
//执行sql
rs=ps.executeQuery();
//遍历结果
while (rs.next()) {
u=new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JdbcUtil.closeAll(rs,ps,conn);
}
//返回结果
return u;
}
//添加用户信息
public int insUser(int id,String name,String password) {
//创建sql语句
String sql="insert into data values(?,?,?)";
int i=JdbcUtil.executeDML(sql,id,name,password);
return i;
}
//修改用户信息
public int upUser(String newPassword,String name) {
return JdbcUtil.executeDML("update data set password=? where name=?",newPassword,name);
}
//删除用户信息
public int delUser(String name) {
return JdbcUtil.executeDML("delete from data where name=?",name);
}
}
第三步是进行业务具体操作:
package com.jdbc.service;
public interface UserService {
//查询全部账户信息
public void selAllUserInfo();
//根据id查询用户信息
public void selUserInfoById();
//添加用户信息
public void insUserInfo();
//删除用户信息
public void delUserInfo();
//更新用户信息
public void upUserInfo();
}
package com.jdbc.serviceImpl;
import com.jdbc.DaoImpl.UserDaoImpl;
import com.jdbc.dao.UserDao;
import com.jdbc.pojo.User;
import com.jdbc.service.UserService;
import java.util.ArrayList;
import java.util.Scanner;
public class serviceImpl implements UserService {
//声明数据库层对象
UserDao user=new UserDaoImpl();
//查询全部账户信息
public void selAllUserInfo() {
ArrayList<User> list=user.selAllUserInfo();
System.out.println("id\tname\tpassword");
for (int i=0;i<list.size();i++) {
User u=list.get(i);
System.out.println(u.getId()+"\t"+u.getName()+"\t"+u.getPassword());
}
}
//根据id查询用户信息
public void selUserInfoById() {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要查询的员工编号:");
int id=sc.nextInt();
User u=user.selUserById(id);
if (u!=null) {
System.out.println("id\tname\tpassword");
System.out.println(u.getId()+"\t"+u.getName()+"\t"+u.getPassword());
} else {
System.out.println("查无此人");
}
}
//添加用户信息
public void insUserInfo() {
//获取用户数据
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户编号");
int id=sc.nextInt();
System.out.println("请输入用户名");
String name=sc.next();
System.out.println("请输入用户密码");
String password=sc.next();
//调用数据库操作数据库
//创建数据库层对象
int i=user.insUser(id,name,password);
if (i>0) {
System.out.println("注册成功");
} else {
System.out.println("注册失败");
}
}
//删除用户信息
public void delUserInfo(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入需删除的用户名:");
String name=sc.next();
int i=user.delUser(name);
if (i>0) {
System.out.println("注销成功");
} else {
System.out.println("注销失败");
}
}
//更新用户密码
public void upUserInfo() {
//获取用户数据
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名");
String name=sc.next();
System.out.println("请输入用户新的密码");
String newPassword=sc.next();
//调用数据库操作数据库
//创建数据库层对象
int i=user.upUser(newPassword,name);
if (i>0) {
System.out.println("更新成功");
} else {
System.out.println("更新失败");
}
}
}
第四步是声明类用户(其实这个步骤应该放在最前面的,但是本次学习的重点是第二步和第三步吖)
package com.jdbc.test;
import com.jdbc.service.UserService;
import com.jdbc.serviceImpl.serviceImpl;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
UserService es=new serviceImpl();
do{
System.out.println("1. 查询所有账户信息");
System.out.println("2. 根据编号查询账户信息");
System.out.println("3. 新增用户信息");
System.out.println("4. 修改用户密码");
System.out.println("5. 注销用户信息");
System.out.println("6. 退出系统");
Scanner sc=new Scanner(System.in);
int ch=sc.nextInt();
switch (ch) {
case 1:
es.selAllUserInfo();break;
case 2:
es.selUserInfoById();break;
case 3:
es.insUserInfo();break;
case 4:
es.upUserInfo();break;
case 5:
es.delUserInfo();break;
case 6:
System.out.println("谢谢使用");return;
default:
System.out.println("输入有误,请重新输入。");
break;
}
} while (true);
}
}