2020-10-08

JDBCUtils

一、 目的:简化书写
二、分析:

  • 1,注册驱动
  • 2,抽取一个方法获取连接对象

需求不想传递参数,但是还要保证工具类的通用性
解决:配置文件

jdbc.properties
url =jdbc:mysql://localhost:3306/
username =root
password =gcy123456
driver =com.mysql.jdbc.Driver
		 Connection conn = null;
		Statement state = null;
		ResultSet rs = null;
		
		try {
     
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306","root","root");
			String sql = "select *from stu";
		    state = conn.createStatement();
		    rs = state.executeQuery(sql);
			while (rs.next()) {
     
				Singer singer = new Singer();
				singer.setId(rs.getInt("id"));
				singer.setUsername(rs.getString("username"));
				singer.setAge(rs.getInt("age"));
				singer.setSex(rs.getInt("sex"));
				singer.setGrade(rs.getInt("grade"));				
				ls.add(singer);
			}
		} catch (ClassNotFoundException e) {
     
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
     
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
     
			try {
     
				//判断一下防止空指针异常
				if (rs!=null) {
     
					rs.close();
				}
				if (state!=null) {
     
					state.close();
				}
				if (conn!=null) {
     
					conn.close();	
				}
			} catch (SQLException e) {
     
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

增:
说明:预期目的是为了将(’‘18000001’’,小红,’‘18’’,1,’‘78’’)数据插入到数据库中,运行后结果如图所示。

package com.gcy.javaweb.preparedstatement;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Properties;

import org.junit.Test;

public class PreparedStatementTest {
     
	@Test
	//向student表中插入一条数据
	public void testInsert(){
     
		
		Connection con = null;
		PreparedStatement ps = null;
		try {
     
			//1.读取配置文件的4个基本信息
			InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
			
			Properties pros = new Properties();
			pros.load(is);
			
			String user = pros.getProperty("user");
			String password = pros.getProperty("password");
			String url = pros.getProperty("url");
			String driverClass = pros.getProperty("driverClass");
			
			//2.加载驱动
			Class.forName(driverClass);
			
			//3.获取连接
			con = DriverManager.getConnection(url,user,password);
			System.out.println(con);
			
			//4.预编译SQL语句,返回PreparedStatement的实例
			String sql = "insert into student(id,username,age,sex,grade)values(?,?,?,?,?)";//?:占位符
			ps = con.prepareStatement(sql);
			//5.填充占位符
			ps.setString(1, "18000001");
			ps.setString(2, "小红");
			ps.setString(3, "18");
			ps.setString(4, "1");
			ps.setString(5, "78");
			
			//6.执行SQL
			ps.execute();
		} catch (Exception e) {
     
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
     
			//7.资源关闭
			try {
     
				if(ps != null)
					ps.close();
			} catch (SQLException e) {
     
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
     
				if(con != null)
					con.close();
			} catch (SQLException e) {
     
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

2020-10-08_第1张图片
删:
说明:预期目的是为了将学号为18000000数据从数据库中删除,运行后结果如图所示。

@Test
	public void testCommonUpdate() {
     
		String sql = "DELETE  FROM 'student'WHERE id='18000000'";
		update(sql,2);
	}
	//通用的增删改操作
	public void update(String sql,Object ...args){
     //sql中占位符的个数与可变形参长度相同
		Connection con = null;
		PreparedStatement ps = null;
		try {
     
			//1.获取数据库连接
			con = JDBCUtils.getConnection();
			//2.预编译SQL语句,返回PraparedStatement的实例
			ps = con.prepareStatement(sql);
			//3.填充占位符
			for(int i=0;i<args.length;i++) {
     
				ps.setObject(i+1, args[i]);//参数声明:列号从1开始
			}
			//4.执行SQL
			ps.execute();
		} 
		catch (Exception e) {
     
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
     
			//5.资源的关闭
			JDBCUtils.closeResource(con,ps);
		}
		
	}

2020-10-08_第2张图片
改:
说明:预期目的是为了将学号为18000000数据姓名改为小兰,运行后结果如图所示。

//修改student表的一条记录
	@Test
	public void testUpdate() {
     
		//1.获取数据库连接
		Connection con = null;
		PreparedStatement ps = null;
		try {
     
			con = JDBCUtils.getConnection();
			//2.预编译SQL语句,返回PraparedStatement的实例
			String sql = "update student set username =? where id = ?";
			ps = con.prepareStatement(sql);
			//3.填充占位符
			ps.setObject(1, "小兰");
			ps.setObject(2, "18000000");//第二列 第三行
			//4.执行SQL
			ps.execute();
		} catch (Exception e) {
     
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
     
			//5.资源的关闭
			JDBCUtils.closeResource(con,ps);
		}
	}
}

2020-10-08_第3张图片
查:
说明:预期目的是为了在数据库中查找学号为18036059的学生信息,运行后结果如图所示。

package com.javaweb3.preparedstatement;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.javaweb4.util.JDBCUtils;

/**
 * 针对于student表的查询
 * @author gcy
 *
 */
public class StudentForQuery {
     
	@Test
	public void testQuery1(){
     
		Connection con = null;
		PreparedStatement ps = null;
		//执行并返回结果集
		ResultSet resultSet = null;
		try {
     
			con = JDBCUtils.getConnection();
			String sql = "select id,username,age,sex,grade from student where id = ?";
			ps = con.prepareStatement(sql);
			ps.setObject(1, "18036059");
			resultSet = ps.executeQuery();
			//处理结果集
			if(resultSet.next()) {
     //判断结果集的下一条是否有数据,如果有数据返回true,并且指针下移;如果返回false,指针不会下移
			
				//获取当前字条数据的各个字段值
				int id = resultSet.getInt(1);
				String username = resultSet.getString(2);
				String age = resultSet.getString(3);
				String sex = resultSet.getString(4);
				String grade = resultSet.getString(5);
//				Date birth = resultSet.getDate(4);
				
				/*处理结果集
				 * 方式一:
				 */
				System.out.println(id+","+username+","+age+","+sex+","+grade);
//				//方式二:
//				Object[] data = new Object[] {
     id,name,email,birth};
//				for(int i=0;i;i++) {
     
//					System.out.print(data[i]+" ");
//				}
			}
		}catch (Exception e) {
     
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
     
			//关闭资源
			JDBCUtils.closeResource(con, ps, resultSet);
		}	
	}
}

在这里插入图片描述
三、对以上代码的说明
以上对数据库数据的增删查操作全都是使用PreparedStatement实现的,PreparedStatement是从Statement扩展而来的。不使用Statement是因为它不仅需要拼写sql语句,更严重的是存在SQL注入的问题。PreparedStatement是预编译的,对于批量处理可以大大提高效率。

四、总结
以上就是本人对JDBC和DBUtils工具类的全部认识和简单的运用方法,不足之处欢迎大家批评指正!

你可能感兴趣的:(笔记,mysql)