hello我是bigsai,今天我们进行JDBC+MySQL实战,很是适合初入门的小伙伴打开新的世界。实现一个增删改查(curd)的例子。先点赞再观看、帅哥靓女养成好习惯!html
在这个案例进行以前,你要确保本身电脑上拥有MySQL和IDEA编译器,另外还要安装MySQL数据库链接管理工具Navicat。方能进行如下的操做。java
若是之前没见过或者使用过也没关系,本课程提供傻瓜式教学你只需跟着个人要求来包成功包会。mysql
经过本翩你能够掌握如下内容:web
本次案例究竟是个什么结果呢?本案例实现一个学生信息的管理,即学生我的信息的增删改查。sql
咱们该如何设计这个项目呢?数据库
别急别急,听我慢慢说道。对于本案例的实战,旨在实现用Java语言(JDBC)操做MySQL,核心的主轴是MySQL的数据,因此咱们从MySQL为起始点入手,整个案例实现的流程大体能够分为:编程
而对于JDBC编程来讲,它须要与MySQL进行链接交互,它也有必定流程顺序须要遵照,一般为如下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:
我想如今你对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表示学生身高,咱们用这几个字段表示一个学生信息状况。
固然,若是你不喜欢使用数据库管理工具进行这样操做,更喜欢控制台或者命令行建立数据库以及表格,固然也是能够的:
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for students -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, `high` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=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>
而后项目就成功建立啦,紧接着建立如下类:
有了JDBC的环境只需编写正确的代码便可运行!对于项目最终的目录是这样的:
咱们上面有讲过进行JDBC操做的6个步骤,但有些步骤不须要重复进行,好比加载驱动、创建链接、关闭等能够复用。此外,咱们在项目中将MySQL中的数据和Java中的对象进行映射(即MySQL表中每一条记录能够生成一个Java对象),项目中函数的设计基于Java对象而非MySQL中数据字段,下降项目中各模块的耦合性。
首先在student 类中编写如下内容,该类与MySQL数据库的student表对应。
public class student { private int id;//与student表得id对应 private String name;//与student表得name对应 private int age;//年龄与student表得age对应 private int high;//身高与student表high对应 //带id构造方法(查询时使用) public student(int id, String name, int age, int high) { this.id = id; this.name = name; this.age = age; this.high = high; } //不带id得构造方法(插入时候使用) public student(String name, int age, int high) { this.name = name; this.age = age; this.high = high; } //toString()方法,控制台打印测试使用 @Override public String toString() { return "student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", high=" + high + "}\n"; } //get set 方法,设置值,取值使用 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getHigh() { return high; } public void setHigh(int high) { this.high = high; } }
紧接着处理sqlmanage类,咱们将JDBC的一些操做封装到这里面。在初始化函数中进行注册驱动、创建链接的操做。在sqlmanage中编写如下内容:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class sqlmanage { private Connection con=null;//数据库链接,从DriverManager的方法得到,用以产生执行sql的PreparedStatement public sqlmanage() throws SQLException, 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("数据库链接成功"); } public void close() throws SQLException { this.con.close();; } }
其中经过Connection创建链接,Connection是一个接口类。其功能是与数据库进行链接(会话)。创建Connection接口类对象:
Connection conn =DriverManager.getConnection(url, user, password)
;
其中url的格式要求为:
jdbc:mysql://<host>:<port>/<database_name>?property1=value1&property2=value2…
其中user为MySQL登陆用户名,password为MySQL登陆密码。
MySQL插入的sql语句很简单:
insert into 表名 ( 字段1, 字段2,...字段n) value ( 值1, 值2,...值n );
咱们JDBC中进行插入操做使用的sql知足上述规范,在sqlmanage中编写insertStudent(student student)函数用来插入单个学生记录,具体函数以下:
public void insertStudent(student student) throws SQLException { //建立sql语句 String sql="insert into student(name,age,high)value(?,?,?)"; //PreparedStatement可以对SQL语句进行预编译,这样防止了 SQL注入 提升了安全性。 PreparedStatement ps = 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()函数,用来测试插入三条学生的记录:
@Test public void insertTest() throws SQLException, ClassNotFoundException { sqlmanage sqlmanage=new sqlmanage(); sqlmanage.insertStudent(new student("bigsai",22,180)); sqlmanage.insertStudent(new student("bigpian",21,165)); sqlmanage.insertStudent(new student("doudou",20,160)); }
执行完毕刷新navicat中student表你会发现数据被成功插入了:
若是同时有100组数据或者更多若干组数据让你插入你会怎么操做?
循环一个一个的插入
批处理一次插入多个
批量处理相比循环的单个单个处理起来省了不少时间,提升了系统效率。因此当遇到较多数据时能够选择多个插入。
批量插入实现也很容易,在sqlmanage中编写insertStudents(student students[])函数用来批量插入学生记录:
public void insertStudents(student students[]) throws SQLException { this.con.setAutoCommit(false);//不自动提交 String sql="insert into student(name,age,high)value(?,?,?)"; PreparedStatement ps =con.prepareStatement(sql); for(int i=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(); }
其中:
接着在test单元测试中编写insertStudentsTest()函数进行测试批量插入:
@Test public void insertStudentsTest() throws SQLException, ClassNotFoundException { sqlmanage sqlmanage=new sqlmanage(); student students[]=new student[5]; for(int i=0;i<students.length;i++) { students[i]=new student("路人"+i,12,156); } sqlmanage.insertStudents(students); }
执行完毕后你能够看到数据被成功插入MySQL中:
查询的使用频率要远比其余的操做多,虽然有些复杂表的查询可能会让人比较头疼,但基础的sql查询仍是比较简单,其语法格式为:
select 字段1,字段2,…… from 表名 [where 条件] //方式1 select * from 表名 [where 条件] //方式2
其中若是没有where条件那么就默认查询整张表的内容,咱们在这里根据此条件查询全部记录:查询返回年龄小于21岁的全部学生。
首先在sqlmanage中编写getallstudent()函数,用来查询student表中全部age小于21的记录,并把查询的数据最终以List<studnet>
类型返回:
public List<student> getallstudent() throws SQLException { List<student>list=new ArrayList<student>();//返回的结果 String sql = "select * from student where age < 21"; PreparedStatement ps = con.prepareStatement(sql); ResultSet resultSet=ps.executeQuery();//结果集 while(resultSet.next())//遍历 { int id=resultSet.getInt(1); String name=resultSet.getString(2); int age=resultSet.getInt(3); int high=resultSet.getInt(4); list.add(new student(id,name,age,high)); } ps.close(); return list; }
在前面讲的插入的过程返回值其实不须要特别处理,由于返回是插入成功与否的消息,而在查询的步骤就要严格的跟着JDBC的6个步骤来—由于须要对返回的数据进行处理。咱们主要经过ResultSet处理返回的数据。
在对ResultSet进行迭代遍历取值的过程当中,经过getXXX(int index)的方法取值并自动转换为java对应的数据类型。而index为MySQL数据库表格列的编号,也是数据在ResultSet中的对应序列号。
经过上面的函数在test单元测试中编写selectTest() 测试函数在控制台打印从数据库中查询全部age小于21的记录:
@Test public void selectTest() throws SQLException, ClassNotFoundException { sqlmanage sqlmanage=new sqlmanage(); List<student>list=sqlmanage.getallstudent(); System.out.println(list.toString()); }
能够看到数据被成功查询:
对某个肯定的记录修改,咱们通常根据这条信息的主键做为条件进行修改。而修改通常都须要条件语句where,不然修改整个表的内容。修改的MySQL语句为:
update 表名 set 字段 = 值 [where条件]; -- 建议都有where: 否则的话会修改每一条数据
这里咱们假设将上述student表中全部age为12的记录的name设置为xiaoming。在sqlmanage中编写update()函数用来进行修改:
public void update() throws SQLException { String sql = "update student set name='xiaoming' where age=12"; PreparedStatement ps = con.prepareStatement(sql); ps.executeUpdate(); ps.close(); }
在tes单元测试中编写updateTest()函数调用sqlmanage类的update()方法,将student表中全部age为12的记录的name设为xiaoming。
@Test public void updateTest() throws SQLException, ClassNotFoundException { sqlmanage sqlmanage=new sqlmanage(); sqlmanage.update(); }
刷新Navicat 你会发现数据被成功更新了:
JDBC删除也是经常使用的一种操做,但删除的操做必定要谨慎,谨防误删、多删等操做。删除的语句通常都有where条件,不然会删除全部记录。删除的sql语句为:
delete from 表名 [where条件];
咱们编写一个按照id删除记录的函数,在sqlmanage中编写deletebyid(int id),该函数意为根据id删除student表中对应id的一条记录:
public void deletebyid(int id) throws SQLException { String sql = "delete from student where id = ?"; PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1,id); ps.executeUpdate(); ps.close(); }
这么一个根据id删除的函数就写好了,咱们在test单元测试中编写deleteTest()测试函数删除student表中id为1的那条记录。:
@Test public void deleteTest() throws SQLException, ClassNotFoundException { sqlmanage sqlmanage=new sqlmanage(); sqlmanage.deletebyid(1); }
执行完成查看数据库发现id为1的记录(name为bigsai的记录)被成功删除:
好了,本次JDBC+MySQL的增删改查的案例就到这里了。回顾本课程你是否是以为一切好像没那么难,只须要循序渐进就能够完成整个案例。咱们回顾一下整个流程:
每一个流程表明一个知识点,其中最重要的就是要熟练掌握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
中,更多精彩与资料与您分享,欢迎mark与您一块儿成长!同时也收录在博学谷以关卡的新形式展示,欢迎尝试!