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