JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
任何项目都离不开数据库的使用,下面我整理了jdbc实现数据库的增删改查代码。之后还会介绍使用Mybatis框架的方法。
首先建立一个练习用的数据库命名为mytest,建一张表命名为student,用它来存储学生信息,这里我偷懒使用数据库可视化软件Navicat,表的结构如下:
材料准备:
Jdbc需要一个外部jar:
这个包可以去网上找寻并下载,然后我在我的IDE:MyEclipse中见一个Java项目,名为JdbcDemo
在该项目内建立jdbc连接的Java文件(class),命名Jdbc.java在这个类中我们需要写建立数据库连接的方法:
public static Connection getConnection()
{
String driver ="com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user ="root";
String password ="root";
Connection connection =null;
try
{
Class.forName(driver);
connection =(Connection) DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
}
return connection;
}
driver是数据库的驱动,连接不同数据库要使用不同的驱动,因为我们用的是mysql所以就要用mysql的驱动
url是需要访问的数据库的地址,格式如代码,几个比较重要的自定义是:(1)端口号,ip+端口,我这里是本地的默认mysql端口 .(2)数据库名,在前面的端口下的数据库下,你要用哪个数据库就把数据库名写在端口后的 / 后面
user和password是jdbc要连接数据库时需要的用户名和密码,即平时进入mysql或者用Navicat建连接时用的用户名和密码,我这里超级用户名为root,为了方便所以密码当时也设置的是root。
Connection即我们要建立的连接,因为会由于各种原因导致连接失败,所以把连接写在一个异常里,让异常抛出,而不是停止程序并报错。连接的获取方法如try关键字后的代码所示。
在这个方法的时候需要导入以下专用的包:
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
数据是服务程序的,我们通常需要与数据库表结构相同的实体类来方便在后端程序里存储数据来方便增删改查的操作,所以以student表为例建立一个名为student的实体类(student.java),如下所示:
public class Student {
private int id;
private String name;
Student(String name,int id)
{
this.id=id;
this.name=name;
}
public Student() {}
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;
}
}
如果表很多,每个实体类的私有属性都很多,那么建立实体类就是个体力活,所以说一个简单快捷的方法:现在实体类按表的要求定义好实体类属性,然后在空白处,然后按下图单击:
然后勾选所有属性(select all)点击OK
这样就生成了所有需要的set和 get方法
那么现在准备工作都完成了,下面进入最重要的增删改查方法的编写
将所有增删改查的操作写成返回值为String的方法,其目的是降低耦合并可以在调用后的第一时间得知操作是否成功。
和数据库的连接同理,对数据库的增删改查操作由于格式等原因会有一定几率操作失败,所以我们也将操作写在try语句中,这样会防止后端程序中断,在已知有可能报错的地方使用异常处理是十分重要的。
在使用Jdbc进行增删改查之前我们要获取数据库连接,getConnection方法是我们最开始就已经写好的静态方法,这里直接调用就可以。
PreparedStatement预编译。先把sql语句先进行预编译,然后再执行,sql语句中的“ ?”按顺序对应下面的Set方法。
增:
public String add(int id,String name)
{
try
{
if(id==0||name==null)
{
return "学号或姓名为空!";
}
else
{
Connection con = getConnection();
PreparedStatement preparedStatement = null;
String sql= "insert into student (id,name) values(?,?)";
preparedStatement=(PreparedStatement) con.prepareStatement(sql);
preparedStatement.setInt(1, id);
preparedStatement.setString(2, name);
preparedStatement.executeUpdate();
return "添加成功";
}
} catch (Exception e) {
return "添加失败";
}
}
删:
public String delete(int id)
{
try{
Connection con = getConnection();
PreparedStatement preparedStatement = null;
String sql= "delete from student where id=?";
preparedStatement=(PreparedStatement) con.prepareStatement(sql);
preparedStatement.setInt(1, id);
preparedStatement.executeUpdate();
return "删除成功";
}
catch (Exception e) {
return "删除失败";
}
}
改
public String update(int id,String name) {
try {
if(id==0||name==null)
{
return "学号或姓名为空!";
}else{
Connection con = getConnection();
PreparedStatement preparedStatement = null;
String sql= "update student set name=? where id=?";
preparedStatement=(PreparedStatement) con.prepareStatement(sql);
preparedStatement.setInt(2, id);
preparedStatement.setString(1, name);
preparedStatement.executeUpdate();
return "修改成功";
}
} catch (Exception e) {
return "修改失败";
}
}
查
查询操作是最复杂并且最频繁使用的操作,我们不但要熟练使用sql查询语句,还要在Java程序中接收好查询结果,此时实体类就派上用场,数据库中的表和表中一条条数据的关系和Java中类和对象的关系是极为相似的,我们建一个和表结构相同的类,查询到的数据便可以放在一个个对象当中,这样一来无论是对数据对象单一操作或者使用list等结构对其批量操作都是十分方便的。
public Student find(int id){
int stuid = 0;
String name=null;
String sql = "select * from student where id = ?";
Connection con =getConnection();
PreparedStatement pstmt =null;
ResultSet rs = null;
try {
pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
while(rs.next()){
stuid=rs.getInt(1);
name=rs.getString(2);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(con!=null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Student stu=new Student(name,stuid);
return stu;
}
增删改查的代码在上面做了简单的介绍,下面让我们调用验证一下:
增:
public class Test
{
public static void main(String args[])
{
Jdbc jdbc=new Jdbc();
System.out.println(jdbc.add(201801,"李泽辰"));
System.out.println(jdbc.add(201802,"林宥嘉"));
System.out.println(jdbc.add(201803,"周星驰"));
System.out.println(jdbc.add(201804,"刘德华"));
System.out.println(jdbc.add(201805,"郭富城"));
}
}
删:
public class Test
{
public static void main(String args[])
{
Jdbc jdbc=new Jdbc();
System.out.println(jdbc.delete(201803));
System.out.println(jdbc.delete(201805));
}
}
改:
public class Test
{
public static void main(String args[])
{
Jdbc jdbc=new Jdbc();
System.out.println(jdbc.update(201804,"张学友"));
}
}
查:
public class Test
{
public static void main(String args[])
{
Jdbc jdbc=new Jdbc();
Student stu[]=new Student[3];
stu[0]=jdbc.find(201801);
stu[1]=jdbc.find(201802);
stu[2]=jdbc.find(201804);
for(int i=0;i<stu.length;i++)
{
System.out.println(stu[i].getId()+" "+stu[i].getName());
}
}
}
若有不足望指正
预告:Mybatis