jdbc_连接数据库_操作MySQL数据库
jdbc是指各个数据库管理系统厂商提供给Java开发人员操作它们的数据库的驱动包。
一、使用jdbc步骤
使用jdbc的操作步骤为:
1、准备好要连接的数据库系统,如MySQL、Oracle数据库系统。
2、配置好jdbc驱动包。
3、调用驱动包的类进行数据操作。
二、具体操作
在代码中的操作步骤一般为:
1.加载驱动包
2.获取连接
3.发送sql语句
4.获取结果集
5.释放资源
例子:连接MySQL数据库操作。
static void jdbcConnection() throws ClassNotFoundException, SQLException { //1.加载驱动包 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 Connection connection = DriverManager.getConnection( //指定ip、端口、数据库名,mysql需要指定SSL为false "jdbc:mysql://localhost:3306/leaningjdbc"+"?useSSL=false", //用户名 "root", //密码 "123456"); //3.使用Statement对象发送sql语句,存在sql注入风险。 Statement stmt = connection.createStatement(); //sql语句 String sql = "insert into t_user(username,pwd) values ('张三',123456)"; //执行sql语句,返回值为此语句是否有结果集 boolean haveResult = stmt.execute(sql); //执行sql语句,返回值为结果集 ResultSet result = stmt.executeQuery(sql); //执行sql语句,返回值为此语句修改数据的行数 int updateNumber = stmt.executeUpdate(sql); //3.使用PreparedStatement对象发送sql语句,有预编译过程,避免了SQL注入风险. //预编译sq语句: ? 表示待传入参数。 String sql2 = "insert into t_user(username,pwd) values (?,?)"; //用于执行sql语句的对象,传入预编译的sql。 PreparedStatement pstmt = connection.prepareStatement(sql2); //指定索引传入参数,索引从1开始 pstmt.setObject(1,"张三"); pstmt.setObject(2,"123456"); //执行sql语句 boolean haveResult2 = pstmt.execute(sql); ResultSet result2 = pstmt.executeQuery(sql); int updateNumber2 = pstmt.executeUpdate(sql); //4.结果集的获取,游标往下移一位,并且判断下一个是否为空 while (result.next()){ //通过字段名获取字段数据 System.out.print(result.getString("id")+"###"+result.getString("username")); //通过字段索引获取字段数据,索引从1开始 System.out.println(result.getString(3)+"###"+result.getString(4)); } //5.释放资源 //结果集会随着Statement对象释放而释放 //result.close(); stmt.close(); pstmt.close(); connection.close(); }
封装例子:jdbc简单封装
三、事务(Transaction)
指一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。
当这个单元中的一部分操作失败时,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
jdbc默认是自动提交的,为了保障数据库的一致性,需要进行保护操作:
步骤:
- 调用 Connection 对象的 setAutoCommit(false); 以取消默认的自动提交事务。
- 调用Connection 对象的 commit(); 手动提交事务。
- 在出现异常时,调用Connection 对象的 rollback(); 回滚事务。
示例:
static void testTransaction() throws SQLException, ClassNotFoundException { //1.加载驱动包 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost:53306/leaningjdbc"+"?useSSL=false", "root", "123456"); //3.设置事务为手动提交 connection.setAutoCommit(false); //准备sql语句:插入一条数据 String sql1 = "insert into t_user(username,pwd) values ('张三',123456)"; String sql5 = "insert into t_user(username,pwd) values (?,?)"; //4.准备sql执行操作 Statement stmt = connection.createStatement(); PreparedStatement pstmt = connection.prepareStatement(sql5); pstmt.setObject(1,"红孩儿"); //缺少参数,会插入失败 //pstmt.setObject(2,"123456"); try { //5.执行sal语句 stmt.execute(sql1); System.out.println("语句1执行成功..."); //5.执行sal语句,它会执行失败 pstmt.execute(); System.out.println("语句2执行成功..."); //6.提交事务 connection.commit(); System.out.println("事务已经提交"); }catch (Exception e){ //6.执行错误时,不进行事务提交,进行回滚 connection.rollback(); System.out.println("事务中发生错误....执行回滚操作"); } //7.释放资源 stmt.close();
connection.close();
}
运行结果:
控制台输出: --------start----------- 语句1执行成功... 事务中发生错误....执行回滚操作 --------end-----------
四、批处理(Batch)
成批次地执行sql语句。
步骤:
1、使用addBatch(String sql),将给定的SQL命令添加到此 Statement对象的当前命令列表中。
2、使用executeBatch(),将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。
示例:
static void testBatch() throws ClassNotFoundException, SQLException { //1.加载驱动包 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost:53306/leaningjdbc"+"?useSSL=false", "root", "123456"); //3.设置事务为手动提交 connection.setAutoCommit(false); //sql语句 String sql = "insert into t_user(username,pwd) values ('张三',123456)"; String sql2 = "insert into t_user(username,pwd) values ('李四',123456)"; String sql3 = "insert into t_user(username,pwd) values ('王五',123456)"; String sql4 = "insert into t_user(username,pwd) values ('老六',123456)"; Statement stmt = connection.createStatement(); //4.添加到命令列表 stmt.addBatch(sql); stmt.addBatch(sql2); stmt.addBatch(sql3); stmt.addBatch(sql4); try{ //5.执行批处理 stmt.executeBatch(); System.out.println("执行成功"); }catch (Exception e){ //执行过程中发生错误,回滚到初始状态 connection.rollback(); System.out.println("事务中发生错误....执行回滚操作"); } //6.提交事务 connection.commit(); //7.释放资源
stmt.close();
connection.close();
}
五、数据库中的时间类型
Java中提供了三个相关类。
java.sql.Date java.sql.Date
java.sql.Time 表示时分秒
java.sql.Timestamp 表示年月日时分秒
它们的构造器都需要传入时间戳。
/** * 字符串转为时间戳,字符串格式:2022-12-12 12:32:11 */ static long stringToDate(String s){ try { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(s).getTime(); } catch (ParseException e) { e.printStackTrace(); } return 0; }
六、CLOB与BLOB大对象()
CLOB:用来存储大量的文本数据,操作它需要使用字符流。
TINYTEXT 255字符TEXT 65,535字符
MEDIUMTEXT 16,777,215字符
LONGTEXT 4,292,967,295字符(4GB)
写入操作:
pstmt = conn.prepareStatement("insert into t_user (username,text) values(?,?)"); pstmt.setObject(1,"xiaowang"); //文本文件写入CLOB中 pstmt.setObject(2,new FileReader(new File("d:/a.txt"))); //字符串写入CLOB中,使用setClob更加具体罢了 pstmt.setClob(2,new BufferedReader (new InputStreamReader( new ByteArrayInputStream("woainia".getBytes())))); pstmt.execute();
读出操作:
//通过结果集可以获取Clob对象 Clob c = rs.getClob("字段名"); //Clob对象转为字符流 Reader r = c.getCharcterStream();
//结果集获取的时候可以直接读取为字符串 rs.getString("字段名");
BLOB:用来存储大量的二进制数据,操作它需要使用字节流。
TINYBLOB 255字节BLOB 65,535字节
MEDIUMBLOB 16,777,215字节
LONGBOLB 4,292,967,295字节(4GB)
写入操作:
//把指定文件放入blob字段中,也可以使用setObject() pstmt.setBlob(1,new FileInputStream(new File("C:/logo.png")));
读出操作:
//通过结果集可以获取Blob对象 Blob c = rs.getBlob("字段名"); //Blob对象获取字符流 InputStream r = c.getBinaryStream();