序言
hello我是bigsai,本日咱们进行JDBC+MySQL实战,非常适宜初入门的小伙伴打开新的天下。实现一个增编削查(curd)的例子。先点赞再不雅观看、帅哥靓女养成好习气!
在这个案例进行之前,你要确保自己电脑上拥有MySQL和IDEA编译器,其余还要安装MySQL数据库连接管理工具Navicat。方能进行以下的操作。
如果以前没见过或者利用过也不要紧,本课程供应傻瓜式传授教化你只需随着我的哀求来包成功包会。
通过本篇你可以节制以下内容:
MySQL数据库的创建JDBC+MySQL项目的创建JDBC成功对MySQL增编削查案例剖析本次案例到底是个什么结果呢?本案例实现一个学生信息的管理,即学生个人信息的增编削查。
核心思路拆解我们该如何设计这个项目呢?
别急别急,听我逐步说道。对付本案例的实战,旨在实现用Java措辞(JDBC)操作MySQL,核心的主轴是MySQL的数据,以是我们从MySQL为起始点入手,全体案例实现的流程大致可以分为:
剖析设计需求、创建MySQL数据库和表创建Java项目,添加JDBC以及Junit单元测试的依赖编写项目代码,实现JDBC增编削查案例单元测试而对付JDBC编程来说,它须要与MySQL进行连接交互,它也有一定流程顺序须要遵守,常日为以下6个流程:
1:注册驱动 (仅仅做一次) 2:建立连接(Connection) 3:创建运行SQL的语句(Statement) 4:运行语句 5:处理运行结果(ResultSet) 6:开释资源案例涉及知识点本案例紧张涉及的知识点为MySQL和JDBC。而这两个知识点是Java Web开拓非常常用的技能,下面我就给你先容一番。
MySQL :MySQL是当前非常盛行的数据库之一,且免费开源,数据库是用来储存数据的,就数据格式而言,有关于型数据和非关系型数据,MySQL是一种关系型数据库。就web方面,MySQL是最好的RDBMS(关系数据库管理系统:Relational Database Management System)之一:MySQL的sql语句是常用关系数据库的标准之一,具有速率快、体积小、本钱低等上风,是中小企业以及学习利用的最好办法之一。
在Java中利用JDBC可以快速在运用中利用MySQL。除了DDL(数据库模式定义措辞:Data Definition Language)和DML(数据操纵措辞:Data Manipulation Language)等传统操作外,你可以通过JDBC利用MySQL的大部分功能。并且MySQL供应索引优化查询速率,利用B+树或哈希办法的索引知足不同场景查询性能的哀求。还供应视图、函数、约束、触发器等功能能够使得数据库知足更多的场景利用。而MySQL供应的事务、回滚等机制能够使得数据在安全性同等性方面有更大的担保。
JDBC
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java措辞中用来规范客户端程序如何来访问数据库的运用程序接口(位于jdk的java.sql中)。我们常日说的JDBC是面向关系型数据库的,供应了诸如查询、更新、删除、增加数据库中数据的方法。在利用时候须要导入详细的jar包,不同数据库须要导入的jar包不同。
而JDBC紧张有以下API:
DriverManager:卖力加载不同驱动程序(Driver),并根据不同的要求,向调用者返回相应的数据库连接(Connection)。Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的要求并返回相应的数据库连接(Connection)。Connection:数据库连接,卖力与数据库进行通讯,SQL实行以及事务处理都是在某个特定Connection环境中进行的。可以产生用于实行SQL的Statement、PreparedStatement等。Statement:用以实行SQL查询和更新(针对静态SQL语句和单次实行)。PreparedStatement:用以实行包含动态参数的SQL查询和更新(在做事器端编译,许可重复实行以提高效率)继续Statement,本案例利用PreparedStatement。CallableStatement:用以调用数据库中的存储过程。SQLException:代表在数据库连接的建立和关闭和SQL语句的实行过程中发生了例外情形(即缺点)。我想现在你对MySQL和JDBC有了更清楚的认识吧,MySQL它便是一个数据库供我们利用,而JDBC便是Java利用MySQL的一个工具和桥梁,结合上面知识,下面我们就开始实战吧!
在实战之前,须要把数据库和项目创建好才能进行JDBC的增编削查。
创建数据库我们利用Navicat创建数据库,你可能好奇Navicat到底是个什么样的工具,有何浸染?
实在Navicat是一个数据库管理工具,它并不能直接修正MySQL的数据和构造,而是经由你的可视化界面操作它帮你实行sql代码,由于考虑到如果直接让你用sql操作数据库,可能不太直不雅观并且上手难度挺大的,通过Navicat管理数据库可以清晰看到数据库构造、数据、设置情形也能够很随意马虎的进行变动,大大提升开拓效率一定程度减少缺点。可以参考下图:
打开Navicat连接数据库,连接成功的数据库右击创建数据库,数据库名称为:boxuegu,字符集和排序规则利用其默认即可。
然后打开boxuegu数据库,在表的栏目右击新建表,设置id,name,age,high四个字段,个中id设为主键且自增。
保存时候把这张表命名为student,代指学生表。这样,学生表就添加完成了。个中id为自增主键,插入的时候不插入id会自动递增插入,name便是学生的姓名,age表示学生年事。high表示学生身高,我们用这几个字段表示一个学生信息情形。
当然,如果你不喜好利用数据库管理工具进行这样操作,更喜好掌握台或者命令行创建数据库以及表格,当然也是可以的:
SETFOREIGN_KEY_CHECKS=0;--------------------------------Tablestructureforstudents------------------------------DROPTABLEIFEXISTS`student`;CREATETABLE`students`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(255)NOTNULL,`age`int(11)NOTNULL,`high`int(11)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;
这样我们数据库以及表就创建完成啦,我们下面就要用JDBC对MySQL的这张表进行增编削查实战。让你动手操作数据。
创建项目我们创建java项目要引入JDBC的依赖,这里我为了更大略不让你去自己找JDBC的jar包,利用Maven的办法引入jar包,以是我们利用IDEA创建Maven项目。
首先打开IDEA,创建Maven项目,点击next。
接着填写GroupId和ArtifactId可以自行填写,本案例填写com和JDBCTest,点击next。
紧接着选择磁盘中一个文件夹作为项目的路径,点击finish项目即创建成功。接着我们须要添加MySQL的JDBC依赖以及Junit单元测试依赖,在项目pom.xml文件中添加以下内容:
<dependencies><!--https://mvnrepository.com/artifact/mysql/mysql-connector-java--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
然后项目就成功创建啦,紧接着创建以下类:
main的java目录下:sqlmanage类,用于编写sql干系语句main的java目录下:student类,表示student实体与MySQL的studenttest的java目录下:test类,用于编写单元测试。有了JDBC的环境只需编写精确的代码即可运行!对付项目终极的目录是这样的:
第二关 JDBC插入和查询
我们上面有讲过进行JDBC操作的6个步骤,但有些步骤不须要重复进行,比如加载驱动、建立连接、关闭等可以复用。此外,我们在项目中将MySQL中的数据和Java中的工具进行映射(即MySQL表中每一条记录可以天生一个Java工具),项目中函数的设计基于Java工具而非MySQL中数据字段,降落项目中各模块的耦合性。
预备事情首先在student 类中编写以下内容,该类与MySQL数据库的student表对应。
publicclassstudent{privateintid;//与student表得id对应privateStringname;//与student表得name对应privateintage;//年事与student表得age对应privateinthigh;//身高与student表high对应//带id布局方法(查询时利用)publicstudent(intid,Stringname,intage,inthigh){this.id=id;this.name=name;this.age=age;this.high=high;}//不带id得布局方法(插入时候利用)publicstudent(Stringname,intage,inthigh){this.name=name;this.age=age;this.high=high;}//toString()方法,掌握台打印测试利用@OverridepublicStringtoString(){return"student{"+"id="+id+",name='"+name+'\''+",age="+age+",high="+high+"}\n";}//getset方法,设置值,取值利用publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicintgetHigh(){returnhigh;}publicvoidsetHigh(inthigh){this.high=high;}}
紧接着处理sqlmanage类,我们将JDBC的一些操作封装到这里面。在初始化函数中进行注册驱动、建立连接的操作。在sqlmanage中编写以下内容:
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclasssqlmanage{privateConnectioncon=null;//数据库连接,从DriverManager的方法得到,用以产生实行sql的PreparedStatementpublicsqlmanage()throwsSQLException,ClassNotFoundException{//step1加载数据库驱动Class.forName("com.mysql.jdbc.Driver");System.out.println("数据库驱动加载成功");//step2连接数据库this.con=DriverManager.getConnection("jdbc:mysql://localhost:3306/boxuegu?useSSL=false","root","bigsai66");System.out.println("数据库连接成功");}publicvoidclose()throwsSQLException{this.con.close();;}}
个中通过Connection建立连接,Connection是一个接口类。其功能是与数据库进行连接(会话)。建立Connection接口类工具:Connection conn =DriverManager.getConnection(url, user, password);个中url的格式哀求为:
jdbc:mysql://:/?property1=value1&property2=value2…host为主机地址或者域名,本地可以用localhost或127.0.0.1.database_name为MySQL中创建数据库名,本案例中数据库名为boxuegu。property用来配置一些例如编码、时区等属性。个中user为MySQL登任命户名,password为MySQL登录密码。
单个插入MySQL插入的sql语句很大略:
insertinto表名(字段1,字段2,...字段n)value(值1,值2,...值n);
我们JDBC中进行插入操作利用的sql知足上述规范,在sqlmanage中编写insertStudent(student student)函数用来插入单个学生记录,详细函数如下:
publicvoidinsertStudent(studentstudent)throwsSQLException{//创建sql语句Stringsql="insertintostudent(name,age,high)value(?,?,?)";//PreparedStatement能够对SQL语句进行预编译,这样防止了SQL注入提高了安全性。PreparedStatementps=con.prepareStatement(sql);ps.setString(1,student.getName());ps.setInt(2,student.getAge());ps.setInt(3,student.getHigh());//实行sql由于这里插入操作就不对结处理ps.executeUpdate();ps.close();}
在test类中的编写insertTest()函数,用来测试插入三条学生的记录:
@TestpublicvoidinsertTest()throwsSQLException,ClassNotFoundException{sqlmanagesqlmanage=newsqlmanage();sqlmanage.insertStudent(newstudent("bigsai",22,180));sqlmanage.insertStudent(newstudent("bigpian",21,165));sqlmanage.insertStudent(newstudent("doudou",20,160));}
实行完毕刷新navicat中student表你会创造数据被成功插入了:
批量插入
如果同时有100组数据或者更多多少组数据让你插入你会怎么操作?
循环一个一个的插入批处理一次插入多个批量处理比较循环的单个单个处理起来省了很多韶光,提高了系统效率。以是当碰着较多数据时可以选择多个插入。批量插入实现也很随意马虎,在sqlmanage中编写insertStudents(student students[])函数用来批量插入学生记录:
publicvoidinsertStudents(studentstudents[])throwsSQLException{this.con.setAutoCommit(false);//不自动提交Stringsql="insertintostudent(name,age,high)value(?,?,?)";PreparedStatementps=con.prepareStatement(sql);for(inti=0;i<students.length;i++){ps.setString(1,students[i].getName());ps.setInt(2,students[i].getAge());ps.setInt(3,students[i].getHigh());ps.addBatch();if(i%1000==0){ps.executeBatch();}}ps.executeBatch();con.commit();ps.close();}
个中:
con.setAutoCommit(false)意为不自动提交,由于我们在批量处理的时候一样平常手动提交提高效率。紧张通过PreparedStatement工具的addBatch()进行多组插入而未提交。如果为设置不自动提交当实行executeBatch()时就会提交,但为了减小提交次数已经设置不自动提交。当且仅当con.commit()实行才会真的提交到MySQL中。接着在test单元测试中编写insertStudentsTest()函数进行测试批量插入:
@TestpublicvoidinsertStudentsTest()throwsSQLException,ClassNotFoundException{sqlmanagesqlmanage=newsqlmanage();studentstudents[]=newstudent[5];for(inti=0;i<students.length;i++){students[i]=newstudent("路人"+i,12,156);}sqlmanage.insertStudents(students);}
实行完毕后你可以看到数据被成功插入MySQL中:
查询数据
查询的利用频率要远比其他的操作多,虽然有些繁芜表的查询可能会让人比较头疼,但根本的sql查询还是比较大略,其语法格式为:
select字段1,字段2,……from表名[where条件]//办法1selectfrom表名[where条件]//办法2
个中如果没有where条件那么就默认查询整张表的内容,我们在这里根据此条件查询所有记录:查询返回年事小于21岁的所有学生。
首先在sqlmanage中编写getallstudent()函数,用来查询student表中所有age小于21的记录,并把查询的数据终极以List<studnet>类型返回:
publicList<student>getallstudent()throwsSQLException{List<student>list=newArrayList<student>();//返回的结果Stringsql="selectfromstudentwhereage<21";PreparedStatementps=con.prepareStatement(sql);ResultSetresultSet=ps.executeQuery();//结果集while(resultSet.next())//遍历{intid=resultSet.getInt(1);Stringname=resultSet.getString(2);intage=resultSet.getInt(3);inthigh=resultSet.getInt(4);list.add(newstudent(id,name,age,high));}ps.close();returnlist;}
在前面讲的插入的过程返回值实在不须要特殊处理,由于返回是插入成功与否的,而在查询的步骤就要严格的随着JDBC的6个步骤来—由于须要对返回的数据进行处理。我们紧张通过ResultSet处理返回的数据。
在对ResultSet进行迭代遍历取值的过程中,通过getXXX(int index)的方法取值并自动转换为java对应的数据类型。而index为MySQL数据库表格列的编号,也是数据在ResultSet中的对应序列号。
通过上面的函数在test单元测试中编写selectTest() 测试函数在掌握台打印从数据库中查询所有age小于21的记录:
@TestpublicvoidselectTest()throwsSQLException,ClassNotFoundException{sqlmanagesqlmanage=newsqlmanage();List<student>list=sqlmanage.getallstudent();System.out.println(list.toString());}
可以看到数据被成功查询:
JDBC修正和删除修正数据
对某个确定的记录修正,我们一样平常根据这条信息的主键作为条件进行修正。而修正一样平常都须要条件语句where,否则修正全体表的内容。修正的MySQL语句为:
update表名set字段=值[where条件];--建议都有where:不然的话会修正每一条数据
这里我们假设将上述student表中所有age为12的记录的name设置为xiaoming。在sqlmanage中编写update()函数用来进行修正:
publicvoidupdate()throwsSQLException{Stringsql="updatestudentsetname='xiaoming'whereage=12";PreparedStatementps=con.prepareStatement(sql);ps.executeUpdate();ps.close();}
在tes单元测试中编写updateTest()函数调用sqlmanage类的update()方法,将student表中所有age为12的记录的name设为xiaoming。
@TestpublicvoidupdateTest()throwsSQLException,ClassNotFoundException{sqlmanagesqlmanage=newsqlmanage();sqlmanage.update();}
刷新Navicat 你会创造数据被成功更新了:
删除数据
JDBC删除也是常用的一种操作,但删除的操作一定要谨慎,严防误删、多删等操作。删除的语句一样平常都有where条件,否则会删除所有记录。删除的sql语句为:
deletefrom表名[where条件];
我们编写一个按照id删除记录的函数,在sqlmanage中编写deletebyid(int id),该函数意为根据id删除student表中对应id的一条记录:
publicvoiddeletebyid(intid)throwsSQLException{Stringsql="deletefromstudentwhereid=?";PreparedStatementps=con.prepareStatement(sql);ps.setInt(1,id);ps.executeUpdate();ps.close();}
这么一个根据id删除的函数就写好了,我们在test单元测试中编写deleteTest()测试函数删除student表中id为1的那条记录。:
@TestpublicvoiddeleteTest()throwsSQLException,ClassNotFoundException{sqlmanagesqlmanage=newsqlmanage();sqlmanage.deletebyid(1);}
实行完成查看数据库创造id为1的记录(name为bigsai的记录)被成功删除:
总结与拓展总结
好了,本次JDBC+MySQL的增编削查的案例就到这里了。回顾本课程你是不是以为统统彷佛没那么难,只须要按部就班就可以完玉成部案例。我们回顾一下全体流程:
创建数据库和表创建项目添加JDBC和Junit单元测试依赖编写项目代码(JDBC 6个步骤)单元测试每个流程代表一个知识点,个中最主要的便是要闇练节制JDBC编程的流程了,节制其方法,如果有所遗忘还得多多回顾。
拓展MySQL本案例只利用了四种基本操为难刁难应的sql语句:insert(插入),select(查询),update(修正),delete(删除)。如果须要深入学习MySQL的话很多方面须要深入挖掘,从sql语句上你还须要去学习MySQL繁芜查询例如关联查询、分组、排序等。从性能上要关注MySQL索引类型以及理解其底层数据构造与上风。从安全性和数据同等性你要去理解学习MySQL脏读、幻读等以及各种锁的利用……
而JDBC算是在Java中一种很原生处理MySQL的办法了,而到后面随着学习的深入你会打仗两个ORM框架—Mybatis和Hibernate,当然在海内Mybatis要更盛行一些。这两个框架是对JDBC的封装,让开发者能够更随意马虎的在运用中利用MySQL等关系数据库,在Web项目有着广泛的运用,无论因此前的SSH(Spring,Strus2,Hibernate)和现在盛行的SSM(Spring,SpringMVC,Mybatis),其作为持久层的框架都是基于对JDBC的封装处理。以是日后在学习新框架同时要记得回顾JDBC的内容,多节制JDBC底层事理!
好啦,下课!
咱们后会有期!
末了,本文收录在公众号:bigsai ,头条号:码农bigsai 中更多精彩与资料与您分享,欢迎mark与您一起发展!同时也收录在博学谷以关卡的新形式展现,欢迎考试测验!
如果有用,欢迎关注、点赞、转发一键三联,将知识分享是我不断努力的源源动力!