文章目录
- 1.JDBC编程基础
- 2.驱动程序下载
- 3.新建项目
- 3.1导入java包
- 3.2转换为库
- 4.开始创作
- 4.1准备数据库
- 4.2创建DataSource
- 4.3和数据库建立连接
- 4.4构造sql,准备发送到服务器
- 4.5发送sql,执行sql
- 4.6释放系统资源
- 4.7自行输入的设置
- 4.8插入数据完整源代码
- 4.9查询数据库里面的表的操作
- 4.10查询操作的源代码
1.JDBC编程基础
JDBC全称就是Java DataBase Connect,也就是通过Java对于这个mysql数据库进行操作;
数据库编程,就是需要数据库的服务器,提供一些API(appliacation programing interface–应用程序接口),供我们程序员进行使用;
但是不同的数据库提供的这个api有差别,因此这个时候我们的java站出来一统江湖,自己设计一套,其他的这个数据库都要和java提供的对接上,不然我们的java就不和他玩了,毕竟当时我们的这个java的分量还是很重要的,因此这个时候我们只需要了解这个java的api,就可以了,不用像之前的那样去了解不同的数据库的api接口,我们只需要了解这个JDBC的这一套就可以了;
2.驱动程序下载
下载地址就是中央仓库,下载步骤如下所示:首先找到第二个:
如果我们的这个mysql服务器是5.x的,就下载这个5.1.49的,如果是mysql8.x这个时候我们的这个8.x的,我们的驱动程序需要和我们的这个mysql的版本相互匹配;
找到和我们的这个mysql对应的驱动程序之后,点击这个jar进行下载,就可以了;
3.新建项目
3.1导入java包
创建一个lib目录,把我们的这个安装的程序ctrl+c,ctr+v拖拽进来,像下面的这个一样,只要一粘贴就进入我们的这个项目里面了;
3.2转换为库
就是我们的这个lib目录右键,选择这个add as library这个选项:
4.开始创作
4.1准备数据库
首先需要在这个src里面创建一个demo1文件,这个就是我们写代码的地方;
然后在这个计算机终端上面以管理员的身份连接数据库,创建一个表,我们后面就是把数据插入到这个创建的表里面去;
4.2创建DataSource
seturl是对于这个数据库服务器的位置进行设置;
setname是设置用户名,setpassword是设置我们的密码(这个需要根据实际情况进行改写,不要照抄!!)
这个里面使用的是向下转型的操作,就是先去创建一个dataSource这个对象,然后再把这个对象向下转型为我们的这个MysqlDataSource这个对象,这个直接创建对应的对象也不是不可以,但是我们进行这个向下转型的好处就是我们的这个写法可以降低mysql和其他的程序的耦合度,什么是耦合度:就是我们的一个程序的变动对于其他的程序的影响和联系,如果一个程序的变动对于另外一个程序的影响很大,这个时候我们就说这个耦合度很高,不是我们软件开发想要实现的效果,我们想要实现的是低耦合,高内聚,低耦合就是程序之间的这个关联性比较小,一个程序需要改动的时候,其他的程序收到的影响比较小,这个是我们想要实现的;
什么是高内聚,就是我们的一个项目里面具有相同的功能的这个代码的这个模块很合适,就是相同的这个功能的接口放到一个程序里面,这样方便我们对于这个项目进行管理,这个就是高内聚(相似,相同功能的模块放到一起,不要太分散,这个就是内聚的解读)
seturl参数解读:
这个里面涉及到我们的IP和端口号相关的知识,我们的这个IP是确定的,就是我们自己的电脑主机,端口号是负责找到我们的这个电脑上面的对应的程序,db01是我自己的这个数据库里面的这个库的名字,同学们需要根据自己的这个实际的命名进行修改;
4.3和数据库建立连接
使用这个dataSource对象,调用我们的这个getConnection这个方法(会报错,需要抛出异常,就是把我们的鼠标放到这个报错上面,然后就会提示一个exception就行了,这个时候上面就会自动包含头文件,然后就不会报错了)
我们需要一个返回值connection,这个类型可以自动识别出来,但是我们需要选择这个java.sql这个类型,不要选择上面的那个jdbc的;
下面的这个就是我们点击这个错误信息里面的exception之后抛出异常的情况后,这个会自动导入文件;
4.4构造sql,准备发送到服务器
因为是第一次使用这个,所以我们在这个sql这个字符串里面写一个简单的sql语句,像这个下面写的就是一个insert的插入的命令,我们这个是直接指定插入的内容,下面我们还可以自己设置输入,进行插入,这样就不至于写死了;
4.5发送sql,执行sql
使用这个executeUpdata这个方法,这个方法的返回值就是我们的这个操作执行之后,这个数据库表里面收到的影响的行数,我们可以把这个返回值打印出来,因为我们的这个地方就是向这个表里面插入一行数据,因此这个影响程度就是一行,n=1输出;
4.6释放系统资源
我们的这个释放的规则就是先创建后释放,后创建的先释放,因此这个我们的statement是后创建的,我们需要优先释放,然后释放掉这个connection;
4.7自行输入的设置
除了上面的插入,我们想要修改之类的,只需要把这个步骤3里面的这个sql语句换一下就可以了,因此这个JDBC其实想要玩好,还是很考验我们的这个sql语句的基本功的,因为其他的内容的变化不是很大,想要进行其他的操作就是在这个sql里面进行相关的改动,上面的是插入数据,下面的这个就是把我们插入的数据从这个学生表里面删除掉;
此外我们还可以自己进行输入:就是使用这个scaner这个对象进行控制,这个时候,我们就可以使用这个scanner.nextInt()输入我们的这个id,使用这个scanner.next输入我们的这个姓名,接受的时候其实这个代码里面体现的是两个写法:
一个就是在这个==String sql ="insert into student values(“id=”+id+“name=”+name)==这个表示我们的输入的内容就作为参数传递到这个里面去,但是这个可能会导致这个sql注入攻击,反正就是这个写法我们不推荐;
另外一个就是使用??的方式,这个表示的是我们的这个占位符(PreparedSDtatement提供的,可进行拼接),但是这个时候我们需要对于这个方法进行调用,表名我们的这个输入传递给哪一个参数,如果是上面的这个,其实输入的id就是传递给的这个里面的第一个参数,但是下面的这个占位符的方式,我们的问号无法显示的表名我们的参数是什么,因此我们需要就加上这个:
statement.setInt(1,id);------输入的参数传递给我们的第一个占位符;
statement.setString(2,name);-----------输入的参数传递给我们的第二个占位符;
除了这两个方法(setInt,setString),其他的操作都是相同的,对于这两个方式而言(一个是在这个参数里面写上这个id,name的名字,一个就是使用两个占位符进行替代);
4.8插入数据完整源代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo1 {
public static void main(String[] args) throws SQLException {
//-------------------1.进行配置------------------------------------
//1.DataSource是这个数据库服务器所在的位置
//2.MysqlDataSource来自于我们导入的这个mysql驱动包
DataSource dataSource = new MysqlDataSource();
//向下转型操作,父类转换为子类----低耦合,减少修改导致的bug
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
//-----------------2.建立连接--------------------------------------
Connection connection = dataSource.getConnection();
//--------------3.构造sql,发给服务器--------------------------------------
String sql="insert into student values(18,'zhangsan')";
PreparedStatement statement = connection.prepareStatement(sql);
//--------------4.发送sql,执行sql,返回值是整数,表示的是影响的行数
int n=statement.executeUpdate();
System.out.println("n="+n);
//--------------5.释放资源---------------------------------------------
statement.close();
connection.close();
}
}
4.9查询数据库里面的表的操作
这个查询操作和上面的略有区别,但是差别不大,主要就是这个调用的方法和遍历的这个过程,其他的都是一样的,这个我们使用这个executeQuery去接受这个结果集,就是我们的查询结果,这个返回值就是一个ResultSet类型的数据;
接下来我们使用这个.next()进行遍历,这个时候我们的这个指针就会不断地从这个表里面的第一行查询到这个最后一行数据,并把这个查询结果通过getInt和getString方法传递到我们的参数里面打印输出;
上面的这个next()方法作为这个循环的条件,这个里面主要就是这个本来的指针指向的是第一行之前,然后判断的时候指向第一行,取出这一行数据里面的这个id和name数据,传递给我们对应的参数,接着每一次next就向下移动一个单位,以此类推,直到完成遍历为止;
这个就是终端的输出结果,和我们在这个mysql里面进行惭怍输出的结果应该是一样的,两个可以互相验证:
4.10查询操作的源代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo2 {
public static void main(String[] args) throws SQLException {
//-------------------1.进行配置------------------------------------
//1.DataSource是这个数据库服务器所在的位置
//2.MysqlDataSource来自于我们导入的这个mysql驱动包
DataSource dataSource = new MysqlDataSource();
//向下转型操作,父类转换为子类----低耦合,减少修改导致的bug
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("808080ZhuZhaoYu#");
//-----------------2.建立连接--------------------------------------
Connection connection = dataSource.getConnection();
//--------------3.构造sql,发给服务器--------------------------------------
String sql="select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//--------------4.发送sql,执行sql,返回值是整数,表示的是影响的行数
//executeQuery这个的返回值是一个临时表(结果的集合)
ResultSet resultSet =statement.executeQuery();
//---------------5.进行遍历----------------------------
//此处需要针对这个表进行遍历,类似于迭代器,但是有差异
while(resultSet.next()){
//id是int类型的,我们调用的就是这个集合的geting方法
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
System.out.println("id="+id+",name="+name);
}
//--------------6.释放资源---------------------------------------------
resultSet.close();
statement.close();
connection.close();
}
}