一.JDBC原生7大操作步骤涉及到的Api
//1)导包---导入msyql驱动包 2)注册驱动--->
Class.forName("com.mysql.jdbc.Driver") ; //为了向后兼容 ---在加载类
本身注册驱动需要用到java.sql.DriverManager:驱动管理类(管理诸如JDBC的服务) 提供静态功能: 1)注册驱动public static void registerDriver(Driver driver) throws SQLException 参数为:java.sql.Drvier---->需要接口的实现类---驱动jar包里面com.mysql.jdbc.Drvier
如果上面的写法使用 DriverManager.registerDriver(new com.mysql.jdbc.Driver());这种方式,会多注册一遍 com.mysql.jdbc.Driver的原码里面 public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { //静态代码块 try { DriverManager.registerDriver(new Driver()); //注册驱动了 } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } } 获取数据库的连接对象,返回值 java.sql.Connection 2)public static Connection getConnection(String url, String user, String password) throws SQLException url: 协议://域名:端口/库名 (统一资源定位符号) jdbc:mysql://localhost:3306/库名 user:mysql的用户名: root用户 password:密码
java.sql.Connection:与特定数据库连接会话 接口
Statement createStatement() throws SQLException; 获取执行对象 返回返回的数据库执行对象--->里面创建具体子实现类对象 public class StatementImpl implements Statement
java.sql.Statement:用于执行静态SQL语句并返回其生成的结果的对象。 静态sql语句: 弊端 1)硬编码 2)存在sql字符串拼接
String sql = "update account set balance = balance + 500 where id =1 " ; 两种通用操作 针对DDL语句(针对表/库相关的操作),DML语句的insert ,update,delete 更新操作 public int executeUpdate(String sql) 针对DQL语句:数据库查询语句 ,返回表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 ResultSet executeQuery(String sql) throws SQLException
java.sql.ResultSet 据库结果集的数据表 boolean next():是否下一个结果集
优化版JDBC连接数据库
import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * @author 高圆圆 * @date 2022/12/5 10:27 * * 提供这样一个工具类,构造方法私有,目的就是为了让外界不能new对象 * 封装哪些 * * 1)每一次书写7大步骤,都需要去获取数据库的连接对象,需要优化 * 2)每一次都要释放资源的代码,也需要优化 */ public class Jdbc { //成员变量声明三个变量 private static String url = null ; private static String user = null ; private static String password = null ; private static String driverClass = null ; //模拟 驱动jar包---Driver驱动类---提供静态代码块 static{ try { //想办法获取这些参数---->提供配置文件 后缀名.properties---->放在src下面 //1)读取配置文件内容 InputStream inputStream = Jdbc.class.getClassLoader() .getResourceAsStream("jdbc.properties"); //2)创建一个属性集合列表Properties Properties prop = new Properties() ; //System.out.println(prop) ;//测试 ---肯定空列表 //3)将1)获取资源文件的输入流对象---加载到属性集合列表中 prop.load(inputStream); // System.out.println(prop) ; //测试--->有属性列表内容 //4)通过key获取value driverClass = prop.getProperty("driverClass"); url = prop.getProperty("url") ; user = prop.getProperty("user") ; password = prop.getProperty("password") ; //5)加载驱动类 Class.forName(driverClass) ; } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private Jdbc(){} /** * 这个方法,获取数据库的连接对象 * @return */ public static Connection getConnection(){ try { //需要驱动管理DriverManager获取连接对象 Connection connection = DriverManager.getConnection(url, user, password);//获取这三个参数的内容 return connection ; } catch (SQLException throwables) { throwables.printStackTrace(); } return null ; } /** * 释放资源,针对DDL语句,DML语句 * @param stmt * @param conn */ public static void close(Statement stmt,Connection conn){ if(stmt!=null){ try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } public static void main(String[] args) { Connection connection = Jdbc.getConnection(); System.out.println(connection); } }
jdbc.properties文件(以后只需改这里的配置)
url:jdbc:mysql://localhost:3306/myee_2211 user:root password:123456 driverClass:JDBC_Demo.Jdbc
二.JDBC执行DQL语句
import com.qf.jdbc_utils_02.JdbcUtils;
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
/**
-
@author 高圆圆
-
@date 2022/12/5 11:45
-
使用Statement执行DQL语句操作 */ public class StatementExecuteDQL {
public static void main(String[] args) throws Exception { //1)直接获取连接对象 Connection conn = JdbcUtils.getConnection(); //2)准备sql语句 String sql = "select * from student" ; //3)获取执行对象 Statement stmt = conn.createStatement(); //4)执行sql ResultSet rs = stmt.executeQuery(sql);
System.out.println("学生的信息如下:"); //第一次获取 //ResultSet--->boolean next() :判断结果集中是否下一条数据
/* if(rs.next()){ //true //通过列的索引值获取 xxx getXXX(int columneIndex) int id = rs.getInt(1);//第一例 String name = rs.getString(2);//第二列 int age = rs.getInt(3);//第三列 String gender = rs.getString(4);//第四列 String address = rs.getString(5);//第五列 System.out.println(id+"\t"+name+"\t"+gender+"\t"+address);
} //第二次获取 if(rs.next()){ //true //通过列的名称获取 xxx getXXX(String columneLaber) int id = rs.getInt("id");//第一例的名称 String name = rs.getString("name");//第二列名称 int age = rs.getInt("age");//第三列名称 String gender = rs.getString("gender");//第四列名称 String address = rs.getString("address");//第五列名称 System.out.println(id+"\t"+name+"\t"+gender+"\t"+address); } //第三次获取 if(rs.next()){ //true //通过列的名称获取 xxx getXXX(String columneLaber) int id = rs.getInt("id");//第一例的名称 String name = rs.getString("name");//第二列名称 int age = rs.getInt("age");//第三列名称 String gender = rs.getString("gender");//第四列名称 String address = rs.getString("address");//第五列名称 System.out.println(id+"\t"+name+"\t"+gender+"\t"+address); }*/ while(rs.next()){ //通过列的名称获取 xxx getXXX(String columneLaber) int id = rs.getInt("id");//第一例的名称 String name = rs.getString("name");//第二列名称 int age = rs.getInt("age");//第三列名称 String gender = rs.getString("gender");//第四列名称 String address = rs.getString("address");//第五列名称 System.out.println(id+" "+name+" "+gender+" "+address); }
//释放 JdbcUtils.close(rs,stmt,conn); }
}
三.JDBC:DDL语句,DML语句---都能直接操作
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;
/**
-
@author 高圆圆
-
@date 2022/12/5 10:02
-
JDBC操作DDL语句--->创建一个学生表
-
id,name,gender,age,address */ public class JDBCDemo2 { public static void main(String[] args) {
Connection conn = null ; Statement stmt = null ; try { //1)导包/注册驱动 Class.forName("com.mysql.jdbc.Driver") ; //2)准备sql String sql = "create table student(" + " id int primary key auto_increment," + " name varchar(10), " + " age int ," + " gender varchar(3), " + " address varchar(50) " + ") ;" ; //3)获取连接对象 conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ee_2211_02", "root", "123456" ) ; //4)获取执行对象 stmt = conn.createStatement() ; //5)执行 int count = stmt.executeUpdate(sql); System.out.println(count); } catch (Exception e) { e.printStackTrace(); } finally { if(stmt!=null){ try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } }
} }
四.JDBC 练习---->学生表(n条数据)
查询全表数据--->将最终的结果封装List<Student>,学生类有姓名,年龄....信息,每一次查询一条,封装到Student类中,将全部数据封装到List集合中,遍历List集合,获取到学生信息!
包的命名:公司域名反写 com.qf.pojo/entity/domain---->实体类--->描述事物的属性和行为.. com.qf.service ---->业务服务层 ----->针对业务的接口 com.qf.service.impl----->针对业务的接口实现-------------------->以后开发中----大量的if.else...
com.qf.dao ----->DAO Data Access Object--->数据访问对象 ------>数据访问接口 XxxDao com.qf.dao.impl 数据访问接口的实现------>JDBC代码
com.qf.test----->单元测试的
五.提供一个UserDao接口
import com.qf.dao.StudentDao; import com.qf.pojo.Student; import com.qf.utils.JdbcUtils;
import javax.swing.plaf.nimbus.State; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List;
/**
-
@author 高圆圆
-
@date 2022/12/5 14:41
-
针对学生数据访问接口的实现 */ public class StudentDaoImpl implements StudentDao { /**
-
添加学生实体
-
@param student 学生对象 */ @Override public void add(Student student) throws SQLException { //获取数据库连接对象 Connection conn = JdbcUtils.getConnection(); //sql String sql = "insert into student(name,age,gender,address) values('"+student.getName()+"','" +student.getAge()+"','"+student.getGender()+"','"+student.getAddress()+"')" ; //获取执行对象 Statement stmt = conn.createStatement() ; //执行更新 int count = stmt.executeUpdate(sql); System.out.println(count) ; JdbcUtils.close(stmt,conn); }
/**
-
通过学生数据修改学生数据
-
@param student 学生对象
-
@return 影响的行数 */ @Override public int updateStudent(Student student) throws SQLException { //获取数据库连接对象 Connection conn = JdbcUtils.getConnection(); //sql String sql = "update student set name ='"+student.getName()+"' ,address ='"+ student.getAddress()+"' where id = '"+student.getId()+"'"; System.out.println(sql); //获取执行对象 Statement stmt = conn.createStatement() ; //执行更新 int count = stmt.executeUpdate(sql); System.out.println(count) ; JdbcUtils.close(stmt,conn); return count; }
/**
-
根据学生编号删除学生
-
@param id 学生id */ @Override public void deleteStudentById(int id) throws SQLException { //获取数据库连接对象 Connection conn = JdbcUtils.getConnection(); //sql String sql = "delete from student where id = '"+id+"'" ; System.out.println(sql); //获取执行对象 Statement stmt = conn.createStatement() ; //执行更新 int count = stmt.executeUpdate(sql); System.out.println(count) ; JdbcUtils.close(stmt,conn); }
-
/** * 查询所有学生的功能 * @return 学生列表 */ @Override public List<Student> findAllStudent() throws SQLException { List<Student> list = new ArrayList<>() ; Connection conn = JdbcUtils.getConnection(); //sql String sql = "select * from student" ; Statement stmt = conn.createStatement() ; //查询结果集 ResultSet rs = stmt.executeQuery(sql) ; //声明学生变量 Student s = null ; while(rs.next()){ s = new Student() ; s.setId(rs.getInt(1)) ; s.setName(rs.getString(2)); s.setAge(rs.getInt(3)); s.setGender(rs.getString(4)); s.setAddress(rs.getString(5)); //添加集合中 list.add(s) ; } return list; } /** * 通过学生id获取学生实体 * @param id 学生编号 * @return 返回学生实体 */ @Override public Student findStudentById(int id) throws SQLException { Connection conn = JdbcUtils.getConnection(); //sql String sql = "select * from student where id = '"+id+"'" ; //id唯一 //获取执行对象 Statement stmt = conn.createStatement() ; ResultSet rs = stmt.executeQuery(sql); Student s = null ; if(rs.next()){ //封装学生对象 s = new Student() ; s.setId(rs.getInt("id")); s.setName(rs.getString("name")); s.setAge(rs.getInt("age")); s.setGender(rs.getString("gender")); s.setAddress(rs.getString("address")); } return s; }
}