网络公司 开发网站,网站创建app,温州快速排名优化,有保障的无锡网站制作JDBC(重点)
数据库驱动 程序会通过数据库驱动#xff0c;和数据库打交道。
sun公司为了简化开发人员对数据库的统一操作#xff0c;提供了一个Java操作数据库的规范。这个规范由具体的厂商去完成。对应开发人员来说#xff0c;只需要掌握JDBC接口。 熟悉java.sql与javax.s…JDBC(重点)
数据库驱动 程序会通过数据库驱动和数据库打交道。
sun公司为了简化开发人员对数据库的统一操作提供了一个Java操作数据库的规范。这个规范由具体的厂商去完成。对应开发人员来说只需要掌握JDBC接口。 熟悉java.sql与javax.sql包导入一个数据库驱动包
1.在数据库中提前创建users表准备连接jdbc 2.查询数据库版本下载对应jar包。 3.将jar包导入项目。 4.导入jar后需要添加到库里面。如下操作 5.不需要更改信息直接点击ok。 6.创建项目连接数据库
加载驱动提供用户信息与url 连接地址ssl连接关闭字符集为utf-8时区设置 连接数据库DriverManager 执行SQL对象 Statement对象使用sql语言执行sql对象释放连接
//加载驱动Class.forName(com.mysql.cj.jdbc.Driver);//固定写法//用户信息和url,url基本格式如下://连接地址ssl连接关闭字符集为utf-8时区设置String urljdbc:mysql://localhost:3306/learndb?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneGMT%2B8;String usernameroot;String password123456;//连接成功会返回数据库对象 Connection代表数据库Connection connection DriverManager.getConnection(url, username, password);//执行SQL的对象 StatementStatement statement connection.createStatement();//执行SQL的对象去执行SQl,可能存在结构查看返回结果String sqlSELECT * from users;ResultSet resultSet statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部的查询结果while (resultSet.next()){System.out.println(idresultSet.getObject(id));System.out.println(nameresultSet.getObject(name));System.out.println(pwdresultSet.getObject(password));System.out.println(emailresultSet.getObject(email));System.out.println(birthresultSet.getObject(birthday));}//释放连接resultSet.close();statement.close();connection.close();} JDBC对象分析
DriverManger //加载驱动法一 DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); //法二 Class.forName(com.mysql.cj.jdbc.Driver); //固定写法 //connection是数据库 //数据库设置为自动提交、事务提交、事务回滚 connection.rollback(); connection.commit(); connection.setAutoCommit(); URL
mysql默认 端口号为3306url写法
jdbc://mysql:/主机地址:端口号/数据库名参数1参数2参数3 String urljdbc:mysql://localhost:3306/learndb?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneGMT%2B8; Statement 执行类执行SQL的对象 //编写SQL String sqlSELECT * from users; //可执行的方法 statement.executeQuery(); //执行查询返回一个结果集 statement.execute() //执行任何SQL statement.executeUpdate() //执行更新、插入、删除返回一个受影响的行数 ResultSet查询结果集封装了所有的查询结果
获得指定的数据类型 resultSet.getObject(); //在不知道列类型的情况下使用 resultSet.getstring(); //如果知道列的类型就使用指定的类 resultSet.getInt(); resultSet.getFloat(); resultSet.getDate(); resultSet.getObject(); 遍历、指针 resultSet.beforeFirst(); //移动到最前面 resultSet.afterLast(); //移动到最后面 resultSet.next(); //移动到下一个数据 resultSet.previous(); //移动到前一行 resultSet.absolute(); //移动到指定行 释放资源
resultSet.close(); statement.close(); connection.close(); //耗资源、用完即关
statement对象
jdbc中的statement对象用于向数据库发送SQL语句想完成对数据库的增删查改只需要通过这个对象想数据库发送增删改查语句即可。
Statement对象的executeUpdate方法用于向数据库发送增、删、改的sql语句executeUpdate执行完后将回返回一个整数即增删改语句导致了数据库几行是数据发生了变化。
Statement.excuteQuery方法用于向数据库发送查询语句executeQuery方法返回代表查询结果的ResultSet对象。 前提
在src目录下创建资源文件在该文件内部填写数据库用户信息与url等资源信息。 创建一个工具类,完成加载驱动、连接数据库、释放资源等作用。 //工具类
public class JdbcUtils {//提升作用域private static String drivernull;private static String urlnull;private static String usernamenull;private static String passwordnull;static {try{//通过反射获得具体的资源。getResourceAsStream(db.properties)从该文件获得资源//读取信息InputStream in JdbcUtils.class.getClassLoader().getResourceAsStream(db.properties);Properties properties new Properties();properties.load(in);//获取具体的资源driverproperties.getProperty(driver);urlproperties.getProperty(url);usernameproperties.getProperty(username);passwordproperties.getProperty(password);//驱动只用加载一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//获取连接的方法public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url,username,password);}//释放连接资源的方法public static void release(Connection conn, Statement st, ResultSet rs){if (rs!null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (st!null){try {st.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (conn!null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}代码详解
1.获取资源、加载驱动、连接数据库 增删改的方法都用executeUpdate
插入数据
//插入数据
public class TestInsert {public static void main(String[] args) {//提升作用域Connection connnull;Statement stnull;ResultSet rsnull;try {conn JdbcUtils.getConnection();//获取数据库连接stconn.createStatement();//获取sql的执行对象String sqlinsert into users(id,name,password,email,birthday) values(4,serenity,123456,4563qq.com,2020-01-01);int ist.executeUpdate(sql);//执行sql代码完成更新表返回的结果为受影响的行数if (i0){System.out.println(插入成功);}} catch (SQLException throwables) {throwables.printStackTrace();}finally {JdbcUtils.release(conn,st,rs);//调用工具类释放资源}}
} 插入成功标志 删除数据
主要是更改sql代码 //删除数据
public class TestDelete {public static void main(String[] args) {//提升作用域Connection connnull;Statement stnull;ResultSet rsnull;try {conn JdbcUtils.getConnection();//获取数据库连接stconn.createStatement();//获取sql的执行对象String sqlDELETE FROM users where id4;int ist.executeUpdate(sql);//执行sql代码完成更新表返回的结果为受影响的行数if (i0){System.out.println(删除成功);}} catch (SQLException throwables) {throwables.printStackTrace();}finally {JdbcUtils.release(conn,st,rs);//调用工具类释放资源}}
} 更改数据 查看数据:利用executeQuery PrepareStatement对象
PrepareStatement可以防止SQL注入效率更好。把传递进来的参数当做字符
假设参数中存在转义字符如引号会被直接转义。
新增 删除 更新 查询 idea连接数据库 若未成功可修改版本。 连接上数据库后 选择数据库后可双击打开数据库表中查看信息。 事务
要么都成功要么都失败
ACID原则
原子性要么全部完成要么都不完成一致性总数不变隔离性多个进程互不干扰持久性一旦提交不可逆持久化到数据库
隔离性的问题
脏读一个事务读取另一个没有提交的事务
不可重复读在同一个事务内重复读取表中的数据表数据发生了改变
虚读幻读在一个事务内读取到了别人插入的数据导致前后读出来结果不一致
前提 模拟事务A给B转账
public class TestTransation01 {public static void main(String[] args) {Connection connnull;PreparedStatement stnull;ResultSet rsnull;try {//加载驱动conn JdbcUtils.getConnection();//关闭数据库的自动提交自动会开启事务conn.setAutoCommit(false);//开启事务//模拟A给B转账String sql1update account set moneymoney-100 where nameA;stconn.prepareStatement(sql1);st.executeUpdate();String sql2update account set moneymoney100 where nameB;stconn.prepareStatement(sql2);st.executeUpdate();//业务完毕提交事务conn.commit();System.out.println(成功);} catch (SQLException throwables) {try {conn.rollback();//如果失败则回滚事务} catch (SQLException e) {e.printStackTrace();}throwables.printStackTrace();}finally {//释放资源JdbcUtils.release(conn,st,rs);}}
}代码解释 模拟事务A与B转账出现异常