2020-10-22

JDBC

就是一组Java连接数据库的API,这些API不是数据库厂商提供,是sun公司给我们封装好一些接口,具体的实现是由各个数据库厂商来实现的。我们想要操作不同的数据库,就需要用到各个数据库厂商给我们提供的接口的实现类。

操作JDBC四个步骤:
1.加载驱动
2.连接数据库
3.操作数据库
4.关闭数据库连接

常用的类:
DriverManager:是java.sql包下的类,管理数据库的一组API,我们在使用DriverManager的时候最常用的就是getConnection()方法,通过此方法,我们可以获取到Connection对象.
DriverManager常用的方法:
getConnection(String url,String user,String password):此方法是一个静态方法,此方法的作用是获取Connection接口的对象,其中参数url代表想要连接的数据库的网络地址,user代表用户名,password代表密码
MySQL的url的格式:jdbc:mysql://主机地址:端口号/要连接的数据库的名称

Connection:是java.sql包下的接口,代表与特定的数据库之间的连接(会话),在连接上下文中执行SQl语句并返回执行的结果。
Connection常用的方法:
1.close():关闭数据库连接
2.createStatement():此方法会返回一个Statement对象

Statement:是java.sql包下的接口,Statement对象的作用就是用来执行静态SQL语句,并返回SQL语句的执行结果的对象。
Statement给我们提供的常用的方法:
1.execute(String sql):用来执行SQL语句的方法,此方法的返回值是boolean类型的对象,如果返回的第一个结果是ResultSet结果集对象,则此方法的返回值是true,否则是false.一般来讲我们不会用此方法执行查询,我们都是通过此方法执行除了查询之外的其他的SQL语句。
2.close():关闭当前操作数据库的Statement对象
3.executeQuery(String sql) :此方法的作用是用来执行查询语句并返回查询结果,返回值是ResultSet对象。

ResultSet:是java.sql包下的接口,表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet常用的方法:
next():此方法是将结果集中的光标指向下一条数据,在执行之前,此方法会判断是否存在下一条数据,如果存在,则向下移动光标并返回true,否则返回false.
close():关闭结果集对象
getInt(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的int类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。
getDouble(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的double类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。
getFloat(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的float类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。
getString(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的varchar类型或者char类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。
getDate(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的Date类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。
getTimeStamp(int columnIndex):此方法是用来获取数据库中结果集的当前这一行的TimeStamp或是Date类型的数据,参数代表当前字段在结果中出现的位置,位置从1开始的。

getInt(String columnName):此方法是用来获取数据库中结果集的当前这一行的int类型的数据,参数代表当前字段的名称
getDouble(String columnName):此方法是用来获取数据库中结果集的当前这一行的double类型的数据,参数代表当前字段的名称
getFloat(String columnName):此方法是用来获取数据库中结果集的当前这一行的float类型的数据,参数代表当前字段的名称
getString(String columnName):此方法是用来获取数据库中结果集的当前这一行的varchar类型或者char类型的数据,参数代表当前字段的名称
getDate(String columnName):此方法是用来获取数据库中结果集的当前这一行的Date类型的数据,参数代表当前字段的名称
getTimeStamp(String columnName):此方法是用来获取数据库中结果集的当前这一行的TimeStamp或是Date类型的数据,参数代表当前字段的名称

总结JDBCDemo的问题所在:
1.数据库的驱动我们在频繁的加载。
解决的思路:加载一次即可。
2.SQL语句中传递的字段的数据都是常量,每一次想要修改必须重写编写代码。
解决思路:可以考虑使用变量
3.对于insert、update、delete方法来讲只有SQL语句不同,其他的都一样。
解决思路:可以考虑将这些一样的进行封装。

Connection常用方法:
prepareStatement(String sql):返回一个PreparedStatement接口对象。

PreparedStatement:是java.sql包下的一个接口,表示预编译的 SQL 语句的对象。
什么叫预编译的SQL语句,实际上就是指,在SQL语句中我们对于需要设置的字段的数据,我们可以采用占位符的形式进行编写,并预编译在SQL语句在中,之后我们只需要设置占位符即可。

DAO:数据访问对象,主要就是提供对数据库执行的方法进行封装。
VO:value Object 值对象,主要的作用就是用来传递数据。

package com.ran.demo1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;

public class Test {

	public static void main(String[] args) {
		selectAllEmp();
		}
	public static void insertEmp(){
		//反射加载
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		// 获取数据库链接
		Connection conn = null;
		Statement stat=null;
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root");
			//插入数据
			String sql="insert into emp(empid,ename,job,sal,hiredate) values(1,'lishi','manager',800,now());";
			stat=conn.createStatement();
			stat.execute(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭数据库连接
			
			if(stat != null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public static void updateEmp(){
		//反射加载
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		// 获取数据库链接
		Connection conn = null;
		Statement stat=null;
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root");
			//插入数据SQL语句
			String sql="update emp set ename='zs',sal=1000 where empid=1";
			stat=conn.createStatement();
			stat.execute(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭数据库连接
			if(stat != null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public static void deleteEmp(){
		//反射加载
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		// 获取数据库链接
		Connection conn = null;
		Statement stat=null;
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root");
			//插入数据SQL语句
			String sql="delete from emp where empid=1 ";
			stat=conn.createStatement();
			stat.execute(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭数据库连接
			if(stat != null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public static void selectAllEmp(){
		//反射加载
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		// 获取数据库链接
		Connection conn = null;
		Statement stat=null;
		ResultSet rs=null;
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
		try {
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2020", "root", "root");
			//插入数据SQL语句
			String sql="select ename,empid,job from emp";
			stat=conn.createStatement();
			rs=stat.executeQuery(sql);
			while(rs.next()){
				int empid=rs.getInt("empid");
				String ename=rs.getString("ename");
				String job=rs.getString("job");
//				double sal=rs.getDouble(4);
//				Date t1=rs.getDate(5);
//				String t=sdf.format(t1);
				System.out.println(empid+ename+job);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭数据库连接
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stat != null){
				try {
					stat.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

package com.rang.excercise;

import java.util.Date;

public class Emp {

	public Emp(int empid, String ename, String job, double sal, Date hiredate) {
		super();
		this.empid = empid;
		this.ename = ename;
		this.job = job;
		this.sal = sal;
		this.hiredate = hiredate;
	}
	public Emp() {}
	private int empid;
	private String ename;
	private String job;
	private double sal;
	private Date hiredate;
	public int getEmpid() {
		return empid;
	}
	public void setEmpid(int empid) {
		this.empid = empid;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public double getSal() {
		return sal;
	}
	public void setSal(double sal) {
		this.sal = sal;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	@Override
	public String toString() {
		return "Emp [empid=" + empid + ", ename=" + ename + ", job=" + job + ", sal=" + sal + ", hiredate=" + hiredate
				+ "]";
	}
	
	
}

package com.rang.excercise;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class EmpDao implements BaseDao<Emp> {

    public EmpDao() {
    }

    @Override
    public void insert(Emp t) {
        String sql = "insert into emp(ename,job,sal,hiredate) values(?,?,?,?);";
        DbTools.executeUpdate(sql, t.getEname(), t.getJob(), t.getSal(), t.getHiredate());
    }

    @Override
    public void update(Emp t) {
        String sql = "update emp set ename=?,job=?,sal=?,hiredate=? where empid=?";
        DbTools.executeUpdate(sql, t.getEname(), t.getJob(), t.getSal(), t.getHiredate(), t.getEmpid());
    }

    @Override
    public void delete(Emp t) {
        String sql = "delete from emp where empid=?";
        DbTools.executeUpdate(sql, t.getEmpid());
    }

    @Override
    public Emp selectById(Emp t) {
        Emp emp = null;
        String sql = "select * from emp where empid=?";
        List<Object[]> list = DbTools.executeQuery(sql, t.getEmpid());
        if (list.size() > 0) {
            Object[] objs = list.get(0);
            int empid = (Integer) objs[0];
            String ename = (String) objs[1];
            String job = (String) objs[2];
            double sal = (Double) objs[3];
            Timestamp hd = (Timestamp) objs[4];
            emp=new Emp(empid,ename,job,sal,new java.util.Date(hd.getTime()));
        }
        return emp;
    }

    @Override
    public List<Emp> selectAll() {
        List<Emp> emps = new ArrayList<>();
		String sql = "select * from emp";
      	List<Object[]> list=DbTools.executeQuery(sql,null);
		if (list.size() > 0) {
			for(int i=0;i<list.size();i++){
				Object[] objs = list.get(i);
				int empid = (Integer) objs[0];
				String ename = (String) objs[1];
				String job = (String) objs[2];
				double sal = (Double) objs[3];
				Timestamp hd = (Timestamp) objs[4];
				Emp emp=new Emp(empid,ename,job,sal,new java.util.Date(hd.getTime()));
				emps.add(emp);
			}
		}
        return emps;
    }
}

package com.rang.excercise;

import java.util.List;

public interface BaseDao<T> {
	public abstract void insert(T t);
	public abstract void update(T t);
	public abstract void delete(T t);
	public abstract T selectById(T t);
	public abstract List<T> selectAll();
}

package com.rang.excercise;

import java.sql.*;

import java.util.ArrayList;
import java.util.List;

public class DbTools {
    //URL
    private  static  final String URL="jdbc:mysql://localhost:3306/test";
    //user
    private static final String USER="root";
    //pwd
    private static final String PWD="root";
    //PreparedStatement 对象
    private static PreparedStatement preparedStatement=null;
    //ResultSet对象
    private static ResultSet resultSet=null;
    //connection对象
    private  static Connection connection=null;
    //编写一个静态块用于加载驱动
    static  {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection()  {
        if (connection == null) {
            try {
                connection = DriverManager.getConnection(URL, USER, PWD);
                connection.setAutoCommit(false);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return  connection;
    }
    //insert,update,delete
    public static void executeUpdate(String sql,Object...objs){
        //获取connection 对象
        connection=getConnection();
        //获取PreparedStatement 对象
        try {
            preparedStatement=connection.prepareStatement(sql);
            if(objs!=null){
                for(int i=0;i<objs.length;i++){
                    preparedStatement.setObject(i+1,objs[i]);
                }
            }
            preparedStatement.executeUpdate();
            commit();
        } catch (SQLException e) {
            e.printStackTrace();
            rollback();
        }finally {
            close();
        }
    }
    //select方法
    public static List<Object[]> executeQuery(String sql,Object...objs){
        List<Object[]> list=new ArrayList<>();
        connection=getConnection();
        try {
            preparedStatement=connection.prepareStatement(sql);
            if(objs!=null&&objs.length>0){
                for(int i=0;i<objs.length;i++){
                    preparedStatement.setObject(i+1,objs[i]);
                }
            }
            resultSet=preparedStatement.executeQuery();
            while(resultSet.next()){
                Object[] datas=new Object[resultSet.getMetaData().getColumnCount()];
                for(int i=0;i<datas.length;i++){
                    datas[i]=resultSet.getObject(i+1);
                }
                list.add(datas);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close();
        }
        return list;
    }
    //事务提交
    public  static  void commit(){
        if (connection!=null){
            try {
                connection.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //回滚
    public  static  void rollback(){
        if (connection!=null){
            try {
                connection.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //静态方法关闭资源
    public static  void close(){
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(preparedStatement !=null){
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            connection=null;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值