JDBC
一、前言
在日常生活中一般使用代码来操作数据库,MySQL会给主流的语言提供各种API(现成的函数/类),MySQL是由C/C++实现的,其他语言要操作数据库就要间接访问,数据库服务器是本体,通过代码写的程序,调用MySQL的API实现的是一个客户端,相当于服务器提供的客户端。即就要按照MySQL服务器的要求,构造出响应的网络请求就行了。
通过代码访问MySQL就是实现一个MySQL客户端(只要能按照人家MySQL的约定的网络请求格式来构造请求)
二、通过JAVA操作MySQL (JDBC)
1.先得到MySQL的API
在这些地方都能得到:
1.官方网站
2.Maven Repository
3.github主页
步骤:
1.在Maven Repository中找到MySQL的包,下载.jar包
2.把.jar包导入项目中
导入进去,记得点击确定,右键目录找到 Add as Library ,检查自己的包是否导入
点击File 之后找到 Project Structure 再点Libraries
这样就是导入成功了
2.具体流程
1.先和数据库建立连接
(1)先创建一个数据源
DataSource dataSource=new MysqlDataSource();
(2)给数据源设置属性,数据源就是告诉代码数据库服务器在哪里。
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/homework?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
端口号后面的是要连接的数据库的名字
(3)通过getConnection()方法来建立连接, 选择Connection 时一定要选 java.sql后缀的
Connection connection=dataSource.getConnection();
2.拼装SQL语句
1.先写一条SQL语句
String sql="insert into purchase values (1,2,3,5)";
2.实际上我们需要的是一个“语句对象” ,需要使用 PreparedStatement来构造
PreparedStatement statement=connection.prepareStatement(sql);
3.执行SQL语句
根据所执行的SQL语句不同,选择不同的语句执行
如果所执行的语句是insert, delete,update
语句使用executeUpdate()
如果当前语句是select
使用executeQuery()
分类依据就是是否更新,增删改都是更新过的,有更新就选Update
查询没有更新,查询语句就选Query,查询语句不仅仅返回结果正确与否,还要返回查询出的结果。
这是根据插入语句写的,插入,删除,修改语句返回结果1,即成功,返回结果0就是失败了
int ret=statement.executeUpdate();
System.out.println("ret="+ret);
而如果语句是查询语句Select和其他三种都是不同的,需要获取到当前纪录
ResultSet resultSet=statement.executeQuery();
while(resultSet.next()){
//获取到当前纪录,(当前行的每一列)
int order_id=resultSet.getInt("order_id");
int customer_id=resultSet.getInt("customer_id");
int goods_id=resultSet.getInt("goods_id");
int nums=resultSet.getInt("nums");
System.out.println(order_id+", "+customer_id+", "+goods_id+", "+nums);
}
并且返回的结果中带有数据库的信息。
4.释放申请的资源
statement.close();
connection.close();
resultSet.close();
释放顺序和执行顺序相反
这种和数据库建立连接的方式就是一次只能插入一条数据,是和数据库连接,将数据写死了
我们应该动态建立和数据库的连接就将sql语句中需要插入的部分,写成?占位符,使用statement.set(类型)来给?赋值
总结
服务器可能会收到很多的请求.针对每一个请求,都可以创建Connection,PreparedStatement,ResultSet 对象,但是这些请求之间彼此共用一个 DataSource
如果当前服务器收到的请求很多,那么也一定有很多Connection,PreparedStatement,ResultSet 对象,但是建立Connection对象的开销,远远比其他两个大,因为是要建立连接,所有我们使用.getConnection()方法时并不是每次调用时都创建新的连接对象,就是在数据库连接池中寻找,如果找到了,就不用建立新的连接
可以写一个懒汉式单例来减少创建对象
public class DBUtil {
//通过这个类,保证DataSourse 是一个唯一的实例
//其中static 是表明当前是类成员
private static DataSource dataSource=null;
public static DataSource getDataSource(){
if(dataSource==null){
dataSource=new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/homework?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123456");
}
return dataSource;
}
}