Java连接Mysql数据库(JDBC)

文章目录

    • 导入包
    • con、stmt、rs 三者存在一定的关系
    • getInt和getString
    • input.nextInt();简单使用讲解
    • ResultSet和Statement
    • PreparedStatement的用法
    • JDBC连接代码
    • 更多样例

导入包

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.statement;
import java.sql.ResultSet;
import java.util.Scanner;import java sql.*;

con、stmt、rs 三者存在一定的关系

(1)连接数据库后 实例化con
(2)创建stmt=con.createstatement();
(3)然后执行rs=stmt.excuteQuery()执行sql语句,产生单个结果集;

getInt和getString

ResultSet rs = null;
String sql="SELECT flow_id,Type,id_card,exam_card,student_name,location,grade FROM examstudent";rs = st.executeQuery(sql); //rs:数据集
rs.getInt(int index);
rs.getInt(String columName); //你可以通过索引或者列名来获得查询结果集中的某一列的值。//举例
while(rs.next)
{rs.getInt(1)//等价于rs.getInt("flowid");rs.getString(5)//等价于rs.getInt("student_name");
}

input.nextInt();简单使用讲解

完整的写法是 先导入 输入流 类 Scanner
import java.util.Scanner;

然后使用输入流 , 按照你的问题中的 写法和名称, 应该这样使用 Scanner 这个类

Scanner input = new Scanner(System.in); // 创建输入流对象 input
int userNum = input.nextInt(); // 使用输入流对象 调用nextInt() 方法输入一个整数到userNum中

其意思是 使用 Scanner 类中的 nextInt() 方法 输入一个整数, 该方法只是接受一个 整型的数据,如果输入的是非整数数据, 将会 抛出 InputMismatchException异常,其实就是专门为在命令式界面中 提供的一种输入类, Scanner 类位于 java.util 包中, 其中还有更多常用的其他方法。
例如:

nextLine()   //   输入一行数据,一般会将你输入的数据当做 字符串处理
nextDouble() //   输入一个 双精度实型的 数据
nextFloat()  //   输入一个 单精度实型的 数据
nextByte()   //   输入一个字节的 数据
nextLong()   //   输入一个long型的 数据,

等等, 如果输入错误的话, 或者输入的东西和你 调用的方法不匹配, 都会抛出 InputMismatchException 异常

ResultSet和Statement

ResultSet:

查询数据库时,返回的是一个二维的结果集,我们需要用到ResultSet来遍历结果集,获取每一行的数据。

boolean next() 将光标从当前位置向前移一行。
String  getString(int columnIndex)  以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值 
String  getString(String columnLabel)  以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值
while(rs.next()) {int id = rs.getInt(1);// 获取第一个列的值 编号idString bookName = rs.getString(2);// 获取第二个列的值 图书名称 bookNameString author = rs.getString(3);// 获取第三列的值 图书作者 authorfloat price = rs.getFloat(4);// 获取第四列的值 图书价格 priceSystem.out.println("id="+id+" bookName="+bookName+" author="+author+" price="+price);System.out.println("................................................");

Statement :
(1)建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。
(2)Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和execute

1.方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句

2.方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。 INSERT、UPDATE 或
DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。
对于CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

3.方法 execute用于执行返回多个结果集、多个更新计数或二者组合的语句。

PreparedStatement的用法

java.sql.statement要求开发者付出大量的时间和精力。
在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。
通过使用java.sql.preparedstatement,可以自动解决这个问题。
一个preparedstatement是从java.sql.connection对象和所提供的sql字符串得到的,sql字符串中包含问号(?),这些问号标明变量的位置,然后提供变量的值,最后执行语句,例如:

string sql = "select * from people p where p.id = ? and p.name = ?";
preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,name);
resultset rs = ps.executequery(); 

使用preparedstatement的另一个优点是字符串不是动态创建的。
下面是一个动态创建字符串的例子:

string sql = "select * from people p where p.i = "+id; 

这允许jvm(java virtual machine)和驱动/数据库缓存语句和字符串并提高性能。
preparedstatement也提供数据库无关性。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小。
由于preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement。

import java.sql.*;
public class mypreparedstatement {private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver";private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs";public mypreparedstatement() {}public void query() throws sqlexception {connection conn = this.getconnection();string strsql = "select emp_id from employee where emp_id = ?";preparedstatement pstmt = conn.preparestatement(strsql);pstmt.setstring(1,"pma42628m");resultset rs = pstmt.executequery();while(rs.next()) {string fname = rs.getstring("emp_id");system.out.println("the fname is " + fname);}rs.close();pstmt.close();conn.close();}private connection getconnection() throws sqlexception {
// class.connection conn = null;try {class.forname(db_driver);conn = drivermanager.getconnection(url,"sa","sa");} catch (classnotfoundexception ex) {}return conn;}
//mainpublic static void main(string[] args) throws sqlexception {mypreparedstatement jdbctest1 = new mypreparedstatement();jdbctest1.query();}
}

为什么要始终使用PreparedStatement代替Statement?为什么要始终使用PreparedStatement代替Statement?

在JDBC应用中,应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。

基于以下的原因:
一.、代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心。
二、PreparedStatement尽最大可能提高性能

每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.
所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行。
而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values (‘11’,‘22’);
insert into tb_name (col1,col2) values (‘11’,‘23’);
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义。事实是没有数据库会对普通语句编译后的执行代码缓存.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果,以保存有更多的空间存储新的预编译语句。

三、最重要的一点是极大地提高了安全性.

常见的SQL注入:

String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";

如果我们把[’ or ‘1’ = '1]作为passwd变量传入进来。

select * from tb_name = '随意' and passwd = '' or '1' = '1';

因为’1’='1’肯定成立,所以可以任何通过验证.
更有甚者:
[';drop table tb_name;]作为varpasswd传入进来,有

select * from tb_name = '随意' and passwd = '';drop table tb_name;

有些数据库是不会让你成功。.

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑。

JDBC连接代码

在这里插入图片描述

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;public class JDBCUtil {static String driverClass=null;static String url=null;static String name=null;static String password=null;static {try{//1.创建一个属性对象Properties properties=new  Properties();InputStream is=JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");//导入输入流properties.load(is);//读取属性driverClass= properties.getProperty("driverClass");url= properties.getProperty("url");name= properties.getProperty("name");password= properties.getProperty("password");}  catch(Exception e) {e.printStackTrace();}}public static Connection getConn() {Connection conn=null;try {Class.forName(driverClass);//1.注册驱动	DriverManager.registerDriver(new com.mysql.jdbc.Driver());// 2.建立连接  参数一:协议+访问的数据库      参数二: 用户名                参数三:密码//conn=DriverManager.getConnection("jdbc:mysql://localhost/test?useSSL=false","root","1234");conn=DriverManager.getConnection(url,name,password);} catch(Exception e) {e.printStackTrace();}return conn;}
//  释放资源public static void release(Connection conn,Statement st,ResultSet rs) {closeRs(rs);closeSt(st);closeConn(conn);}private static void closeRs(ResultSet rs) {try {if(rs!=null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}finally {rs=null;}}private static void closeSt(Statement st) {try {if(st!=null) {st.close();}} catch (SQLException e) {e.printStackTrace();}finally {st=null;}}private static void closeConn(Connection conn) {try {if(conn!=null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}finally {conn=null;}}}

更多样例

class DBConnection{//    驱动类名String driver="com.mysql.jdbc.Driver";
//    URL格式,最后为数据库名String url="jdbc:mysql://localhost:3306/javaTest?useUnicode=true&characterEncoding=UTF8";  //JavaTest为你的数据库名称String user="root";String password="123456";Connection  coon=null;public DBConnection(){try{
//            加载驱动程序Class.forName(driver);coon=(Connection)DriverManager.getConnection(url,user,password);if(!coon.isClosed()){System.out.println("成功连接数据库!");}}catch (Exception e){e.printStackTrace();}}public void close(){try{this.coon.close();}catch(Exception e){e.printStackTrace();}}
//    增加数据public void add(String name,int age,String gender){
//        String sql="insert into usrInfo(username,gender,age) values(?,?,?)";  //向usrInfo表中插入数据String sql="insert into usrInfo(age,gender,username) values('"+age+"','"+gender+"','"+name+"')";try{PreparedStatement preStmt=(PreparedStatement)this.coon.prepareStatement(sql);
//            preStmt.setString(1, name);
//            preStmt.setInt(3, age);
//            preStmt.setString(2, gender);  //和上面的注释的一块组成另外一种插入方法preStmt.executeUpdate();System.out.println("插入数据成功!");preStmt.close();}catch(Exception e){e.printStackTrace();}}//    查询public void select(){String sql="select * from usrInfo";  //查询usrInfo表中的信息try{Statement stmt=(Statement)this.coon.createStatement();ResultSet rs=(ResultSet)stmt.executeQuery(sql);  //得到的是结果的集合System.out.println("--------------------------------");System.out.println("姓名"+"\t"+"年龄"+"\t"+"性别");System.out.println("--------------------------------");while(rs.next()){String name=rs.getString("username");int age=rs.getInt("age");String gender=rs.getString("gender");System.out.println(name+"\t"+age+"\t"+gender);}stmt.close();}catch(Exception e){e.printStackTrace();}}//    更改数据public void update(String name,int age){String sql="update usrInfo set age=? where username=?";  //推荐使用这种方式,下面的那种注释方式不知道为啥有时候不好使
//        String sql="update usrInfo set age="+age+" where username='"+name+"'";try{PreparedStatement prestmt=(PreparedStatement)this.coon.prepareStatement(sql);prestmt.setInt(1, age);prestmt.setString(2,name);prestmt.executeUpdate();//            Statement stmt=(Statement)this.coon.createStatement();
//            stmt.executeUpdate(sql);System.out.println("更改数据成功!");prestmt.close();}catch(Exception e){e.printStackTrace();}}//    删除数据public void del(String name){String sql="delete from usrInfo where username=?";try{PreparedStatement prestmt=(PreparedStatement)this.coon.prepareStatement(sql);prestmt.setString(1, name);prestmt.executeUpdate();System.out.println("删除数据成功!");prestmt.close();}catch(Exception e){e.printStackTrace();}}
}

在主类中对其创建实例,实例中构造方法完成数据库的连接操作,实例调用增删改查方法进行对数据库信息的操作

public class mysqlTest {public static void main(String args[]){Scanner in=new Scanner(System.in);DBConnection db=new DBConnection();//        插入数据System.out.println("输入姓名,年龄,性别:");String name=in.next();int age=in.nextInt();String gender=in.next();db.add(name, age, gender);//        查询数据db.select();//        修改数据
//        String name=in.next();
//        int age=in.nextInt();
//        db.update(name, age);//        删除数据
//        String name=in.next();
//        db.del(name);
//
//        db.close();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux编程考前测试题

文章目录选择题多选题判断题填空题简答题编程题选择题 1:当打开vi文本编辑器编辑文件时,vi处于(A)模式 A: 命令模式 B: 编辑模式 C: 实模式 D: 虚模式 2:下列有关fork()函数返回值说法错误的是(D&#xf…

MySQL考试复习(知识点、练习题)

文章目录数据库的管理技术的三个阶段发展的三个阶段数据库的锁数据库设计的基本步骤事务的四大特性什么是视图如果关系模式设计不好,可能带来哪几个问题数据库管理系统的主要功能有哪些数据库系统中的常见故障有哪些简述SQL语言的组成说明关系模型有哪三类完整性规则…

Oracle复习(知识点、练习题、实验)

文章目录第一章 数据库概念数据库的三级模式结构:模式、外模式、内模式三级模式之间的映射第二章 Oracle12g体系结构Oracle的逻辑存储结构Oracle物理存储结构Oracle11g服务器结构系统全局区(SGA)程序全局区(PGA)第三章…

Openstack面试题和知识点总结

文章目录知识点云计算起源定义特点分类服务类型平台分类应用虚拟化虚拟化技术定义分类云计算和虚拟化的关系虚拟化的优点OpenStack简介核心架构Openstack组件共享服务组件核心组件组件详解RabbitMQ概念特点rabbitmq中的概念工作原理常用操作MemcachedKeystoneGlance工作原理Nov…

auto.js 实现信息发送、QQ点赞、微信点赞、健康日报签到

文章目录auto.js开发文档安装total control在手机端安装auto.js apk安装vscode短信多条发送QQ点赞微信点赞健康日报填写叠猫猫auto.js开发文档 点击学习 安装total control total control 用于手机投屏在电脑屏幕上 在手机端安装auto.js apk 链接:https://pan.…

MapReduce综合学习含Wordcount案例

文章目录MapReduce简介MapTaskReduceTaskMapper阶段解读Reducer阶段解读MapReduce适用的问题MapReduce的特点MapReduce基本思想大数据处理思想:分而治之构建抽象模型:Map 函数和 Reduce 函数上升到架构:并行自动化并隐藏底层细节MapReduce计算…

基于Spring boot+Vue的在线考试系统

文章目录spring boot 分层图解安装idea配置阿里云镜像项目启动前端项目结构项目前端中index.htmlApp.vuemain.jsrouter整个页面渲染过程关于矢量图图标的使用引入JQuery依赖github-markdown-css样式文件-一般用作文章正文的样式美化spring boot 分层图解 安装idea 安装参考 id…

Java基础总结之(面试)

文章目录Java标识符Java修饰符访问权限修饰符访问控制和继承非访问权限修饰符局部变量修饰符接口接口中方法修饰符运算符算术运算符一元运算符二元运算符算术赋值运算符赋值运算符逻辑运算符(&&、||和!)关系运算符自增和自减运算符(和…

Javaweb练手项目

文章目录学生管理系统音乐网站锋芒博客中医药管理系统博客天梯CMS系统锋芒社团官网学生管理系统 实现技术:ServletMVC(模式)Filter(过滤器)html 主要功能:学生信息的增删查改,文件(图片&#x…

Spark之scala学习(基础篇)待更新

文章目录引言大数据介绍大数据与云计算区别大数据和人工智能的区别大数据和传统的分析(excel)的区别scala的特性面向对象特性函数式编程函数式编程的特点:函数式编程的优势静态类型扩展性并发性为什么要学scalascala安装简单测试了解ScalaSca…

Jupyter Notebook的安装及问题解决方案

文章目录下载并安装Anaconda3更改主界面路径但是如果没有jupyter_notebook_config.py文件怎么办?如果更改过路径后,不生效怎么办?使用参考pycharm导入pyspark下载并安装Anaconda3 官网下载个人版 Anaconda3安装参考 点击,然后进…

airodump-ng wlan0mon扫描不到网络_MySQL ProxySql 由于漏洞扫描导致的 PROXYSQL CPU 超高...

ProxySQL 本身是一款非常棒的MYSQL 中间件的开源产品, 在公司运行了一段时间后,突然一天报警,所在机器的CPU 出奇的高,之前在测试系统, 预生产, 以及生产系统均没有出现问题. 开始未来紧急解决问题,重新启动了proxysql服务,并查看错误日志.PROXYSQL 的系统版本的2.012 MYSQL 的…

4个空格和一个tab有什么区别_火花塞为什么一换就是4个?只换一个不行吗?

火花塞不是一个经常被提及的配件,但如果火花塞老化,车辆的整体性能将受到影响,更换火花塞其实也是日常保养的一部分,就像换机油和三滤一样。不知道大家是否注意到,在做完保养之后,维修师傅会帮你检查一下火…

小型云台用的是什么电机_直流电机的工作原理是什么?未来的电动车都会用直流电机吗?...

说起直流电机,其实我们每个人,每天都在用。是吗?别惊讶,是的。手机,我们每天都在用,有消息或者有电话时,手机就开始振动。这个振动就是用直流电机来实现的。当然,直流电机在其他领域…

C语言、C++学习路线

文章目录C语言 C语言大纲 C语言知识点总结图 C语言视频推荐基础篇进阶篇速成篇基础入门之游戏实战篇C语言核心链表文档教程视频教程文件C语言实例C C大纲岗位分析 C与C 编程基础四大件数据结构与算法计算机网络操作系统设计模式C视频推荐C语言 C语言大纲 C语言知识点总结图 C语…

2020年日历_2020年《故宫日历》发布:浓缩紫禁城600年沧桑

2020年《故宫日历》。中国网记者 刘维佳/摄中国网8月26日讯(记者 刘维佳) 2020年《故宫日历》发布会今日在故宫博物院建福宫举行。2020年为庚子鼠年,亦正值紫禁城建成六百周年,因此,2020年《故宫日历》是为纪念紫禁城六百周年而特别呈现。故宫…

jav简单的个人博客网站代码_每个人都可以拥有的个人博客网站

题记------去过的地方越多,越知道自己想回到什么地方去!雨又下了一夜,曾经多少次觉得下雨天是最适合睡觉的天气。而最近的雨,总感觉有些嘈杂,总怕吵醒远方睡梦中的星,晨。以至于翻来覆去睡不着。但是&#…

泰禾光电机器人研发_机器之眼 | 3D相机能让机器人看见什么?

“中国制造2025”,其核心环节之一就是机器人智能化。视觉技术代表了机器的眼睛和大脑,机器视觉将使得机器人智能化变成现实。为了使机器人能够胜任更复杂的工作,机器人不但要有更好的控制系统,还需要更多地感知环境的变化。机器人…

云计算学习路线

文章目录说明云计算学习路线云计算技术支撑Linux 基础环境搭建文档教程Linux学习视频推荐云计算基础知识docker容器KVM(推荐一本书《深度实践KVM》)OpenStackK8S(Kubernetes)说明 云计算和大数据未来十年必然趋势成为社会的生产资…

算法学习路线图

关于算法的讨论 如何系统地学习数据结构与算法?| 自学数据结构与算法最全路线 编程指北 动态规划-背包问题 最小生成树(MST)—prim和kruskal算法 用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle) n皇后问题[分支限界法] 克鲁斯卡尔算法(Krus…