1、JDBC概述
a、Java DataBase Connectivity Java 数据库连接技术
b、顾名思义:就是用过java语言操作数据库,操作表中的数据
c、是官方定义的一套操作所有关系型数据库的规则(接口)
1、在java中想要访问数据库只能通过JDBC
2、JDBC是java访问数据的基础,其他数据访问技术都是对JDBC的封装(hb,mb)
3、JDBC是为了访问不同的数据库,提供了一种同一的访问方式
4、JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,接口的实现由各大厂商来实现
实现步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar1.复制mysql-connector-java-5.1.37-bin.jar到项目的lib目录下2.右键-->Add As Library2. 注册驱动(安装驱动)3. 获取数据库连接对象 Connection4. 定义sql5. 获取执行sql语句的对象 Statement6. 执行sql,接受返回结果7. 处理结果8. 释放资源
2、JDBC api介绍
DriverManager:
注册驱动:
使用registerDriver注册驱动static void registerDriver(Driver driver);registerDriver(new Driver());使用反射注册驱动Class.forName("com.mysql.jdbc.Driver");
获取数据库连接:
static Connection getConnection(String url,String user,String password)url:指定连接的路径jdbc:mysql://localhost:3306/数据库名称若是连接本地则可简写:jdbc:mysql:///数据库名user:用户名password:密码
Connection:
获取sql语句执行对象和事务管理对象
1、点一个Statement对象,用于将SQL语句发送到数据库
2、点一个PreparedStatement,用于将参数化的SQL语句发送到数据库
事务管理:
1、点一个setAutoCommit(false)设置成手动提交
2、点一个commit()提交事务
3、点一个rollback()回滚事务
Statement:
用于执行静态SQL语句并返回其生成的结果的对象
1、点一个execute(sql),可执行任意的sql语句
2、点一个executeUpdate(sql),执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句
3、点一个executeQuery(sql),执行DQL(select)语句
ResultSet:
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
1、点一个next(),将光标向前移一位,返回值为true代表有数据,false代表没数据
2、点一个getXxx(i),若i是整数则代表获取该列的值,若是字符串,则获取该字符串命名的列的值
3、点一个getObject(列名),根据列名获取所有列的类型的值
3、CRUD操作
编写步骤:
1、注册驱动2、建立连接3、编写sql4、获取sql执行对象5、执行sql对象并返回结果6、处理结果7、释放资源
添加数据:
public class JDBCInsert {public static void main(String[] args) throws Exception {// 1.注册驱动Class.forName("com.mysql.jdbc.Driver");// 2.建立连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");// 3.编写sql(在java编写sql 结尾;可以省略)String sql = "insert into account values(4,'lucy',1000)";// 4.获取sql执行对象Statement statement = connection.createStatement();// 5.执行sql并返回结果int i = statement.executeUpdate(sql);// 6.处理结果System.out.println(i);// 7.释放资源statement.close();connection.close();}}
修改数据:
public class JDBCUpdate {public static void main(String[] args) throws Exception {// 1.注册驱动Class.forName("com.mysql.jdbc.Driver");// 2.建立连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");// 3.编写sqlString sql = "update account set name = '松岛枫' where id = 4";// 4.获取sql执行对象Statement statement = connection.createStatement();// 5.执行sql并返回结果int i = statement.executeUpdate(sql);// 6.处理结果if (i>0) {System.out.println("修改成功");}else{System.out.println("修改失败");}// 7.释放资源statement.close();connection.close();}}
删除数据:
public class JDBCDelete {public static void main(String[] args) throws Exception {// 1.注册驱动Class.forName("com.mysql.jdbc.Driver");// 2.建立连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");// 3.编写sqlString sql = "delete from account where id = 4";// 4.获取sql执行对象Statement statement = connection.createStatement();// 5.执行sql并返回结果int i = statement.executeUpdate(sql);// 6.处理结果if (i>0) {System.out.println("修改成功");}else{System.out.println("修改失败");}// 7.释放资源statement.close();connection.close();}}
查询数据:
package com.smiledog.domain;public class Account {private int id;private String name;private Double money;// 有参无参构造....// get和set方法....// toString()...}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~public class JDBCQuery{public static void main(String[] args) throwes Exception{ArrayList<Account> list = new ArrayList<>();// 1.注册驱动Class.forName("com.mysql.jdbc.Driver");// 2.建立连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day23", "root", "root");// 3.编写sqlString sql = "select * from account";// 4.获取sql执行对象Statement statement = connection.createStatement();// 5.执行sql并返回结果ResultSet resultSet = statement.executeQuery(sql);// 6.处理结果Account account = null;while (resultSet.next()) {// 获取数据int id = resultSet.getInt("id");String name = resultSet.getString("name");double money = resultSet.getDouble("money");account = new Account();account.setId(id);account.setName(name);account.setMoney(money);list.add(account);}// 7.释放资源resultSet.close();statement.close();connection.close();// 遍历集合代码省略............}}
4、JDBC工具类编写
工具类呢,就是把一些重复的代码提取出来,能提取多少提取多少,整合到一个类里边,合理的编排,定义方法供外界调用。
不改变的代码可以提取,一致变得代码也可以提取,把一些一直改变的数据整合到一个集合里,改动代码只需要改动集合里的代码就行了,比如(properties集合)
JDBC工具类:
package com.smiledog.jdbc.demo.Util;/*@ClassName Util@Author SmILeDog@Date 2021/5/20@Time 14:44*/import java.io.InputStream;import java.sql.*;import java.util.Properties;public class JDBCUtil {private JDBCUtil() {}private static Connection conn; //数据库连接对象private static Statement stat = null; //sql执行对象private static String driver = null; //驱动对象private static String url = null; //数据库连接信息private static String user = null; //数据库用户名private static String password = null; //数据库用户名密码private static String sql = null; //待执行的增删改的sql语句private static String querysql = null; //待执行的查询sql语句static{try {//读取配置文件Properties pro = new Properties();//方法一:直接读取配置文件// pro.load(new FileReader("day01_jdbc\\src\\jdbc.properties"));// 方法一:使用类加载器,进行读取配置文件InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");//方法三:java提供的专门获取jdbc配置文件的类//ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");pro.load(is); //读取配置文件driver = pro.getProperty("driverName"); //读取驱动url = pro.getProperty("url"); //读取urluser = pro.getProperty("user"); //读取同户名password = pro.getProperty("password"); //读取密码sql = pro.getProperty("sql"); //读取增删改的sql语句querysql = pro.getProperty("querysql"); //读取查询的sql语句Class.forName(driver); //注册驱动conn = DriverManager.getConnection(url, user, password); //获取数据库连接对象//想想,没必要再搞这个了,上边获取到conn了,直接可以在那边获取就//stat = conn.createStatement(); //获取sql语句执行对象} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection(){return conn;}//获取sql执行对象//public static Statement getStatement(){// return stat;//}//获取增删改sql执行语句public static String getSql(){return sql;}//获取查询的sql执行语句public static String getQuerySql(){return querysql;}//获取释放资源public static void getClose(Connection conn, Statement stat, ResultSet res){if(stat != null){try {stat.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}if(res != null){try {res.close();} catch (SQLException e) {e.printStackTrace();}}}}~~~~~~~~~~~~~~jdbc.properties~~~~~~~~~~~~~~~~~driverName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/库名?characterEncoding=utf-8user=rootpassword=1234sql=s增删改sql语句;querysql=查询语句;
5、事务操作
一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
使用Connection对象来管理事务
1、开启事务
点一个setAutoCommit()事务,设置为false,即开始事务
注意:在执行sql之前开启事务
2、提交事务
点一个commit(),提交事务
注意:当所有的sql语句都执行完提交事务
3、回滚事务
点一个rollback(),回滚事务
注意:在catch中回滚事务
JDBC事务演示:
public class JDBCTX{public static void mian(String[] args){Connection connection = null;Statement statement = null;try {// 1.获取连接【JdbcUtils工具类】connection = JdbcUitls.getConnection();// 2.开启事务connection.setAutoCommit(false);tatement = connection.createStatement();// 3.罗志祥扣钱// 机器故障// 4.蝴蝶姐加钱// 5.提交事务connection.commit();} catch (Exception e) {try {// 6.回滚事务connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}} finally {// 7.释放资源JdbcUitls.close(statement, connection);}}}
6、用户登录案例
案例需求:
1、通过键盘录入用户名和密码
2、判断用户是否登录成功
数据准备:
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT, -- 主键IDusername VARCHAR(32), -- 用户名PASSWORD VARCHAR(32) -- 密码);-- 添加数据INSERT INTO USER VALUES(NULL,'zhangsan','123');INSERT INTO USER VALUES(NULL,'lisi','234');
代码实现:
package com.smiledog.jdbc.test;/*@ClassName LoginTest@Author SmILeDog@Date 2021/5/20@Time 19:21*/import com.smiledog.jdbc.test.Util.JDBCUtil;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;public class LoginTest {public static void main(String[] args) throws SQLException {boolean b = false;Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String uname = sc.nextLine();System.out.println("请输入密码:");String pwd = sc.nextLine();Connection conn = JDBCUtil.getConnection();Statement stat = conn.createStatement();ResultSet res = stat.executeQuery(JDBCUtil.getQuerySql());while (res.next()) {String username = res.getString("username");String password = res.getString("password");if (username.equals(uname) && password.equals(pwd)){b = true;}}if (b){System.out.println("登录成功!");}else{System.out.println("用户名或密码错误!");}JDBCUtil.getClose(conn,stat,res);}}
