java连接MYSQL的功能封装

DriverManager类:DriverManger(驱动管理器)
作用:获取Connection,如果可以获取到Connection,那么已经与数据库连接上了。
PreparedStatement接口:
PreparedStatement和Statement接口类似,也用来传递SQL语句,方便操作数据库(可以进行代参执行语句,可以进行预编译。也可以防止SQL注入)
分两种语句:
executeUpdate():执行更新操作(insert、update、delete等);
executeQuery():执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
Resultset接口:ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。
next():使“行光标”移动到下一行,并返回移动后的行是否存在;
getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。XXX代表数据类型。
测试功类

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Demo_1Test {
	public static void main(String[] args) {
		Demo_1 f=new Demo_1();
		ArrayList<Object> list=new ArrayList<>();//sql可能携带占位符,
		                                         //占位符参数可能有多个,那么可以定义List集合来存储;
		System.out.println("请输入你想进行的操作:1查询 2修改 3删除 4添加");
		Scanner input=new Scanner (System.in);
		int op=input.nextInt();
		String sql=null;
		if(op==1) {
			sql="select * from emp where emp_comm>? and emp_comm<? order by emp_age";
			System.out.print("请输入你想查询的提成区间: ");
			Object beg=input.next();
			Object end=input.next();
			list.add(beg);//添加占位符参数
		    list.add(end);
		    List<Map<String,Object>> alist=f.query(sql,list);
		    //list直接get得到表中一行数据,如果想要获得指定数据,定义map获取一行数据,map中以键输出键值;
		    for( int i = 0; i < alist.size(); i++ ) {
		    	Map<String,Object> map=new HashMap<>();
		    	map=alist.get(i);
	            System.out.println(map.get("emp_no")+"\t"+map.get("emp_name")+"\t"+map.get("emp_age")+"\t"+map.get("emp_salary"));
	        }

		}
		else if(op==2)
		{
			sql="update emp set emp_age=? where emp_name=?"; 
			System.out.print("请输入你想修改的员工名: ");
			Object no=input.next();
            System.out.print("请输入你想修改后的员工年龄: ");
			Object age=input.next();
			list.add(age);
			list.add(no);
			int flag=f.update(sql, list);
			if(flag>0)
				System.out.println("update success");
			else if(flag==0)
				System.out.println("update fail,data not find");
			else
				System.out.println("update fail");
	    }
		else if(op==3) {
			sql="delete from emp where emp_no=?"; 
			System.out.print("请输入你想删除的员工号: ");
			Object no=input.next();
			list.add(no);
			int flag=f.update(sql, list);
			if(flag>0)
				System.out.println("delete success");
			else if(flag==0)
				System.out.println("delete fail,data not find");
			else
				System.out.println("delete fail");
		}
		else if(op==4) {
			sql="insert into emp(emp_no,emp_name,emp_age,emp_address,emp_salary,emp_comm,emp_department_no) values(?,?,?,?,?,?,?)"; 
			System.out.print("请输入你想添加的员工号: ");
			Object no=input.next();
			list.add(no);
			System.out.print("请输入你想添加的员工名: ");
			Object name=input.next();
			list.add(name);
			System.out.print("请输入你想添加的员工年龄: ");
			Object age=input.next();
			list.add(age);
			System.out.print("请输入你想添加的员工地址: ");
			Object add=input.next();
			list.add(add);
			System.out.print("请输入你想添加的员工薪水: ");
			Object sal=input.next();
			list.add(sal);
			System.out.print("请输入你想添加的员工提成: ");
			Object com=input.next();
			list.add(com);
			System.out.print("请输入你想添加的员工所属部门: ");
			Object deno=input.next();
			list.add(deno);
			int flag=f.update(sql, list);
			if(flag>0)
				System.out.println("insert success");
			else  
				System.out.println("insert fail");
		}

}
}

封装的功能

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class Demo_1 {
	private Connection con=null;
	private  PreparedStatement pre=null;
	private ResultSet res;
	private static String driver="com.mysql.jdbc.Driver";
	private String jdbclocal="jdbc:mysql://localhost:3306/demo_1";
	private String user="root";
	private String password="root";
	//静态代码块:定义在类里面,由static修饰的代码块,在项目中,驱动类装载的时候会执行,而且仅执行一次;
	static { 
		try {
			Class.forName(driver);//1、加载注册驱动
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("驱动不存在,请检查");
			e.printStackTrace();
		}
		
	}
	//连接java和mysql数据库中的某个库的连接,而且我们每次使用完成之后,都要释放资源,关闭连接
	public Connection getcon() {
		try {
			con=DriverManager.getConnection(jdbclocal, user, password);//通过DriverManager获取连接 Connection
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("数据库未成功连接");
			e.printStackTrace();
		}
		return con;
	}
	
	public  List<Map<String,Object>> query(String sql,List list) {
		  con=getcon();//得到用于执行sql的Statement对象,需要通过Connection得到它
		   pre=null;
		 List<Map<String,Object>> alist=new ArrayList<>();//定义List<Map<String,String>> 用来存储ResultSet里面的所有数据
		try {
			 pre=con.prepareStatement(sql);//创建PreparedStatement对象,把sql传入进去,用来进行预编译(含占位符)
			 //把sql要使用的参占位符数传递进来
			for(int i=0;i<list.size();i++) {
				pre.setObject(i+1, list.get(i));//不确定参数的类型,使用setObject;
				                                 //占位符下标从1开始,list集合里面的下标从0开始;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("输入sql语句有误,请检查");
			e.printStackTrace();
		}
	
		try {
			//executeQuery()是以用来执行查询sql的,得到一个ResultSet
			res= pre.executeQuery();
			//查询完成之后,需要把查询结果反馈出去,但是因为res要释放资源(close()),所以这样反馈不了数据;
			 //那么可以把ResultSet里面的数据换个位置放置(list);
			ResultSetMetaData rd=res.getMetaData();//list储存,需要获取列名,所以依赖于结果集数据结构;
			 while(res.next()) {
				Map<String,Object> map=new HashMap<>();//Map<String,String> 存储一行数据
				for(int i=0;i<rd.getColumnCount();i++) {
					map.put(rd.getColumnName(i+1), res.getObject(i+1));//键为列名,键值为所查数据;
				}
				alist.add(map);//将map中数据加入list;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		close();
		return alist;
		
	}
	public int update(String sql,List list) {
		//j是用来作为返回值,受影响几行,那么数值就是几,以此判断操作是否进行;
		int flag=-1;
		con=getcon();//得到用于执行sql的Statement对象,需要通过Connection得到它
		 try {
			pre=con.prepareStatement(sql);//创建PreparedStatement对象,把sql传入进去,用来进行预编译(含占位符) 
			//把sql要使用的参占位符数传递进来
			for(int i=0;i<list.size();i++) {
				pre.setObject(i+1, list.get(i));//不确定参数的类型,使用setObject;
                                                //占位符下标从1开始,list集合里面的下标从0开始;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 // executeUpdate() 是用来执行增加、删除、修改sql的,得到int类型的值(sql执行之后,受影响的行数)
		 try {
			flag=pre.executeUpdate(); 
			close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		 return flag;
}
	//关闭资源(后打开的先关闭)
	public void close() { 
		if(res!=null) {
			  try {
			res.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		 
		 if(pre!=null) {
			 try {
			pre.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		 }
		if(con!=null) {
			 try {
			con.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		
		
	}
	

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值