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();
}
}
}
}