页面一:
package com.oracle.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
*
* DBTools: database 数据库 工具类
*
* @author Administrator
*
* 理解封装的好处
*
*/
public class DBTools {
//将 三个参数 提取出去 作为全局 静态 常量 变量
private static final String URL = "jdbc:mysql://localhost:3306/java18?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
//java 中 什么 只执行一次
//静态块儿
static{
try {
//类 加载时 只运行 一次
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
//最终的目的就是 获取 Connection 设计 个方法 来 获取 连接
//封装 通过这个 方法 获取 Connection 对象
public static Connection getConnection(){
Connection conn = null;//初始化一个 Connection
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//资源的关闭 关闭 资源 不需要 返回值
// 关闭 什么呢 ? Connection , Statement , ResultSet 所以 要当作 入参传入进来
public static void close(Connection conn,Statement stat,ResultSet rs){
//在方法入参 的地方 定义 形参 ,
try {
if(null != rs){ // 这样写 不会出现 空指针异常
rs.close();
}
if(null != stat){
stat.close();
}
if(null != conn){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
页面二:
package com.oracle.entity;
/**
* 类名 尽量不要使用 t_user
* 导致 你的数据库表 名 要规范 user
*
* @author Administrator
*
* 1.将数据库表 和 java 实体进行 映射 User
* 2.数据库表中的字段 和 java实体中的 属性 一致
*/
public class User {
//数据库表中的字段 和 java实体中的 属性 一致
private Integer id;
private String uname;
private String password;
//无参数
public User(){}
//也可以添加 构造方法 / 构造函数 看你心情
public User(Integer id, String uname, String password) {
this.id = id;
this.uname = uname;
this.password = password;
}
//私有属性 必须 添加getter setter方法 (属性的访问器)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//添加toString 方法 用来打印 对象的基本信息
@Override
public String toString() {
return "User [id=" + id + ", uname=" + uname + ", password=" + password
+ "]";
}
}
页面三:
package com.oracle.daoImpl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.oracle.entity.User;
import com.oracle.util.DBTools;
public class UserDaoImpl {
private Connection conn = null;// 全局变量
private PreparedStatement ps = null;// 全局变量
private ResultSet rs = null;// 全局变量
/**
* 登陆操作
*
* 预编译的操作 就是 用
* ? 来 替换 字符串的 拼接 可以方式 sql 注入问题;
* @throws SQLException
*
*/
public User getUserByNameAndPassword(String name , String password) throws Exception{
//使用 预编译 语句 ?号 是英文的
String sql = "select * from user where uname = ? and password = ?";
//获取 连接
conn = DBTools.getConnection();
//之前 我们 获取的是 Statment 对象 、 现在 获取 PreparedStatement对象 这个对象被称为 预编译对象
//如果 你 多次 执行 同一个 sql 语句 预编译对象 效率 高 于 Statement对象
ps = conn.prepareStatement(sql);
//在发送 并执行 sql 语句之前 要 给 ? 赋值
//给 ? 赋值
ps.setString(1, name);
ps.setString(2,password);
ResultSet rs = ps.executeQuery();
User user = null;
while(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUname(rs.getString("uname"));
user.setPassword(rs.getString("password"));
}
DBTools.close(conn, ps, rs);
return user;
}
/**
* 修改操作
* 入参 是 User 实体
* @throws SQLException
*/
public boolean updateUserById(User user) throws Exception{
String sql = "update user set uname = ? , password = ? where id = ?";
conn = DBTools.getConnection();
//通过 连接 获取 预编译对象 PrepareStatement
ps = conn.prepareStatement(sql);
//给 ? 赋值 没有顺序 只要 制定 是第几个 ?号 即可
ps.setString(2, user.getPassword());
ps.setString(1, user.getUname());
ps.setInt(3, user.getId());
int result = ps.executeUpdate();
DBTools.close(conn, ps, rs);
return result > 0 ? true : false;
}
/**
* 删除
* @throws SQLException
*
*/
public boolean deleteById(int id) throws Exception{
String sql = "delete from user where id = ?";
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql);
//給 ? 赋值
ps.setInt(1, id);
int i = ps.executeUpdate();
DBTools.close(conn, ps, rs);
return i > 0 ? true : false;
}
/**
* 批量删除
* 入参 是 多个 id的值 所以我们 可以采用 数组 、 集合 的方式
* @throws SQLException
*/
public boolean deleteMany(int[] ids) throws Exception{
//删除 多条记录 sql 语句 执行 几次?
int result = 0;
for (int i = 0; i < ids.length; i++) {
String sql = "delete from user where id = ?";
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql);
//給 ? 赋值
ps.setInt(1, ids[i]);
result = ps.executeUpdate();
}
DBTools.close(conn, ps, rs);
return result > 0 ? true : false;
}
/**
* 添加操作
* 入参 User 实体
* @throws SQLException
*/
public boolean addUser(User user) throws Exception{
String sql = "insert into user(id,uname,password) values(null,?,?)";
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, user.getUname());
ps.setString(2,user.getPassword());
int i = ps.executeUpdate();
DBTools.close(conn, ps, rs);
return i > 0 ? true : false;
}
/**
* 模糊查询
* 入参 String str 变量
* @throws SQLException
*/
public List<User> getUserByLike(String str) throws Exception{
List<User> list =new ArrayList<>();
String sql = "select * from user where uname like ?";
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql);
//重点 "%" + str + "%" 使用 这样 给 ? 赋值
ps.setString(1, "%" + str + "%");
rs = ps.executeQuery();
User user = null;
while(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUname(rs.getString("uname"));
user.setPassword(rs.getString("password"));
list.add(user);
}
DBTools.close(conn, ps, rs);
return list;
}
/**
* 分页
*
* 入参 是 页码 和 页大小 使用 (pageNo - 1 )* pageSize表示开始行;
* "select * from user limit 开始行,页大小"
* @throws SQLException
*
*/
public List<User> getUserByLimit(int pageNo ,int pageSize) throws Exception{
List<User> list =new ArrayList<>();
String sql = "select * from user limit ?,?";
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, (pageNo-1) * pageSize);
ps.setInt(2, pageSize);
rs = ps.executeQuery();
User user = null;
while(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUname(rs.getString("uname"));
user.setPassword(rs.getString("password"));
list.add(user);
}
DBTools.close(conn, ps, rs);
return list;
}
}
页面四:
package com.oracle.test;
import java.util.List;
import org.junit.Test;
import com.oracle.daoImpl.UserDaoImpl;
import com.oracle.entity.User;
public class TestUser {
UserDaoImpl userDao = new UserDaoImpl();
/**登录用户信息
* junit 单元测试
*/
@Test
public void login(){
try {
User user = userDao.getUserByNameAndPassword("Built","131");
if(null != user){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 修改用户信息
* @throws Exception
*/
@Test
public void updateUser() throws Exception{
User user = new User();
user.setId(12);
user.setUname("Mike");
user.setPassword("128");
boolean result = userDao.updateUserById(user);
if(result){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
}
/**
* 删除用户信息
* @throws Exception
*/
@Test
public void deleteById() throws Exception{
boolean result = userDao.deleteById(5);
if(result){
System.out.println("刪除成功");
}else{
System.out.println("刪除失败");
}
}
/**
* 添加用户信息
* @throws Exception
*/
@Test
public void addUser() throws Exception{
User user = new User();
user.setUname("Built");
user.setPassword("131");
boolean result = userDao.addUser(user);
if(result){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
}
/**
* 模糊查询
* @throws Exception
*/
@Test
public void getUserByLike() throws Exception{
List<User> list = userDao.getUserByLike("维");
for (User user : list) {
System.out.println(user);
}
}
/**
* 分页查询
* @throws Exception
*/
@Test
public void getUserByLimit() throws Exception{
int pageNo = 2;//第一頁
int pageSize = 3;
List<User> list = userDao.getUserByLimit(pageNo, pageSize);
for (User user : list) {
System.out.println(user);
}
}
/**
* 批量删除用户信息
* @throws Exception
*/
@Test
public void deleteMany() throws Exception{
int[] ids = {8,10,11};
boolean deleteMany = userDao.deleteMany(ids);
System.out.println(deleteMany);
}
}