目录
JDBC(java database connection)
JDBC连接数据库步骤:
1. 在项目中添加jar文件,如图所示
2.加载驱动类
向数据库中插入数据代码示例:
第一种:
第二种:
查询操作 :
第一种:
第二种:
JDBC(java database connection)
java数据库连接.api(应用程序编程接口) ,可以为多种关系型数据提供统一访问,它由一组java语言编写的类和接口组成.
java程序是可以连接不同的数据库,但是不同的数据库具体的连接细节不同,那么连接数据库的细节应该由谁来实现?
连接细节由数据库开发商实现,由于开发商起的名字,连接操作步骤不同,所以由java设计出一系列连接数据库接口规范,然后由不同的数据库开发商实现.
示例 :
java 定义的接口
inerface oper
{
insert()
{}
delete()
{}
select()
{}
update()
{}
}
然后例如mysql sqlsever 去实现.
示例: mysql实现类
oracleOperImpl implements oper{
insert()
{
.......}
delete()
{
.......}
select()
{
.....}
update()
{
.......}
}
有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库
因为java对于不同的数据库,对其的操作方法的名字都是一样的,
- java定义者制定了JDBC规范,
- 数据库开发商实现接口
- 程序员学习使用标准规范
所以程序员只需要知道java提供的方法即可,java提供了链接数据库的规范,具体连接细节由数据库开发商实现.mysql和java连接的jar文件,mysql-connector-java-8.0.16.jar.
JDBC连接数据库步骤
1. 在项目中添加jar文件,如图所示
2.加载驱动类
完整功能
package jdbc;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class demo1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//2加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2加载驱动类2
//DriverManager.registerDriver(new Driver());
//建立与数据库的连接,获得连接对象
//三个参数,账号,密码,数据库连接地址
String url = "jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/" + "Shanghai";
String user ="root";
String password ="root";
Connection connection = DriverManager.getConnection(url,user,password);
//发送sql
Statement st = connection.createStatement();
//java向数据库发送语句
//向表中插入数据
st.executeUpdate("insert into major(name)values('计算机')");
//关闭数据库连接
st.close();
connection.close();
}
}
这样就可以将java中的数据存储到数据库中去.
注意
关于调用抽象类中的方法,实际上在JDBC的上下文中,你并不会直接去实例化一个抽象类或者明确地调用抽象类的方法。更多的是通过接口和具体实现类的交互来完成数据库操作。例如,当你调用DriverManager.getConnection(url, username, password)
获取数据库连接时,这个方法返回的是一个实现了java.sql.Connection
接口的对象。这个对象是由具体的数据库驱动程序提供的,它可能是一个具体类也可能是抽象类的具体子类,但作为开发者,我们通常不需要关心其具体实现细节,只需要知道它遵循了Connection
接口规范即可。
如图所示:
向数据库中插入数据代码示例:
第一种
statement传递sql直接将sql语句传递到数据库中
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//向数据库插入数据
public class deom2 {
public static void main(String[] args) {
try {
new deom2().save("小三",12,"2003-06_17", "19025284617", "男","陕西西安", 1.80, 5 );
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public void save(String name, int num ,String birthday ,String phone, String gender,String address ,double height ,int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
// 管理驱动程序并建立与数据库连接,返回的这个connection 对象代表了特定数据库的连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
// 通过调用 Connection 对象的 createStatement() 方法,
// 你可以创建一个 Statement 对象。
// 这个 Statement 对象可以用来执行SQL查询或者更新(比如INSERT, UPDATE, DELETE语句)
Statement st = connection.createStatement();
//执行SQL语句中的更新数据的操作
st.executeUpdate("INSERT INTO student(name ,num , birthday ,phone ,gender,address,height ,reg_time,majorid)"
+ "values('"+name+"',"+num+",'"+birthday+"','"+phone+"','"+gender+"','"+address+"',"+height+",now(),"+majorid+")");
//执行sql语句中的修改操作
//st.executeUpdate("update student set name ='"+name+"',gender ='"+gender+"',birthday = '"+birthday+"',reg_time=now()where num ='"+num+"' ");
//关闭单一的SQL操作句柄
st.close();
//关闭数据库连接
connection.close();
}
}
statement:
实现这个接口的对象,专门用来向数据库发生SQL语句,并且这个接口类的抽象方法定义的名字都是一样的,方法里面传递的参数都是sql.
第二种
preparestatement先用占位符?站位,然后通过setobject 方法赋值,写起来就不用连接符.安全可靠,具体实现如下:
package jdbc;
import java.sql.*;
/*preparestatement 和 statement的区别
相同点都是向数据库发送SQL
不同点,
statement 安全性差
preparestatement 先用占位符?站位,然后通过setobject方法赋值,写起来不用连接字符串,安全可靠
在赋值时进行检测,可以防止sql注入攻击如"or 1 = 1" 检测到有两个字符串,就会报错. 若是第一种,则删除操作时,回将整个表删除(若没有外键约束).查询查询整张表.
*
* */
//向数据库插入数据
public class deom3 {
public static void main(String[] args) {
try {
new deom3().save("小三",12,"2003-06_17", "19025284617", "男","陕西西安", 1.80, 5 );
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public void save(String name, int num ,String birthday ,String phone, String gender,String address ,double height ,int majorid) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
//发送
//预先编译sql
PreparedStatement ps = connection.prepareStatement("insert into student(name,num ,birthday ,phone,gender,address,height,majorid)values(?,?,?,?,?,?,?,?)");
//然后传参
ps.setObject(1, name);
ps.setObject(2, num);
ps.setObject(3,birthday);
ps.setObject(4, phone);
ps.setObject(5, gender);
ps.setObject(6, address);
ps.setObject(7,height);
ps.setObject(8, majorid);
//执行
ps.executeUpdate();
//关闭单一的SQL操作句柄
ps.close();
//关闭数据库连接
connection.close();
}
}
查询操作 :
第一种
当查询结果只有一行时,JAVA是面向对象的,查询语句中将查询到的结果将这行数据封装到对象中.步骤如下
定义一个学生类相当于数据库中的表名,其中的变量如name,num,gender相当于数据库中的列名,将从数据库中查到的列名用set()方法赋值到对象的变量中,然后利用改写toString方法输出,
具体代码实现如下
package jdbc;
import java.sql.*;
public class deom4 {
public static void main(String[] args) {
try {
student st = new deom4().findstudentByNum(5);
System.out.println(st.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public student findstudentByNum(int num) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
PreparedStatement ps = connection.prepareStatement("select num ,name ,gender ,birthday ,phone ,reg_time from student where num=?");
ps.setObject(1, num);
//查询操作
ResultSet rs = ps.executeQuery();//将查询的结果封装到result对象中,需要ResultSet对象封装到对象中
student st = null;
//结果集中有数据返回true否则false
while(rs.next())
{
//创建学生对象,将获取到的结果封装到学生类中.
st = new student();
st.setNum(rs.getInt("num"));
st.setName(rs.getString("name"));
st.setGender(rs.getString("gender"));
st.setBirthday(rs.getString("birthday"));
st.setPhone(rs.getString("phone"));
st.setReg_time(rs.getTimestamp("reg_time"));
}
rs.close();
ps.close();
connection.close();
return st ;
}
}
定义的student类,用来装数据库中查询到的结果.
package jdbc;
import java.util.Date;
public class student {
private int num ;
private String name ;
private String gender;
private String birthday;
private String phone ;
private Date reg_time ;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
@Override
public String toString() {
return "student{" +
"num=" + num +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
", phone='" + phone + '\'' +
", reg_time=" + reg_time +
'}';
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getReg_time() {
return reg_time;
}
public void setReg_time(Date reg_time) {
this.reg_time = reg_time;
}
}
第二种:
当查询结果有多条语句时,就要用到java中的集合ArrayList来装数据库中查询到的多条记录,
将查询到的每一条student对象全部用arraylist中的add方法添加到arraylist中去,然后输出arraylist
集合.
具体实现如下:
package jdbc;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;
public class deom5 {
public static void main(String[] args) {
try {
ArrayList <student> students = new deom5().findstudentByGender("男");
System.out.println(students);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public ArrayList<student> findstudentByGender(String gender) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");//反射实现
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/学生?serverTimezone=Asia/Shanghai","root","root");
PreparedStatement ps = connection.prepareStatement("select num ,name ,gender ,birthday ,phone ,reg_time from student where gender=?");
ps.setObject(1, gender);
ArrayList<student> students = new ArrayList<>();//创建学生集合,存储多个学生对象
//查询操作
ResultSet rs = ps.executeQuery();//将查询的结果封装到result对象中,需要ResultSet对象封装到对象中
//结果集中有数据返回true否则false
while(rs.next())
{
//每循环一次创建一个学生对象
student st = new student();
st.setNum(rs.getInt("num"));
st.setName(rs.getString("name"));
st.setGender(rs.getString("gender"));
st.setBirthday(rs.getString("birthday"));
st.setPhone(rs.getString("phone"));
st.setReg_time(rs.getTimestamp("reg_time"));
//将学生对象存入到学生集合之中去
students.add(st);
}
rs.close();
ps.close();
connection.close();
return students ;
}
}