
JDBC -> 持久层框架(myBatis/hibernate)
java和数据库MySQL的连接(Connection)
以参数方式实现DML操作
实现查询
连接示意图
创建连接(没有指定数据库)public class ConnDemo {
public static void main(String[] args) {
// 连接操作, 本质就是在给Connection对象进行实例化
// 1. 准备驱动程序(mysql-connector-java)
//2. 引入到当前工程 Add as library
//3. 目的: 直接在程序中可以使用jar包中的类
// java 使用驱动(反射机制) 得到一个Connection实例
// 通过反射方式获取驱动的实例
// 5.1 com.mysql.jdbc.Driver
// 8.0 com.mysql.cj.jdbc.Driver
Connection connection = null;
try {
// 反射操作: 通过类的限定名在内存中加载, 并实例化
// DriverManager会自动执行, 所以该 步骤可以省略
Class.forName("com.mysql.jdbc.Driver");
//创建连接
// DriverManager : 驱动程序管理器
// 通过配置参数和数据库建立连接的过程中,DriverManager会自己在class中寻找合适的驱动程序
// http://www.baidu.com:80?
// 协议:mysql:jdbc:
// 地址:localhost/127.0,0,1
// 端口: 3306(可以省略, 默认)
// 参数部分: 参数之间用&连接
// 参数1: useSSL 是否使用SSL信任的加密连接方式
// 参数2:连接数据库使用的字符集
// 参数3 : 设置时区,设为CST(中国时区) UTC:国际标准
String url = "jdbc:mysql://localhost:3306?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
String username="root";
String password = "root";
connection = DriverManager.getConnection(url,username,password);
System.out.println("连接数据库成功");
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
指定数据库,并完成添加操作
public class PreparedStatDemo {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 连接地址中体现目标数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
String username="root";
String password = "root";
connection = DriverManager.getConnection(url,username,password);
System.out.println("连接数据库成功");
// 通过连接对象实例化命令对象
String sql = "insert into manager values(NULL,'张三丰',2)";
preparedStatement = connection.prepareStatement(sql);
// 执行SQL操作,返回影响的行数
int i = preparedStatement.executeUpdate();
System.out.println("i:"+i);
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
使用预编译方式实现添加
public class PreparedStatDemo2 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 连接地址中体现目标数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
String username="root";
String password = "root";
connection = DriverManager.getConnection(url,username,password);
System.out.println("连接数据库成功");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名");
String name = scanner.nextLine();
System.out.println("请选择部门 1.开发一部 2.开发二部");
int depId = scanner.nextInt();
// 通过连接对象实例化命令对象
// 不能用拼接方式
// String sql = "insert into manager values(NULL,'"+name+"',2)";
// 正确方式:使用?占位符
// 不需要判断数据的类型, 不能添加''
String sql = "insert into manager values(NULL,?,?)";
// 带着参数执行预编译
preparedStatement = connection.prepareStatement(sql);
// 传参
// 根据参数类型的不同, 选择不同的setXXX方法
// 参数的位置: 从1开始
preparedStatement.setString(1,name);
preparedStatement.setInt(2,depId);
// 如果没有传参, 则抛出异常: SQLException: No value specified for parameter 1
// 执行SQL操作,返回影响的行数
int i = preparedStatement.executeUpdate();
System.out.println("i:"+i);
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
查询场景分析:
带分页全查询
带条件的查询(登录)
精确查询
模糊查询
select * from tableName where phone like ?
prepStat.setObject(1,"%"+input+"%")
public class ResultSetDemo1 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 连接地址中体现目标数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
String username="root";
String password = "root";
connection = DriverManager.getConnection(url,username,password);
Scanner scanner = new Scanner(System.in);
System.out.println("请选择要查询部门 1.开发一部 2.开发二部");
int depId = scanner.nextInt();
//查询开发二部的所有的工作人员
String sql = "SELECt id,name 姓名,depid from manager where depid=?";
// 带着参数执行预编译
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1,depId);
// 查询方法: executeQuery()
// 返回类型 ResultSet
resultSet = preparedStatement.executeQuery();
// 从结果集中获取数据
// jdbc是通过游标(cursor)
// 每当游标向前滚动,并得到数据行之后
// 如果游标没有滚动, 就报错:Before start of result set
// get操作开始之前至少要滚动一次,否则就报错
// 当没有满足条件的数据, 结果集本身不为null, 只是没有数据
// 空结果集执行get操作报错:Illegal operation on empty result set.
boolean next = resultSet.next();
System.out.println("next:"+next);
if(next){
// int id = resultSet.getInt(1);
int id = resultSet.getInt("id");
System.out.println("id:"+id);
// 员工的姓名
// String name = resultSet.getString("name");
String name = resultSet.getString("姓名");
System.out.println("name:"+name);
}
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
从结果集中获得特征
public class ResultSetDemo2 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ResultSetmetaData metaData = null;
try {
// 连接地址中体现目标数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/bj268?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
String username="root";
String password = "root";
connection = DriverManager.getConnection(url,username,password);
String sql = "SELECt * from users";
// 带着参数执行预编译
preparedStatement = connection.prepareStatement(sql);
// 查询方法: executeQuery()
// 返回类型 ResultSet
resultSet = preparedStatement.executeQuery();
// 获取结果集中的元数据类型
metaData = resultSet.getmetaData();
// 结果集的字段的总数
int columnCount = metaData.getColumnCount();
// 循环打印所有的字段名
for (int i=1;i<=columnCount;i++){
System.out.print(metaData.getColumnLabel(i)+"t");
}
// 增加一个换行
System.out.println();
while(resultSet.next()){
// 循环获得每个字段的值
// 参考查询语句, 判断出字段的情况
for (int i=1;i<=columnCount;i++){
System.out.print(resultSet.getObject(i)+"t");
}
System.out.println();
}
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
把查询操作和集合结合
User.java:
public class User implements Serializable {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
'}';
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
}
public class ResultSetDemo3 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ResultSetmetaData metaData = null;
try {
// 连接地址中体现目标数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/bj268?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
String username="root";
String password = "root";
connection = DriverManager.getConnection(url,username,password);
String sql = "SELECt * from users";
// 带着参数执行预编译
preparedStatement = connection.prepareStatement(sql);
// 查询方法: executeQuery()
// 返回类型 ResultSet
resultSet = preparedStatement.executeQuery();
// 获取结果集中的元数据类型
metaData = resultSet.getmetaData();
// 结果集的字段的总数
int columnCount = metaData.getColumnCount();
List users = new ArrayList<>();
// 游标滚动,遍历结果集
while(resultSet.next()){
// 有数据, 就生成一个User对象
User user = new User();
// 获取目标字段的值, 注入到User对象中对应的字段
user.setId(resultSet.getInt(1));
user.setName(resultSet.getString(2));
// 把对象添加到集合中
users.add(user);
}
System.out.println(users);
} catch (ClassNotFoundException e) {
System.out.println("驱动程序不存在");
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
注意:回收时要与创建相颠倒