关于jdbc:聊聊如何获取PreparedStatement的参数

序本文次要钻研一下如何获取PreparedStatement的参数 PreparedStatementjava/sql/PreparedStatement.java public interface PreparedStatement extends Statement { void setNull(int parameterIndex, int sqlType) throws SQLException; void setBoolean(int parameterIndex, boolean x) throws SQLException; void setInt(int parameterIndex, int x) throws SQLException; void setLong(int parameterIndex, long x) throws SQLException; //...... default void setObject(int parameterIndex, Object x, SQLType targetSqlType, int scaleOrLength) throws SQLException { throw new SQLFeatureNotSupportedException("setObject not implemented"); } default void setObject(int parameterIndex, Object x, SQLType targetSqlType) throws SQLException { throw new SQLFeatureNotSupportedException("setObject not implemented"); } /** * Retrieves the number, types and properties of this * <code>PreparedStatement</code> object's parameters. * * @return a <code>ParameterMetaData</code> object that contains information * about the number, types and properties for each * parameter marker of this <code>PreparedStatement</code> object * @exception SQLException if a database access error occurs or * this method is called on a closed <code>PreparedStatement</code> * @see ParameterMetaData * @since 1.4 */ ParameterMetaData getParameterMetaData() throws SQLException;}PreparedStatement继承了Statement接口,它次要是多定义了一系列的set办法,然而没有定义get办法,只是定义了getParameterMetaData办法返回ParameterMetaDataParameterMetaDatajava/sql/ParameterMetaData.java ...

September 6, 2023 · 7 min · jiezi

关于jdbc:JDBC写入速度比较慢应该怎么解决

云数据库的话,思考网络环境、并发状况、数据规模。 残缺内容请点击下方链接查看: https://developer.aliyun.com/ask/427635?utm_content=g_1000371542 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 11, 2023 · 1 min · jiezi

关于jdbc:JDBC多个数据库之间联表查询

须要对不同数据库中的表进行联表查问,这种问题在单机器中很难见到,个别不会把零碎分成多个库,顶多是分表,微服务或分布式中比拟常见,但此次的确遇到,提供一个简略的实现思路,框架为springboot。 在application.peoperties中配置好两个数据源。两个库别离为db1和db2 spring.datasource.cardbag.jdbcUrl=jdbc:mysql://${MYSQL_HOST:192.168.199.131}:3306/db1spring.datasource.cardbag.username=rootspring.datasource.cardbag.password=123456spring.datasource.cardbag.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.zhisonguser.jdbcUrl=jdbc:mysql://${MYSQL_HOST:192.168.199.131}:3306/db2spring.datasource.zhisonguser.username=rootspring.datasource.zhisonguser.password=123456spring.datasource.zhisonguser.driver-class-name=com.mysql.cj.jdbc.Driver新建一个Config类,将数据源配置进去。 @Configurationpublic class DataSourceConfig { /*db1的源*/ @Bean(name="db1DataSource") @Qualifier("db1DataSource") @ConfigurationProperties(prefix="spring.datasource.db1") public DataSource db1DataSource(){ return DataSourceBuilder.create().build(); } /*db2的源*/ @Bean(name="db2DataSource") @Qualifier("db2DataSource") @ConfigurationProperties(prefix="spring.datasource.db2") public DataSource db2DataSource(){ return DataSourceBuilder.create().build(); } @Bean(name="db1Template") public JdbcTemplate db1JdcbTemplate(@Qualifier("db1DataSource")DataSource db1DataSource){ return new JdbcTemplate(db1DataSource); } @Bean(name="db2Template") public JdbcTemplate db2JdcbTemplate(@Qualifier("db2DataSource")DataSource db2DataSource){ return new JdbcTemplate(db2DataSource); }}在数据库中创立一个视图View,通过该View实现多库联查,能够抉择在db1或db2表上新建查问,而后创立一个view,过程大略如下: CREATE VIEW USER_VIEW ASSELECT `db1`.User.userid AS `Userid`, `db1`.User.name AS `Name`, `db2`.User.age AS `Age`,FROM `db1`.UserINNER JOIN `db2`.UserON `db1`.User.userid = `db2`.User.useridWHERE `db1`.User.name is not null;生成视图时要留神在其中一个库中生成,前面操作也是在该源上操作的。 此时能够在代码中对生成的视图进行操作了 ...

October 8, 2022 · 1 min · jiezi

关于jdbc:JDBC-在性能测试中的应用

什么是 JDBCJDBC(Java DataBase Connectivity,Java 数据库连贯)是一种用于执行 SQL 语句的 Java API,能够为多种关系数据库提供对立拜访,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此能够构建更高级的工具和接口,使数据库开发人员可能编写数据库应用程序。简略地说,JDBC 可做三件事:与数据库建设连贯、发送操作数据库的语句并处理结果。JDBC 的设计原理整体架构 JDBC 制订了一套和数据库进行交互的规范,数据库厂商提供这套规范的实现,这样就能够通过对立的 JDBC 接口来连贯各种不同的数据库。能够说 JDBC 的作用是屏蔽了底层数据库的差别,使得用户依照 JDBC 写的代码能够在各种不同的数据库上进行执行。那么这是如何实现的呢?如下图所示: JDBC 定义了 Driver 接口,这个接口就是数据库的驱动程序, 所有跟数据库打交道的操作最初都会归结到这里 ,数据库厂商必须实现该接口,通过这个接口来实现下层利用的调用者和底层具体的数据库进行交互。Driver 是通过 JDBC 提供的 DriverManager 进行注册的,注册的代码写在了 Driver 的动态块中,如 MySQL 的注册代码如下所示:static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); }}作为驱动定义的标准 Driver,它的次要目标就是和数据库建设连贯,所以其接口也很简略,如下所示:public interface Driver { //建设连贯 Connection connect(String url, java.util.Properties info) throws SQLException;boolean acceptsURL(String url) throws SQLException;DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info) throws SQLException;int getMajorVersion();int getMinorVersion();boolean jdbcCompliant();public Logger getParentLogger() throws SQLFeatureNotSupportedException;} ...

July 1, 2022 · 2 min · jiezi

关于jdbc:JDBC-的两种开源的数据库连接池

JDBC 的数据库连接池应用 javax.sql.DataSource 来示意,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现: 1、DBCP 数据库连接池 2、C3P0 数据库连接池 DataSource 通常被称为数据源,它蕴含连接池和连接池治理两个局部,习惯上也常常把 DataSource 称为连接池 1、DBCP 数据源DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源零碎:Common-pool. 如需应用该连接池实现,应在零碎中减少如下两个 jar 文件: 1)Commons-dbcp.jar:连接池的实现 2)Commons-pool.jar:连接池实现的依赖库 Tomcat 的连接池正是采纳该连接池来实现的。该数据库连接池既能够与应用服务器整合应用,也可由应用程序独立应用。 留神: 数据源和数据库连贯不同,数据源无需创立多个,它是产生数据库连贯的工厂,因而整个利用只须要一个数据源即可。 当数据库拜访完结后,程序还是像以前一样敞开数据库连贯:conn.close(); 但 conn.close()并没有敞开数据库的物理连贯,它仅仅把数据库连贯开释,归还给了数据库连接池。 形式一:示例代码: 步骤: 1、退出两个 jar DBCP 数据库连接池的的 jar:Commons-dbcp.jar 连接池实现的依赖库:Commons-pool.jar,如果不加这个,运行报如下异样 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactoryat com.jdbc.datasource.TestDBCP.main(TestDBCP.java:14)Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool.KeyedObjectPoolFactoryat java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)... 1 more2、编写代码 package com.jdbc.datasource; import java.sql.Connection;import java.sql.SQLException; import org.apache.commons.dbcp.BasicDataSource; public class TestDBCP { ...

April 15, 2022 · 3 min · jiezi

关于jdbc:最通俗易懂的JDBC数据库教程jdbc学习笔记

本文是依据B站能源节点老杜的视频教程做的笔记,教程中解说了Java语言如何连贯数据库,对数据库中的数据进行增删改查操作,适宜于曾经学习过Java编程根底以及数据库的同学。Java教程中论述了接口在开发中的真正作用,JDBC标准制订的背景,JDBC编程六部曲,JDBC事务,JDBC批处理,SQL注入,行级锁等。 1、JDBC是什么?Java DataBase Connectivity(Java语言连贯数据库) 2、JDBC的实质是什么?JDBC是SUN公司制订的一套接口(interface) java.sql.*; (这个软件包下有很多接口。) 接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。 为什么要面向接口编程? 解耦合:升高程序的耦合度,进步程序的扩大力。 多态机制就是十分典型的:面向形象编程。(不要面向具体编程) 倡议:Animal a = new Cat();Animal a = new Dog();// 喂养的办法public void feed(Animal a){ // 面向父类型编程。 } 不倡议:Dog d = new Dog();Cat c = new Cat(); 思考:为什么SUN制订一套JDBC接口呢? 因为每一个数据库的底层实现原理都不一样。Oracle数据库有本人的原理。MySQL数据库也有本人的原理。MS SqlServer数据库也有本人的原理。....每一个数据库产品都有本人独特的实现原理。 JDBC的实质到底是什么?一套接口。 3、JDBC开发前的筹备工作,先从官网下载对应的驱动jar包,而后将其配置到环境变量classpath当中。classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar 以上的配置是针对于文本编辑器的形式开发,应用IDEA工具的时候,不须要配置以上的环境变量。IDEA有本人的配置形式。 4、JDBC编程六步(须要背会)第一步:注册驱动(作用:通知Java程序,行将要连贯的是哪个品牌的数据库)第二步:获取连贯(示意JVM的过程和数据库过程之间的通道关上了,这属于过程之间的通信,重量级的,应用完之后肯定要敞开通道。)第三步:获取数据库操作对象(专门执行sql语句的对象)第四步:执行SQL语句(DQL DML....)第五步:解决查问后果集(只有当第四步执行的是select语句的时候,才有这第五步解决查问后果集。)第六步:开释资源(应用完资源之后肯定要敞开资源。Java和数据库属于过程间的通信,开启之后肯定要敞开。)注册驱动形式两种URL解析5.遍历后果集 idea导入.jar包 视频教程整起:https://www.bilibili.com/video/BV1Bt41137iB字符串中拼变量(sql)单引号中 加双引号 加两个加号++ 加号外面加变量 PreparedStatement预编译查(SELECT)第四步用 rs = ps.executeQuery(“字段”); 增删改(INSERT DELETE UPDATE)第四步用 rs= ps.executeUpdate(“字段”); 框架(select) public static void main(String[] args){ Connection conn = null; PreparedStatement ps = null;//加d是名词 ResultSet rs = null; try { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连贯 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/codeyuaiiao?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8","root","3615yuhaijiao"); //3.获取预编译的数据库操作对象 String sql = "select * from student"; ps = conn.prepareStatement(sql);//动词 //4.执行sql语句 rs = ps.executeQuery();//查问select //rs = ps.executeUpdate();//增删改都是用Update(INSERT DELETE UPDATE) //5.解决查问后果集 } catch (Exception e) { e.printStackTrace(); }finally { //6.开释资源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } }事务三件套 (开启 提交 回滚)conn.setAutoCommit(false); 敞开主动提交 开启事务conn.commit(); 手动提交conn.rollback(); catch中写 回滚if(conn != null){ try{ conn.rollback(); ...

February 11, 2022 · 1 min · jiezi

关于jdbc:如何使用JDBC-API操作数据库

1、应用JDBC API操作数据库的根本步骤剖析应用JDBC API操作数据库,进行CRUD根本步骤都类似。加载和注册驱动获取数据库连贯筹备操作执行SQL的Statement对象执行SQL调用Statement对象的executeUpdate(String sql)执行SQL语句进行插入、批改、删除操作调用Statement对象的executeQuery(String sql)执行SQL语句进行查问操作解决执行后果CUD操作,依据返回的int值判断后果查问操作,依据返回ResultSet后果集,大数据培训获取查问数据开释资源总结:加载和注册驱动,整个我的项目做一次即可获取数据库连贯能够封装到一个办法中开释资源能够封装到一个办法中2、编写工具类JDBCUtilspackage com.atguigu.utils;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/* 工具类: 1、注册驱动:只有运行一次 2、获取连贯 3、敞开资源 */ public class JDBCUtils {private static String drivername;private static String url;private static String user;private static String password;private static Properties pro = new Properties();static{try {//加载,读取jdbc.properties配置的信息//pro.load的作用是把jdbc.properties文件中配置的信息,一一put到pro这个map中pro.load(ClassLoader.getSystemClassLoader().getResourceAsStream(“jdbc.properties”));// drivername = pro.getProperty(“key”)drivername = pro.getProperty(“drivername”);url = pro.getProperty(“url”);user = pro.getProperty(“user”);password = pro.getProperty(“password”);//注册驱动,加载驱动Class.forName(drivername);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static Connection getConnection()throws SQLException{Connection conn = DriverManager.getConnection(url, user, password);return conn;}public static void closeQuietly(Connection conn){try {if(conn!=null){conn.close();}} catch (SQLException e) {e.printStackTrace();}}public static void closeQuietly(Statement st){try {if(st!=null){st.close();}} catch (SQLException e) {e.printStackTrace();}}public static void closeQuietly(ResultSet rs){try {if(rs!=null){rs.close();}} catch (SQLException e) {e.printStackTrace();}}public static void closeQuietly(Statement st,Connection conn){closeQuietly(st);closeQuietly(conn);}public static void closeQuietly(ResultSet rs,Statement st,Connection conn){closeQuietly(rs);closeQuietly(st);closeQuietly(conn);}}

January 6, 2022 · 1 min · jiezi

关于jdbc:如何解决JDBC死链接导致NIFI线程假死

景象ExcuteSql不工作不调度,stop也进行不了,active的工作个数也不升高。 场景复现1、模拟现场结构数据 2、Tc命令模仿现场网络环境模拟丢包30% tc qdisc del dev enp4s0f0 root netem loss 30% 问题排查netstat -pan | grep $NIFI_PID 能够看到和数据库开启了5个tcp连贯,也能够看到有五个socket处于连贯状态 间接看线程jstack -l $NIFI_PID | grep 'java.net.SocketInputStream.socketRead0(Native Method)' -C 10 察看了一段时间,socket依然没有敞开,能够根本必定现场环境应该曾经复现。 问题剖析一次残缺的数据库申请包含三个阶段: 1、建设连贯 2、数据传输 3、断开连接connect timeout:如果与服务器(这里指数据库)申请建设连贯的工夫超过ConnectionTimeOut,就会抛 ConnectionTimeOutException,即服务器连贯超时,没有在规定的工夫内建设连贯。 socket timeout:如果与服务器连贯胜利,就开始数据传输了。如果服务器解决数据用时过长,超过了SocketTimeOut,就会抛出SocketTimeOutExceptin,即服务器响应超时,服务器没有在规定的工夫内返回给客户端数据。 在未设置超时工夫场景下,nifi通过jdbc获取数据库数据,实质是操作系统在调用Socket.read(),如果网络问题被阻塞住,那么操作系统会很少在调用Socket,java培训因为底层没有数据交互,那么其无奈晓得对端是否宕机,所以会始终期待。 难道零碎没有默认的socketTimeout? 有的,上述场景下内核会在一个socket两个小时都没有数据交互状况下(可设置)启动keepalive定时器来探测对端的socket。 也就是说呈现假死会在7875秒后复原,大略两个多小时吧。 这就是nifi端线程假死的起因; 论断JDBC的socket未设置超时,呈现了死连贯。 JDBC 驱动是用 Socket 形式与数据库连贯的,应用程序和数据库之间的连贯超时并不是由数据库解决的。 当数据库忽然宕掉或产生网络谬误(设施故障等)时,JDBC 驱动的 Socket 超时的值是必须的。因为 TCP/IP 的构造,Socket 没有方法检测到网络谬误,因而利用不能检测到与数据库到连贯断开了。如果没有设置 Socket 超时,应用程序会始终期待数据库返回后果。(这个连贯也被叫做“死连贯”) 为了防止死连贯,Socket 必须要设置超时工夫。Socket 超时能够通过 JDBC 驱动程序配置。通过设置 Socket 超时,能够防止出现网络谬误时始终期待的状况并缩短故障工夫。在timeout为0的时候,走默认的零碎调用不设置超时工夫的逻辑。在timeout>0时,将socket设置为非阻塞,而后用select零碎调用去模仿超时,而没有走linux自身的超时逻辑。 解决措施设置socket和Connection的超时工夫。 避免因为网络问题呈现死连贯,给数据库的拜访url加socket timeout和Connection timeout。

January 5, 2022 · 1 min · jiezi

关于jdbc:JDBC基础入门教程轻松掌握jdbc基础核心技术超全面

JDBC是什么?JDBC是Sun提供的一套数据库编程接口API函数,由Java语言编写的类、界面组成。 JDBC API 的设计初衷就是为了让简略的事件更简略,这意味着JDBC使得执行所有数据库工作都更容易. 用JDBC写的程序可能主动地将SQL语句传送给相应的数据库管理系统。不但如此,应用Java编写的应用程序能够在任何反对Java的平台上运行,不用在不同的平台上编写不同的利用。 Java和JDBC的联合能够让开发人员在开发数据库应用程序时真正实现 “WriteOnce,RunEverywhere!” JDBC的用处是什么?简略地说,JDBC 可做三件事: 与数据库建设连贯,发送 SQL 语句,处理结果。JDBC学习教程能源节点老杜解说的jdbc教程,能够说是十分全面了,想学习jdbc的小伙伴们不能错过!! JDBC学习视频教程内容涵盖: 解说Java语言如何连贯数据库,对数据库中的数据进行增删改查操作解说接口在开发中的真正作用JDBC标准制订的背景JDBC编程六部曲JDBC事务JDBC批处理SQL注入行级锁等适宜人群适宜于曾经学习过Java编程根底以及数据库的小伙伴们 JDBC视频教程:https://www.bilibili.com/vide... JDBC材料下载:http://www.bjpowernode.com/?s... 学习目录•001. JDBC课程的目录构造介绍 •002. 对JDBC实质的了解 •003. 编写程序模仿JDBC实质 •004. 将驱动jar配置到环境变量classpath中 •005. JDBC编程六步的概述 •006. 注册驱动与获取连贯 •007. 执行sql与开释资源 •008. JDBC执行删除与更新 •009. 类加载的形式注册驱动 •010. 从属性资源文件中读取连贯数据库信息 •011. 解决查问后果集 •012. 应用IDEA开发JDBC代码配置驱动 •013. 回顾JDBC •014. 用户登录业务介绍 •015. PowerDesigner工具的装置 •016. 应用PowerDesigner工具进行物理建模 •017. 用户登录性能界面的初始化 •018. 登录办法的实现 •019. 演示SQL注入景象 •020. 解决SQL注入问题 •021. Statement和PreparedStatement比照 •022. 演示Statement的用处 •023. PreparedStatement实现增删改 •024. JDBC的事务主动提交机制的演示 •025. 账户转账演示事务 •026. JDBC工具类的封装 •027. JDBC实现含糊查问 ...

December 15, 2021 · 1 min · jiezi

关于jdbc:JavaWeb中jdbc增删查改

jdbc增删查改前言: Java数据库连贯(Java Database Connectivity,J 简称JDBC),简略来说就是 应用Java执行sql语句的,面向关系型数据库的java_API 创立 Directory包 > 取名为 lib后导入 MySQL-connector-java-5.1.37 文件创立数据库(不然连贯什么) // 根据实体类创立数据库字段和类型 创立实体类(BankModel.java)package com.kjzz;public class Teacher{ // 成员变量 private int SID; // id private String SName; // name private String birthday; // birthday 生日 // 无参结构 / 有参结构 public Teacher(){ } public Teacher(int SID, String SName,String birthday) { this.SID = SID; this.SName = SName; this.birthday = birthday; } // get / set 办法 public int getSID() { return SID; } public void setSID(int SID) { this.SID = SID; } public String getSName() { return SName; } public void setSName(String SName) { this.SName = SName; } public String getBirthday(){ return birthday; } public void setBirthday(String birthday){ this.birthday = birthday; }}5.创立数据库驱动类(DBUtill.java) ...

November 1, 2021 · 4 min · jiezi

关于jdbc:JDBC快速开发工具包fastjdbc使用介绍

介绍一个开源的jdbc操作工具类fastjdbc,一个基于SpringBoot框架开发的jdbc疾速开发工具包它实际上是对spring框架提供的NamedJdbcTemplate类的二次封装,提供一种基于注解形式的API配置形式去操作sql,而不是调用NamedJdbcTemplate的办法去传递sql语句。 装置 <dependency> <groupId>com.github.paganini2008.springdessert</groupId> <artifactId>fastjdbc-spring-boot-starter</artifactId> <version>2.0.3</version> </dependency>(以最新版为准) 疾速开始上面举几个例子,看看fastjdbc-spring-boot-starter是怎么应用的 @Daopublic interface UserDao { @Insert("insert into tb_user(username,password,age) values (:username,:password,:age)") int saveUser(@Example User user); @Update("update tb_user set username=:username, password=:password where id=:id") int updateUser(@Example User user); @Update("delete from tb_user where id=:id") int deleteUser(@Arg("id") int id); @Batch("insert into tb_user(username,password,age) values (:username,:password,:age)") int batchSaveUser(@Args List<User> userList); @Get("select * from tb_user where id=:id") User getById(@Arg int id); @Query("select * from tb_user order by create_time desc") List<Map<String, Object>> queryUser(); @Query("select * from tb_user where 1=1 @sql order by create_time desc") List<Map<String, Object>> queryUserByCondition(@Sql String whereCondition, @Example Map<String,Object> queryExample); @Select("select * from tb_user order by create_time desc") ResultSetSlice<User> selectUser();}API很简略,但须要的注意事项: ...

August 15, 2021 · 1 min · jiezi

关于jdbc:JDBC-42-Specifications-中文翻译-第十二章-分布式事务

到目前为止,对于事务的探讨基本上都聚焦在本地事务上,本地事务只会波及到一个繁多的数据源。本章开始介绍分布式事务,分布式事务会在单个事务内波及多个数据源。以下内容次要包含: 散布识事务基础设施事务管理器和资源管理器XADataSource,XAConnection 和 XAResource 接口两阶段提交JDBC 的事务管理 API 与 JTA 标准是兼容的。 基础设施分布式事务的基础设施包含以下几个局部: 事务管理器,用来管制事务的边界和治理两阶段提交协定。它也应该是 JTA 的一个经典实现。实现了XADataSource,XAConnection 和 XAResource 接口的 JDBC 驱动。一个对于应用层齐全可见的 DataSource 实现,利用它来操作 XADataSource ,并与事务管理器交互。通常这个实现由应用服务器提供。用来治理底层数据的资源管理器。在 JDBC 的语境中,资源管理器指的是数据库服务器。“资源管理器” 这个术语实际上来自于 JTA,在这里应用这个术语是为了强调 JDBC 中的分布式事务是遵循 JTA 标准的架构来解决的。通常会以“三层架构”来实现这个基础设施,包含: 客户端一个蕴含应用程序、EJB 服务器、JDBC 驱动汇合的中间层多个资源管理器分布式事务也能够实现为“两层架构”。在两层架构中,应用层自身就会表演事务管理器的角色,并且间接操作 XADataSource API。下图论述了分布式事务的基础设施: 后续的内容将会对基础设施的各个局部进行具体的阐明 XADataSource 和 XAConnectionXADataSource 和 XAConnection 接口,定义在 javax.sql 包中。反对分布式事务的数据库驱动须要实现这两个接口。XAConnection 继承了 PooledConnection 接口,增加了一个 getXAResource 办法,这个办法会生成一个 XAResource 对象,事务管理器能够利用这个对象来实现分布式事务。以下是 XAConnection 接口的定义: public interface XAConnection extends PooledConnection {javax.transaction.xa.XAResource getXAResource() throws SQLException;}因为继承了 PooledConnection 接口,所以所有的 XAConnection 对象也反对 PooledConnection 中定义的办法。这些对象代表着与底层数据源的一条可重用的物理连贯,应用层也能够通过这个对象操作这条连贯。 ...

June 15, 2021 · 3 min · jiezi

关于jdbc:故障分析-Java-连接-MySQL-80-排错案例

作者:胡呈清爱可生 DBA 团队成员,善于故障剖析、性能优化,集体博客:https://www.jianshu.com/u/a95...,欢送探讨。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 在客户那边遇见过几次这样的问题,Java 连贯 MySQL8.0 偶然会报错:java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed。网上一搜这个报错,早有人踩过这个坑: 如果用户应用了 sha256_password 认证,明码在传输过程中必须应用 TLS 协定爱护,然而如果 RSA 公钥不可用,能够应用服务器提供的公钥;能够在连贯中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者 AllowPublicKeyRetrieval=True 参数以容许客户端从服务器获取公钥;然而须要留神的是 AllowPublicKeyRetrieval=True 可能会导致歹意的代理通过中间人攻打(MITM)获取到明文明码,所以默认是敞开的,必须显式开启。原始文档如下: JDBC 增加参数 AllowPublicKeyRetrieval=True 后的确解决了问题,然而留神前边说的“偶然”两字,我遇见了大略三种状况,在这之前一点问题都没有,但一产生就会报错: 1.MySQL Server 重启了; 2.MySQL MGR 产生切换了; 3.DBA 对 MySQL Server 做了某些变更后。 那后面的解释就显得有点不够了,尤其是第 3 点,开发肯定会感觉这是 MySQL 层面的问题或者 DBA 的问题,而不是他们对 MySQL 驱动理解不够。上面就为大家揭晓答案。 caching_sha2_passwordMySQL8.0 默认应用明码加密插件为:caching_sha2_password,应用 sha256 算法对明码加密。而且在应用此插件时,MySQL Server 会在内存中缓存用户的认证信息,使已连贯的用户的身份验证速度更快,文档形容: 这个缓存的说法就很暧昧了,当然因为文档上没有更多形容,咱们只能先做假如:Java 程序通过驱动连贯到 MySQL 时,如果 MySQl Server 有用户的验证缓存,则不须要额定配置 RSA 公钥即可连贯胜利;如果没有缓存也没有指定 RSA 公钥,则连贯报错:Public Key Retrieval is not allowed。 ...

March 9, 2021 · 1 min · jiezi

关于jdbc:面试被问JDBC底层是如何连接数据库的

关注“Java后端技术全栈” 回复“面试”获取全套面试材料 背景前两天一个小伙伴面试的时候,被问JDBC底层是如何连贯数据库的? 他登时一脸懵逼,因为大部分人只晓得JDBC的几个步骤,至于底层到底是怎么连贯数据库的,还真不知道。 因为小伙伴是面试高级开发,问这种问题倒也不能说面试官过分,如果是高级或者中级,那问着问题就的确有些过分了。 然而如果你在高级或者中级的阶段,就晓得了答案,岂不是爽歪歪么? 预计大部分人都不晓得这个问题该怎么答复,略微发散一下思维,倒是能够猜想一下,明天咱们就来搞清楚JDBC底层到底是如何连贯数据库的。往后别再猜了。 反过来,如果面试官问你JDBC的时候,你能晓得底层是怎么连贯数据库的,预计,很多绝对较水的面试官也会一脸懵逼。 何为 JDBC ?JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个「标准」而不是一个实现,可能执行SQL语句。JDBC由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,留神:本文中的代码都是针对MySQL数据库实现的。 JDBC 架构分为双层架构和三层架构。 双层作用:此架构中,Java Applet 或利用间接拜访数据源。 条件:要求 Driver 能与拜访的数据库交互。 机制:用户命令传给数据库或其余数据源,随之后果被返回。 部署:数据源能够在另一台机器上,用户通过网络连接,称为 C/S配置(能够是内联网或互联网)。 三层侧架构非凡之处在于,引入中间层服务。 流程:命令和构造都会通过该层。 吸引:能够减少企业数据的访问控制,以及多种类型的更新;另外,也可简化利用的部署,并在少数状况下有性能劣势。 历史趋势:以往,因性能问题,中间层都用 C 或 C++ 编写,随着优化编译器(将 Java 字节码 转为 高效的 特定机器码)和技术的倒退,如EJB,Java 开始用于中间层的开发这也让 Java 的劣势突显呈现进去,应用 Java 作为服务器代码语言,JDBC随之被器重。 入门案例上面给出一个JDBC入门级案例: public class JdbcDemo {    public static final String URL = "jdbc:mysql://localhost:3306/mblog";    public static final String USER = "root";    public static final String PASSWORD = "123456";    public static void main(String[] args) throws Exception {         Class.forName("com.mysql.jdbc.Driver");         Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);         Statement stmt = conn.createStatement();         ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");         while(rs.next()){            System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));        }    }}JDBC 步骤数据库驱动: Class.forName("com.mysql.jdbc.Driver"); 获取连贯: Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); 创立Statement或者PreparedStatement对象: Statement stmt = conn.createStatement(); 执行sql数据库查问: ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1"); 解析后果集: System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));最初就是各种资源的敞开。 数据库驱动加载MySql的驱动类 : Class.forName("com.mysql.jdbc.Driver"); 咱们装置好数据库之后,咱们的应用程序也是不能间接应用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。 Driver接口java.sql.Driver此接口是提供给数据库厂商实现的。比如说MySQL的,须要依赖对应的jar包。 <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.16</version></dependency>MySQL数据库对应的实现驱动实现类: package com.mysql.cj.jdbc;import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver {    static {        try {            //注册驱动            java.sql.DriverManager.registerDriver(new Driver());        } catch (SQLException E) {            throw new RuntimeException("Can't register driver!");        }    }     public Driver() throws SQLException {     }}DriverManager是rt.jar包下的类,(rt=runtime),把咱们须要驱动类注册进去。 //DriverManager类中的办法public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da)    throws SQLException {     /* Register the driver if it has not already been added to our list */     if(driver != null) {          registeredDrivers.addIfAbsent(new DriverInfo(driver, da));      } else {          // This is for compatibility with the original DriverManager          throw new NullPointerException();      }      println("registerDriver: " + driver);}相应装载Oracle驱动: ...

December 26, 2020 · 1 min · jiezi

关于jdbc:JDBC4-jdbc预编译与拼接sql对比

在jdbc中,有三种形式执行sql,别离是应用Statement(sql拼接),PreparedStatement(预编译),还有一种CallableStatement(存储过程),在这里我就不介绍CallableStatement了,咱们来看看Statement与PreparedStatement的区别。1. 创立数据库,数据表数据库名字是test,数据表的名字是student,外面有四个字段,一个是id,也就是主键(主动递增),还有名字,年龄,问题。最初先应用sql语句插入六个测试记录。 CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , `age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM; INSERT INTO `student` VALUES (1, '小红', 26, 83);INSERT INTO `student` VALUES (2, '小白', 23, 93);INSERT INTO `student` VALUES (3, '小明', 34, 45);INSERT INTO `student` VALUES (4, '张三', 12, 78);INSERT INTO `student` VALUES (5, '李四', 33, 96);INSERT INTO `student` VALUES (6, '魏红', 23, 46);建设对应的学生类: ...

December 5, 2020 · 3 min · jiezi

关于jdbc:JDBC通用CRUD解决方案DBUtils

一, 先相熟DBUtils的API:简介:DbUtils是一个为简化JDBC操作的小类库。以下应用的是最新版的commons-dbutils-1.4,先给个简介,以便迅速把握API的应用。整个dbutils总共才3个包: 1、包org.apache.commons.dbutils 接口摘要 ResultSetHandler 将ResultSet转换为别的对象的工具。RowProcessor       将ResultSet行转换为别的对象的工具。 类摘要 BasicRowProcessor   RowProcessor接口的根本实现类。 BeanProcessor       BeanProcessor匹配列明到Bean属性名,并转换后果集列到Bean对象的属性中。DbUtils             一个JDBC辅助工具汇合。 ProxyFactory        产生JDBC接口的代理实现。 QueryLoader         属性文件加载器,次要用于加载属性文件中的 SQL 到内存中。 QueryRunner         应用可插拔的策略执行SQL查问并处理结果集。ResultSetIterator   包装后果集为一个迭代器。 2、包org.apache.commons.dbutils.handlersResultSetHandler接口的实现类 类摘要 AbstractListHandler 将ResultSet转为List的抽象类ArrayHandler 将ResultSet转为一个Object[]的ResultSetHandler实现类ArrayListHandler 将ResultSet转换为List<Object[]>的ResultSetHandler实现类BeanHandler 将ResultSet行转换为一个JavaBean的ResultSetHandler实现类BeanListHandler 将ResultSet转换为List<JavaBean>的ResultSetHandler实现类ColumnListHandler 将ResultSet的一个列转换为List<Object>的ResultSetHandler实现类KeyedHandler 将ResultSet转换为Map<Map>的ResultSetHandler实现类MapHandler 将ResultSet的首行转换为一个Map的ResultSetHandler实现类MapListHandler 将ResultSet转换为List<Map>的ResultSetHandler实现类ScalarHandler 将ResultSet的一个列到一个对象。3、包org.apache.commons.dbutils.wrappers增加java.sql类中性能包装类。 类摘要 SqlNullCheckedResultSet  在每个getXXX办法上查看SQL NULL值的ResultSet包装类。StringTrimmedResultSet    取出后果集中字符串左右空格的ResultSet包装类。二,应用DBUtils其实只是应用的话,只看两个类(DbUtils 和QueryRunner)和一个接口(ResultSethandler)就能够了。 1,DbUtilsDbUtils是一个为做一些诸如敞开连贯、装载JDBC驱动程序之类的惯例工作提供有用办法的类,它外面所有的办法都是动态的。 这个类里的重要办法有: close(): DbUtils类提供了三个重载的敞开办法。这些办法查看所提供的参数是不是NULL,如果不是的话,它们就敞开连贯、申明和后果集(ResultSet)。 CloseQuietly:CloseQuietly这一办法不仅能在连贯、申明或者后果集(ResultSet)为NULL状况下防止敞开,还能暗藏一些在程序中抛出的SQLEeception。如果你不想捕获这些异样的话,这对你是十分有用的。在重载CloseQuietly办法时,特地有用的一个办法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),这是因为在大多数状况下,连贯、申明和后果集(ResultSet)是你要用的三样货色,而且在最初的块你必须敞开它们。应用这一办法,你最初的块就能够只须要调用这一办法即可。 CommitAndCloseQuietly(Connection conn): 这一办法用来提交连贯,而后敞开连贯,并且在敞开连贯时不向上抛出在敞开时产生的一些SQL异样。LoadDriver(String driveClassName):这一办法装载并注册JDBC驱动程序,如果胜利就返回TRUE。应用这种办法,你不须要去捕获这个异样ClassNotFoundException。应用loadDrive办法,编码就变得更容易了解,你也就失去了一个很好的Boolean返回值,这个返回值会通知你驱动类是不是曾经加载胜利了。 2,ResultSetHandler 这一接口执行解决一个jaca.sql.ResultSet,将数据转变并解决为任何一种模式,这样有益于其利用而且应用起来更容易。这一组件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等执行程序。 ...

December 5, 2020 · 3 min · jiezi

关于jdbc:JDBC3-SPI技术以及数据库连接中的使用

[TOC] 1.SPI是什么?SPI,即是Service Provider Interface,是一种服务提供(接口实现)发现机制,能够通过ClassPath门路下的META-INF/Service文件查找文件,加载外面定义的类。个别能够用来启用框架拓展和替换组件,比方在最常见的数据库连贯JDBC中,java.sql.Driver,不同的数据库产商能够对接口做不一样的实现,然而JDK怎么晓得他人有哪些实现呢?这就须要SPI,能够查找到接口的实现,对其进行操作。用两个字解释:解耦。 2.如何应用SPI来提供自定义服务?咱们来写一个简略的例子:整个我的项目构造: SPI-Project:maven我的项目 DBInterface:maven我的项目,parent是SPI-Project,定义了一个接口com.aphysia.sqlserver.DBConnectionService,本人不做实现。MysqlConnection:prarent是SPI-Project,实现了接口DBConnectionService,也就是MysqlConnectionServiceImplSqlServerConnection:prarent 也是SPI-Project,实现了DBConnectionService,也就是SqlServerConnectionServiceImplWebProject:测试项目,模仿web我的项目外面应用数据库驱动。不论是MySqlConnection还是SqlServerConnection两个module中,都是去实现了DBInterface的接口,并且在resource/META-INF/services下都须要申明所实现的类,文件名就是实现的接口全限定名com.aphysia.sql.DBConnectionService,文件外面就是具体的实现类的全限定名,比方:com.aphysia.mysql.MysqlConnectionServiceImpl SPI-Project的pom文件: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.aphysia</groupId> <artifactId>SPI-Project</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>DbInterface</module> <module>MySqlConection</module> <module>SqlServerConnection</module> <module>WebProject</module> </modules></project>2.1 DBInterface定义接口DBInterface是SPIProject的一个module,次要是定义一个标准(接口),不做任何实现。pom文件如下: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>SPI-Project</artifactId> <groupId>com.aphysia</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>DbInterface</artifactId></project>定义的接口(模仿了java提供的数据库驱动的情景,定义了驱动标准):DBConnectionService.java package com.aphysia.sql;public interface DBConnectionService { void connect();}2.2 模仿Mysql实现驱动接口的第一种实现,相当于模仿第三方Mysql对接口做了本人的拓展:pom文件: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>SPI-Project</artifactId> <groupId>com.aphysia</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>MySqlConection</artifactId> <dependencies> <dependency> <groupId>com.aphysia</groupId> <artifactId>DbInterface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies></project>实现了后面定义的接口:MysqlConnectionServiceImpl package com.aphysia.mysql;import com.aphysia.sqlserver.DBConnectionService;public class MysqlConnectionServiceImpl implements DBConnectionService { public void connect() { System.out.println("mysql 正在连接..."); }}申明实现,在resource/META-INF.services/下定义一个文件,名为com.aphysia.sql.DBConnection,外面内容是: ...

November 28, 2020 · 4 min · jiezi

关于jdbc:JDBC2-JDBC工作原理以及简单封装

[TOC] 1. 工作原理个别咱们次要的JDBC解决流程如下: graph TDA[注册一个Driver] -->B(建设数据库连贯)B --> C(创立一个Statement)C-->D(执行SQL语句,获取后果)D-->F(敞开JDBC对象)1.1 加载驱动首先申明:这个阶段在1.6之后就不须要手动执行了,也就是这个代码不须要了!!!剖析它有利于了解流程。 Class.forName("com.mysql.jdbc.Driver")下面代码产生在注册Driver阶段,指的是让JVN将com.mysql.jdbc.Driver这个类加载入内存中,最重要的是将mysql驱动注册到DriverManager中去。 此处加载Driver的时候,加载的是java.mysql.jdbc包下的,这其实是一种向后兼容的做法,实际上代码都是写在了com.mysql.cj.jdbc下,所以,mysql的连贯包应用了继承的形式,com.mysql.jdbc.Driver只是对外的一个兼容类,其父类是com.mysql.cj.jdbc.Driver,真正的的mysql Driver驱动。 加载Driver的目标就是加载它的父类: public class Driver extends com.mysql.cj.jdbc.Driver { public Driver() throws SQLException { super(); }}咱们关上com.mysql.cj.jdbc.Driver,能够发现,外面有一个结构空办法,这也是调用Class.forName().newInstance() 所须要的,这个类继承了NonRegisteringDriver,实现了java.mysql.Driver。外面有一个空无参构造方法,为反射调用newInstance()筹备的,另外就是动态代码块,动态代码块次要的性能是通过DriverManager注册本人(Driver,也就是驱动),这里很重要的一点,就是Driver是java.sql.Driver(这是jdk的包!!!)的实现。 咱们引入的驱动实质上是JDK中的Driver的实现类,为啥?这就是规范,束缚,不这样干,不合规矩。public class Driver extends NonRegisteringDriver implements java.sql.Driver { static { try { // 调用DriverManager 注册本人(Driver) java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } public Driver() throws SQLException { // Class.forName().newInstance() 所须要的 }}DriverManager外面根本全是static办法,也就是专门治理各种驱动的,registerDriver()办法如同其名字,就是为了注册驱动,注册到哪里呢?看上面的代码,能够晓得,driverInfo(驱动相干信息)会被增加到registeredDrivers外面去。registeredDrivers是DriverManager的static属性,外面寄存着注册的驱动信息。如果这个驱动曾经被注册,那么就不会再注册。 public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException { registerDriver(driver, null); } public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da) throws SQLException { /* Register the driver if it has not already been added to our list */ if(driver != null) { // 将驱动相干信息加到registeredDrivers registeredDrivers.addIfAbsent(new DriverInfo(driver, da)); } else { // This is for compatibility with the original DriverManager throw new NullPointerException(); } println("registerDriver: " + driver); }到这里其实Class.forName(“com.mysql.jdbc.Driver”)这句代码剖析就完结了。 ...

November 28, 2020 · 3 min · jiezi

关于jdbc:JDBC1初级增删改查

[TOC] 1.jdbc是什么JDBC(Java DataBase Connectivity,java数据库连贯)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供对立拜访,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此能够构建更高级的工具和接口,使数据库开发人员可能编写数据库应用程序。(百度百科)jdbc常常用来连贯数据库,创立sql或者mysql语句,应用相干的api去执行sql语句,从而操作数据库,达到查看或者批改数据库的目标。学习jbbc要求对java编程有肯定理解,并理解一种数据库系统以及sql语句。环境要求:1.本地装好jdk,并且装好mysql数据库,我是间接装过wamp带有mysql数据库/docker中装置的mysql。2.应用IDEA开发 2.应用IDEA开发2.1 创立数据库,数据表我的mysql是应用docker创立的,如果是windows环境能够应用wamp较为不便。 数据库名字是test,数据表的名字是student,外面有四个字段,一个是id,也就是主键(主动递增),还有名字,年龄,问题。最初先应用sql语句插入六个测试记录。 CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE test;CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , `age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM; INSERT INTO `student` VALUES (1, '小红', 26, 83);INSERT INTO `student` VALUES (2, '小白', 23, 93);INSERT INTO `student` VALUES (3, '小明', 34, 45);INSERT INTO `student` VALUES (4, '张三', 12, 78);INSERT INTO `student` VALUES (5, '李四', 33, 96);INSERT INTO `student` VALUES (6, '魏红', 23, 46);2.2 应用IDEA创立我的项目我应用maven工程形式,我的项目目录: ...

November 28, 2020 · 4 min · jiezi

关于jdbc:JDBC总结

一:Junit单元测试框架junit(单元测试框架): 能够不必增加main函数,也不必创立类的实例就能够执行一个办法 可能用单元测试执行的办法必须满足如下条件:1)办法必须是公共的(public)2)办法必须是非动态的3)办法必须是无返回值的(void)4)办法必须是无参数的junit(单元测试框架)罕用的三个注解: @Test、@before、@after @Test:应用了该注解的办法,每次选中办法名,右键-->Run as-->junit test都能够执行该办法@before:应用了该注解的办法,每次会在@Test标记的办法之前执行。也就是说,每次在执行@Test标记的办法之前都会执行@before标记的办法@after:应用了该注解的办法,每次会在@Test标记的办法之后执行。也就是说,每次在执行@Test标记的办法之后都会执行@after标记的办法二:JDBC概述1.什么是JDBC:通过JAVA语言连贯数据库 2.如何通过JDBC程序连贯数据库: //1.注册数据库驱动Class.forName("com.mysql.jdbc.Driver");//2.获取数据库连贯Connection conn=DriverManager.getConnection("jdbc:mysql:///jt_db?characterEncoding=utf-8","root","root");//3.获取传输器Statement stat=conn.createStatement();//4.发送SQL语句到服务器执行,并返回后果String sql="select * from account";ResultSet rs=stat.executeQuery(sql);//5.解决执行的后果while(rs.next()) { int id=rs.getInt("id"); String name=rs.getString("name"); Double money=rs.getDouble("money"); System.out.println(id+","+name+","+money); }//6.开释资源frs.close(); stat.close(); conn.close();System.out.println("JdbcTest01.testFindAll01()");}

November 8, 2020 · 1 min · jiezi

关于jdbc:JDBC预防SQL注入预处理对象PrepareStatement

PreparedStatement接口介绍PreparedStatement是Statement接口的子接口,继承于父接口中所有的办法.它是一个预编译的SQL语句对象预编译: 是指SQL语句被预编译,并存储在PreparedStatement对象中. 而后能够应用此对象屡次市郊地执行该语句PreparedStatement特点因为有事后编译的性能, 进步SQL的执行效率能够无效的避免SQL注入的问题,安全性更高获取PreparedStatement对象与Statement相似, 都是通过Connection进行创立创立 Connection接口中的办法阐明PreparedStatement prepareStatement(String sql)指定预编译的SQL语句预编译的SQL语句: SQL语句中应用占位符?PreparedStatement接口罕用办法与Statement相似,接口罕用办法名都是int executeUpdate()与ResultSet executeQuery与Statement不同,上述两个办法是没有参数的.因为在结构PrepareStatement对象时,就曾经传入SQL进行了预编译罕用办法阐明int executeUpdate()执行insert / update / delete 语句.返回受影响的行数ResultSet executeQuery()执行select语名.返回后果集对象Result应用PreparedStatement的步骤编定SQL语句,未知内容应用 ? 占位select * from test_02 where name = ? and password = ?获取PreparedStatement对象设置理论参数: 调用setXxx办法执行参数化SQL敞开资源应用PreparedStatement实现登录案例代码示例public class LoginTest02 { public static void main(String[] args) throws SQLException { // 1.获取连贯 Connection conn = JDBCUtils.getConnection(); // 2.应用占位符创立sql语句,获取prepareStatement对象 // 应用?占位符的形式来设置参数 String sql = "select * from test_02 where name = ? and password = ?"; PreparedStatement preparedStatement = conn.prepareStatement(sql); // 3.提醒用户输出用户名和明码 Scanner sc = new Scanner(System.in); System.out.println("请输出用户名:"); String user = sc.next(); System.out.println("请输出明码:"); String pass = sc.next(); // 4.替换占位符,执行sql语句 // 设置参数,应用setXXX(int 占位符地位 从1开始, 要设置/替换的值)的办法设置占位符的参数 preparedStatement.setString(1,user); // 设置第一个问号值为name preparedStatement.setString(2,pass); ResultSet resultSet = preparedStatement.executeQuery(); // 5.处理结果集,判断是否登录胜利 if(resultSet.next()){ System.out.println("登录胜利!欢送:" + user); }else{ System.out.println("登录失败!"); } // 6.敞开对象 JDBCUtils.close(conn,preparedStatement,resultSet); }}运行后果(失常) ...

September 5, 2020 · 1 min · jiezi

关于jdbc:JDBCSQL注入案例模拟用户登录

需要承接上文JDBC-SQL注入简介. 在大略理解了什么是SQL注入之后,接下来应用test_02数据库表模仿用户登录操作. 提醒用户输出用户名和明码,应用Statement字符串拼接的形式实现用户登录 步骤JDBC-编写工具类调用JDBCUtils工具类获取连贯调用JDBCUtils工具类获取语句执行平台(即Statement对象)提醒用户输出用户名和明码执行字符串接接后的sql语句判断是否登录胜利调用JDBCUtils工具类敞开对象代码示例public class LoginTest01 { public static void main(String[] args) throws SQLException { // 1.获取连贯 Connection conn = JDBCUtils.getConnection(); // 2.获取执行平台,即Statement对象 Statement sqlExecute = JDBCUtils.createStatement(conn); // 3.提醒用户输出用户名和明码 Scanner sc = new Scanner(System.in); System.out.println("请输出用户名: "); String user = sc.nextLine(); System.out.println("请输出明码: "); String pass = sc.nextLine(); // 4.执行字符串拼接后的sql语句 String sql = "select * from test_02 where name = '" + user + "' and password = '" + pass + "';"; System.out.println(sql);//查看执行的sql语句 ResultSet resultSet = sqlExecute.executeQuery(sql); // 5.判断是否登录胜利 if(resultSet.next()){ System.out.println("登录胜利,欢送:" + user); }else{ System.out.println("登录失败!"); } // 5.敞开对象 JDBCUtils.close(conn,sqlExecute,resultSet); }}运行后果一(失常输出) ...

September 5, 2020 · 1 min · jiezi

关于jdbc:JDBCSQL注入简述

什么是SQL注入SQL注入即是指web应用程序对用户输出数据的合法性没有判断或过滤不严,攻击者能够在web应用程序中当时定义好的查问语句的结尾上增加额定的SQL语句,在管理员不知情的状况下实现非法操作,以此来实现坑骗数据库服务器执行非受权的任意查问,从而进一步失去相应的数据信息。(百度百科)其实简略说就是,在输出零碎要求的内容之外,又增加了额定的内容,造成返回数据数据库返回谬误内容,从而给攻击者提供可乘之机 接下应用mysql进行阐明 数据库操作演示首先我曾经在数据库建好一张表test_02,数据内容如下: 以id=1的数据为例 如果name='wdm' and password='0704',那么是能够正确返回这条数据的,这里就模仿wdm用户登录胜利 如果name='wdm' and password='1111' or '1'='1'.能够看到,其实这里对于用户wdm来说,明码曾经输出谬误.但因为前面有一个or '1'='1'这个恒为真的语句并且应用or 一真为真,同假为假,数据库表却返回了正确的后果. 如果说这是一个登录操作,此时用户就曾经登录胜利了.这显示不是咱们想要的成果

September 5, 2020 · 1 min · jiezi

关于jdbc:JDBC概述

什么是JDBCJDBC(Java Data Base Connectivity) 是Java拜访数据库的标准规范.是一种用于执行SQL语句的Java API.能够以多种关系数据舞蹈提供对立拜访. 它由一组用Java语言编写的类和接口组成. 是Java拜访数据库的标准规范JDBC原理JDBC是接口,驱动是接口的实现.没有驱动将无奈实现数据库连贯,从而不能操作数据库每个数据库厂商都须要提供本人的驱动,用来连贯本人公司的数据库. 也就是说,驱动个别都由数据库生成厂商提供 总结JDBC就是由sun公司定义的一套操作所有关系型数据库的规定(接口)数据库厂商就须要实现这套接口,提供数据库驱动jar包咱们能够应用这套接口进行编程,真正执行的代码是对应驱动包中的实现类附:导入连贯mysql数据库的jar包JDBC-idea导入mysql连贯java的jar包

September 4, 2020 · 1 min · jiezi

关于jdbc:JDBC的基本使用

1.应用步骤:导包加载驱动类class.forName(....)DriverManager获取sql对象写sql语句Statement与prepareStatement不一样的执行sql语句,前者是间接sql对象 . 执行语句,而后者是预处理,即在创立sql对象时,就用sql语句,最初在用对象执行操作。2.JDBCUtils工具类:就是把应用步骤的共性,提出来,放在一个类中,这样当前就能间接调用创立sql对象的办法就行了。值得一提的是,如果咱们应用配置文件,扩展性更好,在应用其余数据库时,咱们只须要更改配置文件properties。获取配置文件能够应用properties对象。获取jar包的绝对路径能够应用classLoader类加载器。这样咱们就不必本人增加门路了。 public class JDBCUtils { private static String url; private static String user; private static String password; private static String driver; /** * 文件的读取,只须要读取一次即可拿到这些值。应用动态代码块 */ static{ //读取资源文件,获取值。 try { //1. 创立Properties汇合类。 Properties pro = new Properties(); //获取src门路下的文件的形式--->ClassLoader 类加载器 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); URL res = classLoader.getResource("jdbc.properties"); String path = res.getPath(); //2. 加载文件 pro.load(new FileReader(path)); //3. 获取数据,赋值 url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); driver = pro.getProperty("driver"); //4. 注册驱动 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取连贯 * @return 连贯对象 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } /** * 开释资源 * @param stmt * @param conn */ public static void close(Statement stmt,Connection conn){ if( stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if( conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 开释资源 * @param stmt * @param conn */ public static void close(ResultSet rs,Statement stmt, Connection conn){ if( rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if( stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if( conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }3.DBC管制事务:在执行sql语句时,如果程序执行过程中,产生了异样。比方有两个sql语句,一个是转账操作,一个人存转的这笔钱,如果第一个操作完结后产生了异样。那么这笔钱就会不胫而走,所以为了防止这样的状况,能够应用事务。 ...

August 23, 2020 · 3 min · jiezi

关于jdbc:jdbc

jdbc概述jdbc(java database connectivity)java数据库连贯技术//注册数据库驱动,让jdbc连贯mysql驱动程序1.class.forName("com.mysql.jdbc.Driver");//获取数据库连贯,连贯上数据库的url地址2.Connection conn=DriverManager.getConnection{"jdbc:mysql://localhost:3306/具体的库名?characterEncoding=utf-8","root","root");//获取传输器3.Statement stat = conn.createStatement();//发送sql到服务器执行并且返回执行后果4. String sql= "select * from account"; ResultSet rs= stat.executeQuery( sql );//处理结果,这里的解决形式不惟一,能够有很多种解决形式能够通过同理数组的形式,将值进行批改赋值,5.while(rs.next()){int id =//资源开释,这外面的资源开释时,越是晚获取执行的就越先敞开资源6. rs.close(); stat.close(); conn.close(); jdbcUtil.close(conn.stat.rs)//jdbc工具类,能够对立开释资源 resultSet后果集对象//用于封装sql语句查问到的后果 (1)遍历数据行的办法 next()-- 能够通过while()语句去执行循环遍历数组 (2)获取数据的办法 PrepareStatement//在开发中咱们用的更多的传输器对象是PreparedStatement对象,PreparedStatement是Statement的子接口,比Statement更加平安,并且可能进步程序执行的效率。 ### sql注入攻打 即便不输出明码只输出用户名也能够实现登陆胜利,这就是sql注入攻打 ### 避免SQL注入攻打 (1)应用正则表达式在提交参数前进行校验, (2)应用prepareStatement ### 正则表达式 正则表达式(regular expression)形容了一种字符串匹配的模式(pattern),能够用来查看一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出合乎某个条件的子串等。//自行百度 数据库连接池 连接池:就是将连贯寄存在容器中,供整个程序共享,能够实现连贯的复用,缩小连贯创立和敞开的次数,从而进步程序执行的效率! ### 如何应用C3P0连接池 所有的连接池都要实现一个接口——DataSource(数据源),因而连接池也被叫做数据源! C3p0连接池的应用步骤 1.导入 jar 2.创立数据库连接池(对象) 3.设置根本信息 设置连贯数据库的根本信息 (1)形式一:(不举荐) 间接将参数通过 pool.setXxx办法设置给c3p0程序 (2)形式二:将连贯参数提取到properties文件中(举荐) 在类目录下(开发时能够放在src或者相似的源码目录下),增加一个c3p0.properties文件 (3)形式三:将连贯参数提取到xml文件中(举荐) 在类目录下(开发时能够放在src或者相似的源码目录下),增加一个c3p0-config.xml文件 4.从连接池中获取一个连贯对象并且进行应用 5.用完连贯后将连贯还回连接池中 System.out.println("TestJdbc.main()....");//为了防止程序出现异常,能够抛出异样解决,

August 6, 2020 · 1 min · jiezi

关于jdbc:JDBC连接那些事

分享一篇对于JDBC连贯数据库的好文:JDBC连贯数据库的四种形式:DriverManager,DataSource,DBCP,C3P0 以及Oracle官网举荐应用dataSource进行数据库连贯教程:jdbc连贯Oracle教程连贯代码示例 这也解释了为什么在写spring我的项目时,咱们要配置datasource了,而不是通过DriverManager来获取连贯。

August 3, 2020 · 1 min · jiezi