一.JDBC原理:(JAVA 数据库 连接技术)
提供了Java连接各种数据库的能力
二.JDBC
步骤:
- 1.加载驱动jar包
- 2.创建连接通道
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(url,root,pwd);
String sqlInsert="insert into temp values(?,?,?)";
PreparedStatement pstm=con.prepareStatement(sqlInsert);
// insert update delete
int result = stm.executeUpdate(sql);
注: 推荐使用PreparedStatement 因为Statement的缺点:1.不安全,能SQL注入 2.效率低
insert update delete 的执行结果都是int值,表示改变数据的行数
- DriverManager 创建连接通道
- Connection 通道
- PreparedStatement 发送并执行SQL
1.例:以insert为例,update和delete同理
package cn.jdbc.text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
//注意导入的包都是java.sql下的
public class InsertDept2 {
//推荐使用PreparedStatement
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url="jdbc:mysql://localhost:3306/day7";
try {//创建连接通道
Connection con = DriverManager.getConnection(url,"root","cuichen975541045");
//获取用户输入的信息
System.out.println("请输入部门编号:");
String deptno=input.next();
System.out.println("请输入部门名称");
String dname = input.next();
System.out.println("请输入部门位置");
String loc = input.next();
//insert 语句
String sqlInsert = "insert into dept(deptno,dname,loc) values(?,?,?)";
//在通道内,把sql语句发送到数据库端,并且执行
//创建一个运输SQL语句的对象,pstm
PreparedStatement pstm = con.prepareStatement(sqlInsert);
pstm.setString(1, deptno);
pstm.setString(2, dname);
pstm.setString(3, loc);
//发送并且执行SQL语句
//insert update delete 的执行结果都是int值,表示改变数据的行数
int result = pstm.executeUpdate();
//对结果进行判断
if (result==1) {
System.out.println("成功");
}else {
System.out.println("失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.select
登陆查询
package cn.jdbc.text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Login2 {
//建议使用
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;//存放查询结果的对象:结果集对象
try {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day7","root","cuichen975541045");
//登陆的SQL
System.out.println("登录账号:");
String uid = input.next();
System.out.println("登陆密码");
String pwd = input.next();
String sqlLogin = "select * from emp where empno=? and pwd=?";
pstm = con.prepareStatement(sqlLogin);
//通过pstm对象给sql中?赋值
pstm.setString(1, uid);
pstm.setString(2, pwd);
rs = pstm.executeQuery();//执行select 使用executeQuery()
//判断结果集中是否有数据
if (rs.next()) {
System.out.println("登陆成功");
}else {
System.out.println("失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
查询表中全部信息:
package cn.jdbc.text;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class GetAllDept {
public static void main(String[] args) {
Connection con=null;
PreparedStatement pstm= null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/day7","root","cuichen975541045");
String sql = "select * from dept where loc like '大%'";
pstm = con.prepareStatement(sql);
rs = pstm.executeQuery();
//遍历rs
System.out.println("部门编号\t\t部门名称\t\t位置");
while(rs.next()) {
System.out.println(rs.getString("deptno")+"\t\t"+rs.getString("dname")+"\t\t"+rs.getString("loc"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs!=null) {
rs.close();
}
if(pstm!=null) {
pstm.close();
}
if (con!=null) {
con.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
总结:
1.JDBC 的API:
-
Driver 接口:代表驱动程序
-
DriverManager 类:驱动程序管理员
-
Connection 接口:代表数据库连接
-
Statement 、PreparedStatement、CallableStatement 接口:代表数据库操作对象
-
ResultSet 接口:代表结果集
-
DatabaseMetadata、ResultSetMetadata接口:代表元数据
-
Types 类:代表JDBC类型
2.程序分层:
- pojo :实体类(属性和get(),set()方法)
属性与表结构对应,作用 :传输数据 - dao: 数据访问层
数据的增删改查等方法 - view:视图层
接收用户输入、把数据展示给用户
3.步骤:
-
驱动jar:数据库厂商提供,下载,加载到当前项目下
-
反射:
Class.forName("com.mysql.jdbc.Driver");
把Driver驱动类里的各个成员封装成对象,加载到内存中,供JDBCapi调用 -
通过JDBC api 连接操作数据库
创建通道:Connection con= DriverManager.getConnection(url,username,pwd);
Statement
PreparedStatement pstm= con.prepareStatement(sql)
pstm.setString(1,);
-
执行:
insert update delete
int result= pstm.executeUpdate();
select
ResultSet rs=pstm.executeQuery();
while(rs.next()){
//读取当前指针指向行的数据
Dept d=new Dept();
d.setDeptno(rs.getInt(1));
}
- 关闭资源:后创建的先关闭