JDBC相关介绍。(实习内容)
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
JDBC API主要位于JDK中的java.sql包中。
DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
CallableStatement:用以调用数据库中的存储过程。
SQLException:代表在数据库连接的建立和关闭和SQL语句的执行过程中发生了例外情况(即错误)。
步骤:
1.导入相关包
访问MySQL数据库需要用到第三方的类,这些第三方的类,都被压缩在一个.Jar的文件里。
步骤:project右键->build path->configure build path->Libraries->add External JARs
(注意:= =不要以为导包完就可以删掉电脑上保存的包了,这文件还是得留着……不然下次打开myeclipse你会发现惊喜哦)
2.创建元素URL USERNAME PASSWORD DRIVER 驱动
//这里是封装连接数据库,所以一律设置为private
/*这个URL根据数据库所在位置不同而不同,test是数据库的名字,3306是端口号*/
private static final String URL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";//数据库编码要和Java project编码匹配
/*这里是账号和密码*/
private static final String USERNAME="root";
private static final String PASSWORD="**";
private static final String DRIVER="com.mysql.jdbc.Driver";
3.加载驱动
连接数据库首先需要一个接口Connection。
Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
//连接数据库需要的接口,没导包的话就不能用
private static Connection conn;
static{
//加载驱动
try {
Class.forName(DRIVER);
//获取连接权限
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (Exception e) {//Exception是所有异常的父类
//try中有可能会出现异常,catch用来捕捉,捕捉的类型就是Exception。
e.printStackTrace();
}
}
public static Connection getConnetion(){
//获得连接数据库的权限
return conn;
}
最后提供了一个getConnection方法。
接下来小测试一下:
package com.test;
import java.sql.Connection;
import java.sql.*;
//这个是加载驱动所在的那个类包
import com.classone.DBUtil;
public class Test1 {
public static void main(String[] args) throws Exception{
//获取数据库连接权限
Connection conn = DBUtil.getConnetion();
//打印出来的是数据库的地址
System.out.println(conn);
//预编译
String sql = "select * from users";
PreparedStatement ps = conn.prepareStatement(sql);
//查询数据库时,返回的是一个二维的结果集,我们需要用到ResultSet来遍历结果集,获取每一行的数据。
ResultSet rs = ps.executeQuery();//查询
//遍历
while(rs.next()){
System.out.println("用户名:"+rs.getString("username")+"年龄:"+rs.getInt("age"));
}
}
}
//run:
com.mysql.jdbc.JDBC4Connection@4*bfe*1d
用户名:an年龄:19
用户名:ya年龄:20
现在我们想把每一条数据都存放在一个List集合里,但是集合里不能又放Int类型的又放字符型的数据,所以我们需要创建一个User类,把一条数据存在一个User里,然后把这么多个User再存到List集合中就可以啦!
1.先创建一个User类
package com.pojo;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
//快捷键:alt+shift+s
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", age=" + age + "]";
}
}
2.定义一个接口
那么接口的好处是什么呢~就是你提供给别人一个接口,他可以拿去用,但不会看到你这个接口是怎么实现的~
(=。=或许代码写的乱七八糟的也不会被人发现哟
package com.bao;
import java.util.List;
import com.pojo.User;
public interface UserInterface {
//这个方法是查询所有数据
//返回的是很多个user类的list集合
//list中不能放又有字符又有整型的数据,所以把数据放在User类里,然后再把这些类放在list集合里。
public List<User> selectUserAll();
}
3.实现这个接口
那么提供了一个接口,必然要实现它呀。
package com.Impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
//这些是同一个project下不同的包,一个是专门放接口的,一个是加载驱动的,一个是写有User类的包
import com.bao.UserInterface;
import com.classone.DBUtil;
import com.pojo.User;
public class UserImpl implements UserInterface{
//首先定义一个User类的集合
public List<User> list = new ArrayList<User>();
public List<User> selectUserAll() {
try{
//获取数据库连接权限
Connection conn = DBUtil.getConnetion();
//System.out.println(conn);
//预编译
String sql = "select * from users";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();//查询
while(rs.next()){
User user = new User();
user.setUsername(rs.getString("username"));
user.setAge(rs.getInt("age"));
list.add(user);
}
/*while(rs.next()){
System.out.println("用户名:"+rs.getString("username")+"年龄:"+rs.getInt("age"));
}*/
}catch(Exception e){
e.printStackTrace();
}
//最后返回的是一个集合
return list;
}
}
4.调用
最后我们来看看结果。
package com.test;
import java.sql.Connection;
import java.sql.*;
import com.classone.DBUtil;
import com.Impl.*;
public class Test1 {
public static void main(String[] args) throws Exception{
//调用接口-多态 指向实现类
UserInterface u = new UserImpl();
System.out.println(u.selectUserAll());
}
}
和刚才运行的结果一样哦~
-end-
【部分参考:https://blog.csdn.net/jungle_rao/article/details/81274720】
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!