聊聊mysql jdbc的queryTimeout及next方法

聊聊mysql jdbc的queryTimeout及next方法,第1张

本文主要介绍一下mysql jdbc statement的queryTimeout及resultSet的next方法

mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/PreparedStatement.java

mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/MysqlIO.java

mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/StatementImpl.java

mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/ResultSetImpl.java

mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/RowDataCursor.java

mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/MysqlIO.java

对于mysql jdbc来说:

列的自增属性,一般用来设置整数列根据一定步长逐步增长的值,类似于其他数据库的序列。不过这里的“序列”是基于特定一张表的。关于自增属性的相关特性如下:

1. 控制自增属性性能的变量:innodb_autoinc_lock_mode

innodb_autoinc_lock_mode=0

代表传统模式,也就是说,在对有自增属性的字段插入记录时,会持续持有一个表级别的自增锁,直到语句执行结束为止。比如说下面两条语句,SQL 1 在执行期间,一直持有对表 f1 的表级自增锁,接下来 SQL 2 执行时锁超时。

innodb_autoinc_lock_mode=1

代表连续模式,和传统模式差不多,不同的点在于对于简单的插入语句,比如 SQL 2,只在分配新的 ID 过程中持有一个轻量级的互斥锁(线程级别,而不是事务级别),而不是直到语句结束才释放的表锁。

代表交错模式。这个模式下放弃了自增表锁,产生的值会不连续。不过这是性能最高的模式,多条插入语句可以并发执行。MySQL 8.0 默认就是交错模式。

那针对复制安全来说,以上三种模式,0 和 1 对语句级别安全,也就是产生的二进制日志复制到任何其他机器都数据都一致;2 对于语句级别不安全;三种模式对二进制日志格式为行的都安全。

2. 控制自增属性的步长以及偏移量

一般用在主主复制架构或者多源复制架构里,主动规避主键冲突。

auto_increment_increment 控制步长

auto_increment_offset 控制偏移量

3. 对于要立刻获取插入值的需求

就是说要获取一张表任何时候的最大值,应该时刻执行以下 SQL 3 ,而不是 SQL 2。SQL 2 里的函数 last_insert_id() 只获取上一条语句最开始的 ID,只适合简单的 INSERT。

4. 自增列溢出现象

自增属性的列如果到了此列数据类型的最大值,会发生值溢出。比如变更表 f1 的自增属性列为 tinyint。

SQL 2 显式插入最大值 127, SQL 3 就报错了。所以这点上建议提前规划好自增列的字段类型,提前了解上限值。

5. 自增列也可以显式插入有符号的值

那针对这样的,建议在请求到达数据库前规避掉。

JDBC *** 作MySQL数据库的步骤

1、准备MySQL数据库驱动包:mysql-connector-java-5.0.8-bin.jar,一个项目中只能存在一个版本的驱动包

a、复制该驱动包,粘贴到项目中

b、选中项目里的驱动包,右键->Build Path->Add to Build Path

2、在类里写代码加载驱:决定连接哪种数据库

a、Class.forName("com.mysql.jdbc.Driver")

b、必须进行异常处理:ClassNotFoundException

3、连接数据库

a、Connection con=DriverManager.getConnection("连接字符串", "用户名", "密码")

b、连接字符串格式固定,不同数据库,格式不同:jdbc:mysql://要连接的计算机名称:端口号/要连接的数据库名称

c、必须进行异常处理:SQLException

4、拼写要执行的sql语句,必须是可以在数据库中执行的

5、创建执行sql语句的对象

a、Statement stmt=con.createStatement()

b、注意:Statement必须来自于java.sql包中

6、执行sql语句

a、执行insert、update和delete语句:int row=stmt.executeUpdate(sql)返回影响行数

b、执行查询语句:ResultSet rs=stmt.executeQuery(sql)返回查询结果

c、执行任意sql语句(DDL、DCL、DML和DQL等)

7、对执行结果进行处理

a、执行更新语句:判断影响行数是否为0,0表示失败,非0表示成功

b、对查询结果进行处理:

1) 结果集需要先移动、后取值 :rs.next()int id=rs.getInt(1)

String name=rs.getString("loginName")

2) 结果集有多条时,需要循环 *** 作:

while(rs.next()){System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4)+"\t"+rs.getInt(5))

}

3) 不确定是否有查询结果时:if(rs.next()){说明有查询结果}else{没有查询结果}

4) 使用了聚合函数,一定有查询结果,查询结果是一行一列:

rs.next()

int result=rs.getInt(1)

注意:结果集取值时取出的时查询语句中包含的字段,与表中字段无关

9、关闭相关对象(先关闭结果集对象、在关闭执行语句对象,最后关闭连接对象)

例如:执行查询语句

Scanner input=new Scanner(System.in)

System.out.print("请输入登录名: ")

String name=input.next()

System.out.print("请输入密码: ")

String pass=input.next()

try {

Class.forName("com.mysql.jdbc.Driver")

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "root")

String sql="select COUNT(*) from UserInfo where loginName='"+name+"' and loginPass='"+pass+"'"

Statement stmt=con.createStatement()

ResultSet rs=stmt.executeQuery(sql)

rs.next()

int result=rs.getInt(1)

if(result!=0){

System.out.println("登录成功!")

}else{

System.out.println("用户名或密码错误,请重新登录!")

}

rs.close()

stmt.close()

con.close()

} catch (ClassNotFoundException e) {

System.out.println("加载驱动错误:"+e.getMessage())

} catch (SQLException e) {

System.out.println("数据库 *** 作错误:"+e.getMessage())

}

执行添加、修改和删除语句

try {

//加载驱动

Class.forName("com.mysql.jdbc.Driver")

//连接数据库

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/userdb", "root", "root")

//拼写要执行的sql语句

String sql="update UserInfo set loginPass='111' where loginName='a'"

//String sql="insert UserInfo values(default,'test','test')"

//String sql="delete from UserInfo where loginName='a'"

//创建执行语句对象

Statement stmt=con.createStatement()

//执行

int row=stmt.executeUpdate(sql)

//处理结果

if(row==0){

System.out.println("修改失败!")

}else{

System.out.println("修改成功!")

}

//关闭

stmt.close()

con.close()

} catch (ClassNotFoundException e) {

System.out.println("驱动加载错误:"+e.getMessage())

} catch (SQLException e) {

System.out.println("数据库 *** 作错误:"+e.getMessage())

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8682267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存