目录
六、将student表全部查询出来,将每一条学生的数据封装到Student实体类中, 然后多条学生信息,封装到List,将集合进行遍历!
一、JDBC的本质
jdbc的本质是能够实现sun公司提供的java.sql包下相关的接口实现类,数据库厂商提供一驱动jar包
二、 JDBC 原生操作步骤
1)在java项目下添加额外第三方jar包
idea中 file----> project structure (ctrl+Alt+shift+s:默认快捷键_) ---model---->denpendies---->添加---jar包 ---将指定路径拿过来
2)注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
3)获取数据库连接对象
Connection connection = DriverManger.getConnection("jdbc:mysql://localhost:3306/mydb_01?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "root",
"123456"
)
4)准备sql语句
String sql = " ....";
5)通过数据库连接对象创建执行对象Statement
Statement stem = connection.creatStatement();
6)执行更新操作
int count = stem.executeUpdate(sql);/ResultSet rs = stem.executeQuery(sql);
7)释放资源
stem.close();
connection.close();
三、jdbc工具类及属性列表
1、 提供jdbc.properties -- 属性列表
url=jdbc:mysql://localhost:3306/day_35?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
driverClass=com.mysql.cj.jdbc.Driver
user=root
password=root
2、 封装jdbc操作工具类
package com.qf.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/***
* jdbc.properties -- 属性列表
*
* url=jdbc:mysql://localhost:3306/day_35?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
* driverClass=com.mysql.cj.jdbc.Driver
* user=root
* password=root
*/
public class jdbcUtils {
private static String url = null;
private static String driverClass = null;
private static String user = null;
private static String password = null;
//构造方法私有
private jdbcUtils(){}
//添加静态代码块
static {
try {
//创造属性列表
Properties prop = new Properties();
//添加到流中,
InputStream inputStream = jdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//将流中的内容添加属性列表中
prop.load(inputStream);
System.out.println(prop);
//通过key获取value
url = prop.getProperty("url");
driverClass = prop.getProperty("driverClass");
user = prop.getProperty("user");
password = prop.getProperty("password");
//注册驱动
Class.forName(driverClass);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接对象
public static Connection getconnertion(){
Connection con = null;
try {
con = DriverManager.getConnection(url, user, password);
return con;
} catch (SQLException e) {
e.printStackTrace();
}finally {
return null;
}
}
//关闭资源
//DQL语句---->ResultSet对象,Statement对象和Connection
public static void close(ResultSet rs, Statement stem ,Connection con){
try {
if (rs!=null){
rs.close();
}
if (stem!=null){
stem.close();
}
if (con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//DDL语句或者DML语句----->Statement对象和Connection
public static void close( Statement stem ,Connection con){
close(null,stem,con);
}
//测试
public static void main(String[] args) {
Connection getconnertion = jdbcUtils.getconnertion();
System.out.println(getconnertion);
}
}
四、DDL、DML、DQL语句
DDL:表的操作 ---- executeUpdate
DML:insert into、update 、delete ---- executeUpdate
DQL:select * from --------executeQuary
五、如何使用反射调用方法
Class clazz = Class.forName("类的权限定名称") -------->Class clazz
创建当前类的实例 Object obj = clazz.newInstance() ; ------------> Object obj
调用方法:公共的 Method method = clazz.getMethod("方法名",参数类型的Class);
调用方法:Object reuslt = method.invoke(obj,实际参数);
六、将student表全部查询出来,将每一条学生的数据封装到Student实体类中, 然后多条学生信息,封装到List<Student>,将集合进行遍历!
实现步骤
1、创建学生类
/**
* @author Kuke
* @date 2021/8/17
* 学生类
*/
public class Student {
private int id ; //编号
private String name ;//姓名
private String gender ;//性别
private String email ; //邮箱
public Student() {
}
public Student(int id, String name, String gender, String email) {
this.id = id;
this.name = name;
this.gender = gender;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", email='" + email + '\'' +
'}';
}
}
2、针对学生数据库创建访问接口
/**
* @author Kuke
* @date 2021/8/17
* 针对学生的数据库访问接口
*/
public interface StudentDao {
/**
* 查询所有学生信息
* @return 返回学生列表数据
*/
List<Student> findAll() ;
/**
* /通过学生id学号查询某个学生信息
* @param id 学号id
* @return 返回的某个学生实体
*/
Student findById(int id) ;
/**
* 添加学生信息
* @param student 学生实体类
*/
void add(Student student) ;
/**
* 更新学生信息
* @param student
*/
void updateStudent(Student student) ;
/**
* 通过学号删除学生
* @param id 学生id号
*/
void delete(int id) ;
}
三、数据访问实现层
import com.qf.utils.JdbcUtils;
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 Kuke
* @date 2021/8/17
*
* 数据库接口访问实现层
*/
public class StudentDaoImpl implements StudentDao {
@Override
public List<Student> findAll() {
Connection conn = null ;
Statement stmt = null ;
ResultSet rs = null ;
//操作数据库
try {
//创建List集合对象
List<Student> list = new ArrayList<>() ;
//获取连接对象
conn = JdbcUtils.getConnection();
//准备sql语句
String sql = "select * from student" ;
//获取执行对象
stmt = conn.createStatement();
//执行查询
rs = stmt.executeQuery(sql);
//声明学生类型的变量student
Student student = null ;
while(rs.next()){
//创建学生对象,并封装学生数据
student = new Student() ;
//查询一行,将这条学生信息封装到学生类中
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender") ;
String email = rs.getString("email");
student.setId(id);
student.setName(name);
student.setGender(gender);
student.setEmail(email);
//将学生添加到集合中
//返回集合List
list.add(student) ;
}
return list ;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public Student findById(int id) {
return null;
}
@Override
public void add(Student student) {
}
@Override
public void updateStudent(Student student) {
}
@Override
public void delete(int id) {
}
}
四、测试类
import java.lang.reflect.Method;
import java.util.List;
public class JdbcDemo2 {
public static void main(String[] args) throws Exception {
//接口多态方式
//遍历集合,获取结果
StudentDao sd = new StudentDaoImpl() ;
List<Student> list = sd.findAll();
for (Student student : list) {
System.out.println(student);
System.out.println(student.getId()+"\t"+student.getName()+"\t"+student.getGender()+"\t"+student.getEmail()); //toString()
}
//反射创建当前StudentDaoImpl的实例
Class clazz = Class.forName("com.qf.jdbc_statment_03_jdbcutils.StudentDaoImpl");
//创建当前类实例
Object obj = clazz.newInstance(); //或者Constructor类对象
//获取Method类对象
Method method = clazz.getMethod("findAll");
//调用
Object result = method.invoke(obj); //toString()
System.out.println(result);
}
}