文章目录
1 软件下载
1.1 Mysql和Eclipse
Mysql和Eclipse的安装查看我的其他教程,这边说下JDBC的下载
1.2 驱动包
我们需要下载一个jar的数据库连接驱动包,点击下载 mysql-connector-java-5.1.39-bin.jar 到本地
2 新建数据
新建一个数据库 myshool
CREATE TABLE `grade` (
`gradeid` int(10) unsigned NOT NULL COMMENT '年级编号',
`gradename` char(10) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据
INSERT INTO `grade` VALUES ('3', '3年级');
INSERT INTO `grade` VALUES ('4', '4年级');
INSERT INTO `grade` VALUES ('5', '5年级');
INSERT INTO `grade` VALUES ('6', '6年级');
3 驱动包导入
- 新建工程后,找到自己的工程,右键 -> Properties
- 弹出的窗口中 -> Libraries -> Modulepath -> Add External JARs -> 找到你刚刚下载的jar文件,确认导入 -> Apply and close
- 这时候我们可以看到目录下多了Referenced Libraries文件,他底层下就是我们的jar包
4 具体实现配置连接
4.1 实现步骤
JDBC的流程:
- 加载驱动: DriverManager Class.forname("")加载驱动路径(“高版本”可以忽略①)
① java有一个SPI机制所以JVM会将jar包Meta-Inf\Services\某个接口中所定义的那个类自动加载到JVM;而高版本的驱动中就包含了service/xx -> com.mysql.jdbc.Driver - 建立连接:用DriverManager的方法getConnection获取数据库路径、账号和密码
- 获取PreparedStatement对象 PreparedStatement pstmt = conn.prepareStatement(sql);
- 发送/执行sql语句:把获得的连接CreateStatement方法发送给服务器
- 接受/处理结果集:得到数据库/服务器返回的结果集并处理,executeQuery处理sql语句
4.2 具体代码
在我们的Ecilipse中新建一个class类,写上如下代码,******是可以根据个人情况修改的
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestGradeDB {
//1. JDBC的驱动位置 + 数据库的位置
public final static String JDBC_Driver = "com.mysql.jdbc.Driver";
public final static String DB_Url = "jdbc:mysql://localhost:3308/myshool";
//2. 输入账号和密码
public final static String Username = "root";
public final static String Password = "root";
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn = null;//数据库的连接对象
Statement stmt = null;//statement连接对象
ResultSet rs = null;//结果集对象
try {
//1. 加载驱动
Class.forName(JDBC_Driver);
//2. 建立连接
conn = DriverManager.getConnection(DB_Url, Username, Password);
//3. 发送SQL语句
stmt = (Statement) conn.createStatement();
//4. 获得结果集
String sql = "select * from grade" ;
//String sql = "select * from grade" + " where gradeid =2";
rs = stmt.executeQuery(sql);
//5. 处理结果集
while (rs.next()) {
int gradeid = rs.getInt("gradeid");
String gradename = rs.getString("gradename");
//String
System.out.print("ID:"+gradeid);
System.out.println(" 姓名:"+gradename);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//6. 关闭(释放)资源
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行结果:
年级-班级
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TestGradeDB {
List<Grade> list = new ArrayList<Grade>();
Connection conn = null;// 数据库的连接对象
PreparedStatement ps = null;// statement连接对象
ResultSet rs = null;// 结果集对象
// 1. JDBC的驱动位置 + 数据库的位置
public final static String JDBC_Driver = "com.mysql.jdbc.Driver";
public final static String DB_Url = "jdbc:mysql://localhost:3308/myshool";
// 2. 输入账号和密码
public final static String Username = "root";
public final static String Password = "root";
//查询所有
public List<Grade> listGrade() {
try {
// 1. 加载驱动
Class.forName(JDBC_Driver);
// 2. 建立连接
conn = DriverManager.getConnection(DB_Url, Username, Password);
// 3. 发送SQL语句
String sql = "select * from grade";
ps = conn.prepareStatement(sql);
// 4. 获得结果集
rs = ps.executeQuery(sql);
// 5. 处理结果集
while (rs.next()) {
Grade grade = new Grade(rs.getInt("gradeId"),
rs.getString("gradeName"));
list.add(grade);
//防止对象空指向
grade = null;
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6. 关闭(释放)资源
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
//按年级编号查询
public Grade getGradeid(int gradeId) {
Grade grade = null;
try {
// 1. 加载驱动
Class.forName(JDBC_Driver);
// 2. 建立连接
conn = DriverManager.getConnection(DB_Url, Username, Password);
// 3. 发送SQL语句
String sql = "select * from grade where gradeid = ?";
ps = conn.prepareStatement(sql);
// 4. 获得结果集
ps.setInt(1, gradeId);
rs = ps.executeQuery();
// 5. 处理结果集
if (rs.next()) {
grade = new Grade(rs.getInt("gradeId"),
rs.getString("gradeName"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6. 关闭(释放)资源
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return grade;
}
//添加年级信息
public int addGrade(int gradeId, String gradeName) {
int result = -1;
try {
// 1. 加载驱动
Class.forName(JDBC_Driver);
// 2. 建立连接
conn = DriverManager.getConnection(DB_Url, Username, Password);
// 3. 发送SQL语句
String sql = "Insert into grade(gradeid,gradename) value(?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(1, gradeId);
ps.setString(2, gradeName);
// 执行添加数据
result = ps.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6. 关闭(释放)资源
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
//修改信息
public int updateGrade(Grade grade) {
int result = -1;
try {
// 1. 加载驱动
Class.forName(JDBC_Driver);
// 2. 建立连接
conn = DriverManager.getConnection(DB_Url, Username, Password);
// 3. 发送SQL语句
String sql = "update grade set gradename=? where gradeid=?";
ps = conn.prepareStatement(sql);
ps.setString(1,grade.getGradeName());
ps.setInt(2,grade.getGradeId());
// 执行添加数据
result = ps.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6. 关闭(释放)资源
try {
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
//删除年级信息
public int deleteGradeById(int gradeId) {
int result = -1;
try {
// 1. 加载驱动
Class.forName(JDBC_Driver);
// 2. 建立连接
conn = DriverManager.getConnection(DB_Url, Username, Password);
// 3. 发送SQL语句
String sql = "Delete From grade where gradeid = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, gradeId);
// 执行删除数据
result = ps.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 6. 关闭(释放)资源
try {
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
//主程序
public static void main(String[] args) {
//查询
TestGradeDB tg = new TestGradeDB();
// TODO Auto-generated method stub
tg.listGrade();
System.out.println("查询结果:");
System.out.println("年级编号\t年级名称");
for (Grade item : tg.list) {
System.out.println(item.getGradeId()+"\t"+item.getGradeName());
}
//查询年级编号为4 的信息
Grade grade = tg.getGradeid(4);
System.out.println("年级编号"+"\t年级名称");
System.out.println(grade.getGradeId() + "\t" +grade.getGradeName());
//添加数据
int result = tg.addGrade(2, "2新加");
if (result>0) {
System.out.println("添加成功");
}
//修改数据
int result = tg.updateGrade(new Grade(6,"很6的六年级"));
//删除年级信息
int result=tg.deleteGradeById(6);
}
}
package test;
/**
* Grade类
* @author administrator
*
*/
public class Grade {
private int gradeId;
private String gradeName;
public Grade() {
// TODO Auto-generated constructor stub
}
public Grade(int gradeId, String gradeName) {
super();
this.gradeId = gradeId;
this.gradeName = gradeName;
}
public int getGradeId() {
return gradeId;
}
public void setGradeId(int gradeId) {
this.gradeId = gradeId;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
}
附:JDBC相关资料
1 JDBC介绍
JDBC的定义:
JDBC是Java数据库连接技术,提供连接和操作各种常用数据库的能力
2 JDBC工作原理
3 JDBC API主要功能
- 与数据库建立连接
- 执行SQL语句
- 处理结果
结合上图:
作用 | 接口/类 | |
---|---|---|
DriverManager | 依据数据库的不同,管理JDBC驱动 | 类 |
Connection | 负责连接数据库并担任传送数据的任务 | 接口 |
Statement | 由Connection产生、负责执行SQL语句 | 接口 |
ResultSet | 返回展示结果集 | 接口 |
日后修改
1 方法作用
方法 | 功能 | 返回值类型 |
---|---|---|
getConn() | 得到一个连接对象 | Java.sql.Connection |
exUpdate(sql语句) | 增加、删除、修改通用代码 | Boolean:true 操作成功;false则失败 |
exQuery(Sql语句,Class cla,可变参数) | 通用查询 | 返回结果为List |
closeAll(rs.pstmt,conn) | 释放资源 | void无 |
object convert(ResultSet rs,Class cla ) | 结果集合对象转换 | object类型对象 |
2 接口和类的作用:
接口/类 | 作用 | |
---|---|---|
DriverManager | 类 | 获取连接对象:静态方法getConnection(url,user,password) |
Connection | 接口 | 连接特定数据库的接口,主要用于创建PrepareStatement: |
PreparedStatement | 接口 | 是具体执行增加修改删除查询的操作对象 |
ResultSet | 接口 | 完成查询结果的单次存储功能,不能来回滚动读取,翻译为结果集,非离线读取 |
3 Statement和PreparedStatement的联系和区别
联系 | 区别 | |
---|---|---|
1.PreparedStatement继承Statement | 1.PreparedStatement 可以使用占位符(也就是 ?),表示预编译的SQL语句的对象,Statement不能使用占位符,只能通过字符串的拼接来实现 | |
Statement/PreparedStatement | 2.SQL语句预编译并存储在PreparedStatement对象中 | 2.PreparedStatement批处理比Statement效率高 |
3. PreParedStatement和Statement都是接口,都可以实现对数据表的CRUD操作、增删改查 | 3.PreparedStatement更安全,能防止SQL注入(恶义SQL语法)。 | |
4.PreparedStatement可以实现操作Blob类型的数据3.PreparedStatement 可以实现相对于Statement的高效的批量插入 |
注:PreparedStatement是接口对象;prepareStatement()是方法