使用预编译对数据库操作代码

页面一:
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);
	}
	
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值