时间:2021-07-01 10:21:17 帮助过:16人阅读
1、加载驱动 Class.forName("");
2、用户信息和url
3、连接数据库 DriverManager.getConnection();
4、创建一个执行sql的对象 Statement
5、sql语句用statement执行 stat.executeQuery()执行查询语句 stat.executeUpdate()执行update insert delete等操作
6、加载结果集数据
7、关闭连接 从下到上
JAVA万物皆对象,所以将这些操作都整合成为对象来进行操作。
四、详解JDBC-->JAVA中的对象
1、DriverManager
//DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url,username,password);
//Connection代表数据库 用数据库写的代码它都能写 他就是数据库的对象
//数据库设置自动提交
//事务提交 事务回滚
conn.commit();
conn.rollback();
conn.setAutoCommit();//设置自动连接 //推荐使用Class.forName 加载驱动 //上面那个是注册驱动,在Driver()方法中的静态代码块中已经给注册了一个驱动,可能出现重读注册驱动 /* static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can‘t register driver!"); } } */
2、URL
String url = "jdbc:mysql://localhost:3306/jzspace?useUnicode=true&characterEncoding=utf8&useSSL=true"; /* jdbc:mysql://localhost:3306 直接看作是一个网址 jdbc:mysql看作是https这种协议 localhost 看作主机名 3306 看作端口号 公式:协议://主机地址:端口号/数据库名?参数1&参数2&参数3 oracle的写法: jdbc:oracle:thin:@localhost:1521:sid */
3、Statement执行SQL的对象 PrepareStatement执行SQL的对象
String sql = "select * from users";//编写sql statement.executeQuery();//查询操作返回结果集ResultSeet statement.execute();//执行任何sql statement.executeUpdate();//更新,插入,删除都使用这个,返回一个受影响的行数
4、ResultSet 结果集 只有查询操作才有结果集 封装了所有的查询结果
//在不知道列类型的情况下使用getObject() resultSet.getObject(); //如果知道列类型就使用指定的类型 resultSet.getString(); resultSet.getInt(); resultSet.getFloat(); resultSet.getDate(); //...
5、遍历结果集
resultSet.next();//移动到下一个数据
6、释放资源
resultSet.close(); stat.close(); conn.close();//十分耗资源,用完关掉!
五、详解Statement对象
Jdbc中的statement对象适用于向数据库发送sql语句,像完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查的语句即可。
Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,execcuteUpdate执行完后,将会返回一个整数(即增删改语句导致数据库几行数据发生了变化)
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象
1、CRUD操作-insert 使用executeUpdate(String sql)方法完成数据添加操作:
Statement stat = conn.createStatement(); String sql = "insert into table(...) values(...)"; int num = stat.executeUpdate(sql); if(num>0){ System.out.println("插入成功"); }
2、CRUD操作-delete 使用executeUpdate(String sql)方法完成数据删除操作:
Statement stat = conn.createStatement(); String sql = "delete from student where StudentNo=1004"; int num = stat.executeUpdate(sql); if(num>0){ System.out.println("删除成功"); }
3、CRUD操作-update 使用executeUpdate(String sql)方法完成数据更新操作:
Statement stat = conn.createStatement(); String sql = "update table set column=‘‘ where id=‘‘"; int num = stat.executeUpdate(sql); if(num>0){ System.out.println("更新成功"); }
4、CRUD操作-select 使用executeQuery(String sql)方法完成数据查询操作:
Statement stat = conn.createStatement(); String sql = "select * from users"; ResultSet resultSet = stat.executeQuery(sql); while(resultSet.next()){
//根据获取列的数据类型,分别调用resultSet的相应方法映射到Java对象中
}
六、代码实现 有很多方法我们需要经常写,那我们就需要封装一些工具类
因为Statement是执行sql语句的,所以需要进行操作,这种我们就不需要封装
要封装的有Connection连接和释放连接。
首先将用户信息写到配置文件中:
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/jzspace?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC username=root password=space999
下面是封装的代码:
package space.urbeautiful.utils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class JdbcUtils { private static String driver = null; private static String username= null; private static String url = null; private static String password = null; static{ try{ //将配置文件放入流中 InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); //读取配置文件的类 Properties properties = new Properties(); //加载流中的配置文件 properties.load(in); //从文件中读取出来内容 driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); //加载驱动 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } } //获取连接 public static Connection getConn() throws SQLException { return DriverManager.getConnection(url,username,password); } //释放资源 public static void release(Connection conn,Statement stat,ResultSet rs){ if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stat!=null) { try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
下面测试一个insert的JDBC:
package space.urbeautiful.utils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestInsert { public static void main(String[] args) { Connection conn = null; Statement stat = null; ResultSet rs = null; try { conn = JdbcUtils.getConn(); stat = conn.createStatement(); String sql = "insert into student(StudentNO,StudentName,sex,birthday,Address,email) " + "values(‘1004‘,‘迈巴赫‘,‘男‘,‘1996-09-09‘,‘浙江省‘,‘2770974690@qq.com‘)"; int i = stat.executeUpdate(sql); if(i>0){ System.out.println("插入成功 --> insert " + i + "条数据"); } } catch (SQLException e) { e.printStackTrace(); }finally{ JdbcUtils.release(conn,stat,rs); } } }
/* 下面说一个我在学习JDBC的时候碰到的错误和解决方法 因为我的MySQL版本是8.0,所以我和秦老师下的版本是不一样的 在加载驱动时写的是:class.forName("com.mysql.jdbc.Driver") 报的错误是:Loading class `com.mysql.jdbc.Driver‘. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver‘. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. 我也没仔细读,大致意思就是"com.mysql.jdbc.Driver"这句话写错了 应该写成`com.mysql.cj.jdbc.Driver‘. 改了之后还是出现了一个错误:java.sql.SQLException: The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the ‘serverTimezone‘ configuration property) to use a more specifc time zone value if you want to utilize time zone support. 那么百度:大概就是一个时区的问题,在url后面添加一个serverTimezone=UTC就解决了 */ /* 如果你用编译器连接数据库,定义了serverTimezone=UTC,那么在你编译器上执行的SQL语句,会先以UTC时区进行存储,发送到MySQL,然后MySQL以本地时区进行转换,就会导致,执行时间比从编译器上的执行时间早8个小时,导致,同一段SQL语句,在mysql直接执行,与编译器执行,结果不同,因为时间相差8个小时 原文链接:https://blog.csdn.net/baidu_38837718/article/details/104981617 */
MySQL--04
标签:操作 day nbsp 调用 str 语句 static 间接 blog