Java连接数据库-jbdc
什么是jbdc
基本概念
关系图
操作步骤
jdbc 下载地址
bsq2
jdbc 使用步骤
获取连接器
项目中新建一个lib目录
设置lib 目录为库目录
让开放环境知道去哪里找相关文件
选中lib 目录右键它,选择 Add as Libary
注册驱动
获取连接对象
定义sql 语句和获取执行者
操作示例
实战编码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/hpschool";
Connection connection = DriverManager.getConnection(url, "root", "root");
Statement statement = connection.createStatement();
String sql = "INSERT INTO teacher VALUES(NULL,\"赵云\",\"龙胆\",\"2011-1-3\")";
int i = statement.executeUpdate(sql);
System.out.println(i);
}
}
jdbc 操做详解
相关对象
注册驱动
获得连接对象
连接对象的常用方法
执行者对象的相关方法
演练
增
删
改
查询结果集对象的使用
读取一行数据
读取所有行的数据
演练 查
import java.sql.*;
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得连接对象
String connStr = "jdbc:mysql://localhost:3306/db11070326";
String user = "root";
String pass = "root123";
Connection conn = DriverManager.getConnection(connStr, user, pass);
// 获取执行者
Statement stmt = conn.createStatement();
// 新建sql 语句
String sql = "SELECT * FROM teacher;";
ResultSet rs = stmt.executeQuery(sql);
// 让指针往下走
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String phone = rs.getString("phone");
String skill = rs.getString("skill");
String res = String.format("编号:%s,姓名:%s,电话:%s,专业:%s",id,name,phone,skill);
System.out.println(res);
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
}
}
事务操作
jbdc 工具类
分布代码
演练
工具类编写
阶段一
方式一
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCUtils {
public static Connection getConnection() {
// 定义返回值
Connection conn = null;
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 准备数据,连接字符串,用户名,密码
String connStr = "jdbc:mysql://localhost:3306/db11070326";
String user = "root";
String pass = "root123";
// 获取连接对象
conn = DriverManager.getConnection(connStr, user, pass);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
// 返回连接对象
return conn;
}
}
方式二
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
public static Connection getConnection() throws IOException {
// 获取双列集合
Properties properties = new Properties();
// 获得字符数据流对象
FileReader fileReader = new FileReader("setting.properties");
properties.load(fileReader);
String connStr = properties.getProperty("url");
String user = properties.getProperty("user");
String pass = properties.getProperty("pass");
// 关闭字符输入流对象
fileReader.close();
// 定义返回值
Connection conn = null;
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 准备数据,连接字符串,用户名,密码
// 获取连接对象
conn = DriverManager.getConnection(connStr, user, pass);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
// 返回连接对象
return conn;
}
}
利用properties集合存数据
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class pro集合 {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
// 存值
properties.setProperty("user","root");
properties.setProperty("pass","root123");
properties.setProperty("url","jdbc:mysql://localhost:3306/db11070326");
// 定义个字符流
FileWriter fileWriter = new FileWriter("setting.properties");
//
properties.store(fileWriter,null);
properties. close();
}
}
利用properties集合读数据
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class pro读数据 {
public static void main(String[] args) throws IOException {
// 实例化一个双列集合
Properties properties = new Properties();
// 字符输入流
FileReader fileReader = new FileReader("setting.properties");
// 加载数据
properties.load(fileReader);
String user = properties.getProperty("user");
String pass = properties.getProperty("pass");
String url = properties.getProperty("url");
System.out.println(user+pass+url);
fileReader.close();
}
}
静态方法块
阶段二
快捷键:Ctrl + Ait +T
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
// 获取双列集合
private static Properties properties = new Properties();
static {
try {
// 获得字符数据流对象
FileReader fileReader = new FileReader("setting.properties");
properties.load(fileReader);
// 关闭字符输入流对象
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
// 定义返回值
Connection conn = null;
try {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 准备数据,连接字符串,用户名,密码
String connStr = properties.getProperty("url");
String user = properties.getProperty("user");
String pass = properties.getProperty("pass");
// 获取连接对象
conn = DriverManager.getConnection(connStr, user, pass);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
// 返回连接对象
return conn;
}
}
配置文件
#Thu Apr 07 16:14:58 CST 2022
pass=root123
user=root
url=jdbc\:mysql\://localhost\:3306/db11070326
安全执行者
安全问题 sql 注入
prepareStatement
模型
会出安全问题的代码
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class TestLogin {
public static void main(String[] args) throws SQLException {
// 扫描仪
Scanner scanner = new Scanner(System.in);
boolean isLosing = false;
// 欢迎语句
System.out.println("欢迎你");
System.out.println("请输入用户名:");
String user = scanner.next();
System.out.println("请输入密码:");
String pass = scanner.next();
// 拿数据去查
// 使用JDBC去查
Connection conn = JDBCUtils.getConnection();
// 获取执行者
Statement stmt = conn.createStatement();
String sql = String.format("SELECT * FROM `user` WHERE uname = '%s' AND pwd = '%s';", user, pass);
ResultSet rs = stmt.executeQuery(sql);
// 这里只做判断
if (rs.next()) {
System.out.println("登录成功");
isLosing = true;
} else {
System.out.println("登录失败");
}
// 关闭资源
JDBCUtils.close(conn, stmt, rs);
Connection conn2 = JDBCUtils.getConnection();
Statement stmt2 = conn2.createStatement();
// 登录成功获取是失败
if (isLosing){
// 登录成功要做的事情
sql = "SELECT s.name AS sname,s.gender,t.name AS tname,t.skill FROM student AS s INNER JOIN teacher AS t ON s.tid = t.id;";
ResultSet rs2 = stmt2.executeQuery(sql);
// 遍历
while (rs2.next()){
String sname = rs2.getString("sname");
String gender = rs2.getString("gender");
String tname = rs2.getString("tname");
String skill = rs2.getString("skill");
// 打印数据
String con = String.format("姓名:%s,性别:%s,老师:%s,老师技能:%s",sname,gender,tname,skill);
System.out.println(con);
}
// 关闭资源
JDBCUtils.close(conn2, stmt2, rs2);
}else {
// 登录失败要做的事情
System.out.println("获取失败");
}
}
}
修改后的代码
import java.sql.*;
import java.util.Scanner;
public class TestLogin {
public static void main(String[] args) throws SQLException {
// 扫描仪
Scanner scanner = new Scanner(System.in);
boolean isLosing = false;
// 欢迎语句
System.out.println("欢迎你");
System.out.println("请输入用户名:");
String user = scanner.next();
System.out.println("请输入密码:");
String pass = scanner.next();
// 拿数据去查
// 使用JDBC去查
Connection conn = JDBCUtils.getConnection();
// 获取执行者
Statement stmt = conn.createStatement();
// String sql = String.format("SELECT * FROM `user` WHERE uname = '%s' AND pwd = '%s';", user, pass);
String sql = "SELECT * FROM `user` WHERE uname = ? AND pwd = ?";
PreparedStatement ptmt = conn.prepareStatement(sql);
// serString(?的下标,变量)
ptmt.setString(1,user);
ptmt.setString(2,pass);
ResultSet rs = ptmt.executeQuery();
// 这里只做判断
if (rs.next()) {
System.out.println("登录成功");
isLosing = true;
} else {
System.out.println("登录失败");
}
// 关闭资源
JDBCUtils.close(conn, stmt, rs);
Connection conn2 = JDBCUtils.getConnection();
Statement stmt2 = conn2.createStatement();
// 登录成功获取是失败
if (isLosing){
// 登录成功要做的事情
sql = "SELECT s.name AS sname,s.gender,t.name AS tname,t.skill FROM student AS s INNER JOIN teacher AS t ON s.tid = t.id;";
ResultSet rs2 = stmt2.executeQuery(sql);
// 遍历
while (rs2.next()){
String sname = rs2.getString("sname");
String gender = rs2.getString("gender");
String tname = rs2.getString("tname");
String skill = rs2.getString("skill");
// 打印数据
String con = String.format("姓名:%s,性别:%s,老师:%s,老师技能:%s",sname,gender,tname,skill);
System.out.println(con);
}
// 关闭资源
JDBCUtils.close(conn2, stmt2, rs2);
}else {
// 登录失败要做的事情
System.out.println("获取失败");
}
}
}
数据为连接池
模型
概念
DataSource 连接
具体操作
实际演练
1 导包
2 配置文件
注意修改数据库和用户名密码
3 代码编写
显示这个就成功了
这里把 ComboPooledDataSource 修改成 DataSource
使用自定义配置
Druid 数据库连接池技术
druid.properties 配置如下
实际操作
JDBC Template
JDBC Template入门
增删改
先导包
减压
lib 目录要自己创建,前面有具体操作
如果识别成功前面会有小箭头,没有就重启软件
修改我们额工具类 添加一个获取数据源 getDataSource
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
// 连接池
private static DataSource ds = null;
// 获取双列集合
private static Properties properties = new Properties();
static {
Properties pro = new Properties();
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
try {
pro.load(is);
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
// 定义返回值
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 返回连接对象
return conn;
}
// 获取数据源
public static DataSource getDs(){
return ds;
}
// 关闭连接对象
public static void close(Connection conn){
// 判断连接对象是否为空
if (conn == null){
return;
}
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 关闭连接对象和执行者
public static void close(Connection conn, Statement stmt){
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
close(conn);
}
// 关闭连接对象和执行者
public static void close(Connection conn, Statement stmt, ResultSet rs){
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
close(conn,stmt);
}
}
使用效果
首先获得JDBCTemplate 的对象 括号里放一个数据源 ds(DataSource)
相比之前的操作少了好多代码
查操作
接下来是查操作
现在用安全执行者,查询的很麻烦
单个数据
实际操作
package D3;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.Map;
public class TestCHa {
public static void main(String[] args) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
String sql = "SELECT * FROM teacher WHERE id = ?";
int n = 2;
// 掉查询方法
Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql, n);
System.out.println(stringObjectMap);
Object id = stringObjectMap.get("id");
System.out.println(id);
}
}
多个数据就是 数组包列表
多个数据
效果
package D3;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
public class TestCHa {
public static void main(String[] args) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
String sql = "SELECT * FROM teacher WHERE id > ?";
int n = 0;
// 掉查询方法
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, n);
System.out.println(maps);
}
}
获取集合中单个数据
关于Java bean
具体代码如下
注意:要提供类,类如下
类要提供属性封装、提供共有方法、提供构造方法和提供字符串显示输出
package D3;
public class Teacher {
// 属性的封装
private int id;
private String name;
private String phone;
private String skill;
public Teacher() {
}
public Teacher(int id, String name, String phone, String skill) {
this.id = id;
this.name = name;
this.phone = phone;
this.skill = skill;
}
// 提供字符串显示
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", skill='" + skill + '\'' +
'}';
}
// 提供共有方法
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 getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
演练代码:
package D3;
import Zuoye02.JDBCUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
// 注意要修改数据库
// 欢迎语句
System.out.println("你好");
// 获取连接对象
Connection conn = Zuoye02.JDBCUtils.getConnection();
// 定义sql 语句
String sql = "SELECT * FROM teacher;";
// 定义一个单列集合存放数据
ArrayList<Teacher> teacherArrayList = new ArrayList<>();
// 获取执行者
try {
System.out.println(conn);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String phone = rs.getString("phone");
String skill = rs.getString("skill");
Teacher teacher = new Teacher(id,name,phone,skill);
teacherArrayList.add(teacher);
}
System.out.println(teacherArrayList.size());
// 关闭连接对象
JDBCUtils.close(conn,stmt,rs);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
JDBC 使用 Java Bean
先定义一个规则,然后利用这个规则查询
首先要有一个 类
public class Teacher {
// 属性的封装
private int id;
private String name;
private String phone;
private String skill;
public Teacher() {
}
public Teacher(int id, String name, String phone, String skill) {
this.id = id;
this.name = name;
this.phone = phone;
this.skill = skill;
}
// 提供字符串显示
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", skill='" + skill + '\'' +
'}';
}
// 显示输出
public void showInfo(){
System.out.println(id+"\t"+name+"\t"+phone+"\t"+skill);
}
// 提供共有方法
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 getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
在定义一个规则
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TeacherRowMapper implements RowMapper<Teacher> {
@Override
public Teacher mapRow(ResultSet resultSet, int i) throws SQLException {
// 获取当前行的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String phone = resultSet.getString("phone");
String skill = resultSet.getString("skill");
// 实例化一个老师对象
Teacher teacher = new Teacher();
teacher.setId(id);
teacher.setName(name);
teacher.setPhone(phone);
teacher.setSkill(skill);
return teacher;
}
}
测试
效果
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class Test {
public static void main(String[] args) {
// 目标,得到对象集合
// 得到对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
// 定义一个sql语句,查询所有
String sql = "select * from teacher;";
// 获取一个对象 关系映射对象
TeacherRowMapper teacherRowMapper = new TeacherRowMapper();
// 开始查询
List<Teacher> teacherList = jdbcTemplate.query(sql, teacherRowMapper);
System.out.println(teacherList);
// [老师对象1,老师对象n]
// 获取第0号数据
Teacher t_zly = teacherList.get(0);
t_zly.showInfo();
}
}
简洁版本如下:
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
// 获得 jt
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
// SQL
String sql = "select * from teacher";
// 查询
List<Teacher> teacherList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Teacher>(Teacher.class));
System.out.println(teacherList);
}
}
查询,总计录数
用户聚合函数的查询
import org.springframework.jdbc.core.JdbcTemplate;
public class TestShuJu {
public static void main(String[] args) {
// 获得 jt
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
// SQL
String sql = "select count(1) from teacher";
Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println("一共有多少个老师:"+integer);
}
}
小结
步骤1
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TeacherRowMapper implements RowMapper<Teacher> {
@Override
public Teacher mapRow(ResultSet resultSet, int i) throws SQLException {
// 获取当前行的数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String phone = resultSet.getString("phone");
String skill = resultSet.getString("skill");
// 实例化一个老师对象
Teacher teacher = new Teacher();
teacher.setId(id);
teacher.setName(name);
teacher.setPhone(phone);
teacher.setSkill(skill);
return teacher;
}
}
自义定映射对象
步骤2
示例
查询的结果是对象集合
利用系统提供的自动映射对象