二十一、JavaJDBC基础

1.JDBC是什么?

JDBC(java database connectivity)Java数据库链接。是Java语言中来贵方客户单程序如何访问数据的【关系型数据库】的应用程序接口,提供了查询更新数据库的方法。

图解:

2.JDBC访问数据库的需要用到类、接口、方法

1)java.sql包DriverManger类:

负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回响应的数据库链接。确定程序会将自身加载到DriverManager中去。

        (1)数据驱动程序(Driver)

 根据所连接的数据库不同需要下载不同对应的数据库驱动程序。

例如:mysql数据库:MySQL :: Download MySQL Connector/J (Archived Versions)

mysql-connector-java-5.1.38-bin.jar

通过java的反射机制,来给DriverManager,提供被加载的数据库驱动名称。

Class.forName(“数据库驱动名称【包名+类名】”);

数据库驱动名称来自mysql-connector-java-5.1.38-bin.jar中Driver的java类的全名称。

Class.forName(com.mysql.jdbc.Deiver);

        (2)向调用者返回相应的数据库连接

DriverManager类中的静态方法getConnection(url,username,password)向调用者返回相应的数据库连接

static  Connection   getConnection(url,username,password)

参数url : 指定被连接的数据库位置

【jdbc:mysql://数据库服务器IP:端口/数据库名称】

参数username : 登陆数据库服务器的用户名

参数password : 登陆数据库服务器的密码

2)java.sql包Connection接口

数据库链接,负责与数据库间通讯,SQL执行以及事务处理都是在某个滕丁Connection环境中进行的。可以负责产生用以执行SQL的Statement。

(1)产生用以执行SQL的Statement。

             用以执行SQL查询和更新(针对静态SQL语句和单次执行)

             Statement createStatement()

             selection * from t_user where uid = 12;[拼接字符串]

(2)产生可以执行SQL的PreparedStatement。

用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)

                PreparedStatement preparetment(sql);

                参数sql :包含动态参数的SQL语句

                select * from t_user where uid =?;(需要给sql动态传递参数值)

                ?:为占位符

(3)Java.sql包Statement接口

用以执行SQL查询和更新(针对静态SQL语句和单次执行)

int executeUpdate(sql)

参数sql:执行更新SQL【insert/delete/update】

RreusltSet executeQuery(sql)

参数sql:用于执行查询的SQL

(4)java.sql包PreparedStatement接口

用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行提高效率)。

以执行SQL更新【insert/update/delete】

int executeUpdate()

执行SQL查询【select】

RreusltSet executeQuery()

注意 : PreparedStatement需要执行的sql语句

  1. sql语句是在创建PreparedStatement对象的时候传入执行,不是在调用executeUpdate()/executeQuery()的时候传入。
  2. PreparedStatement对象所执行的sql语句中有“?【占位符】”

           有一组填补sql语句占位符的方法

           setInt(参数1,参数2)  int : int

           setLong(参数1,参数2)  long : bigint

           setDouble(参数1,参数2) double : double

           setString(参数1,参数2)  String : varchar/char

           .....................

           参数1 : SQL语句中“?”的位置【从1开始】

           参数2 : SQL语句中“?”具体数据值

(5)java.sql包ResultSet接口

数据库结果集的数据表,通常通过执行查询数据库的语句生成。

ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。

默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。

图解:

boolean  next()

将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false。在 while 循环中使用它来迭代结果集。

 由于通过next方法将指针移动到下一行,我们现在就可以取出指针指向的当前行的数据值。要获取当前行中保存的数据值,就需要一列一列的取出数据值,所以ResultSet会有一组获取指定列数据的方法。

getXXXX(int colindex)

int colindex[当前需要获取数据值的列在当前行中的位置【从0开始】]

getXXXX(String colname)

String colname[当前需要获取数据值的列名称]

1 [int]--[id]

Zhangsan  [varchar]--[name]

23 [int]--[age]

2[int]--[id]

Lisi  [varchar]--[name]

24  [int]--[age]

3[int]--[id]

Wangwu  [varchar]--[name]

25  [int]--[age]

通过ResultSet对象得到第一行数据值

int  id=ResultSet对象.getInt(0);

int  id=ResultSet对象.getInt(“id”);

//id==1

String name=ResultSet对象.getString(1);

String name=ResultSet对象.getString(“name”);

//name==zhangsan

int  age=ResultSet对象.getInt(2);

int  age=ResultSet对象.getInt(“age”);

//age==23

3.JDBC访问数据库的流程

 例子:

SQL语句:

创建t_user表

create table t_user(
    stu_id int primary key auto_increment,
    stu_name varchar(10),
    stu_sex bit,
    stu_age int,
    stu_city varchar(20)

)

Java代码:

        1.创建ContentSQL类得到Conection对象

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ContentSQL {
	private final static String JDBCNAME = "com.mysql.jdbc.Driver"; //数据库驱动名称
	private final static String MYSQLHOST = "jdbc:mysql://127.0.0.1:3306/teststudent";
	private final static String SQLNAME = "root";
	private final static String SQLPASS = "root";
	static {
		try {
			Class.forName(JDBCNAME);//通过反射机制加载数据库驱动
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	public static Connection getContnet(){
		Connection connection = null;
		try {
		 connection = DriverManager.getConnection(MYSQLHOST, SQLNAME, SQLPASS);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}
}

2.通过Connection对象执行sql语句

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class DBControl {
	//添加数据 到 数据库
	public boolean add(UserInfo stu){
		boolean flag = false;
		Connection connection =  ContentSQL.getContnet();
		try {
		Statement statement = connection.createStatement();
		String sql = "insert into t_user values(null,'"
		+stu.getStuname()+ "',"
		+stu.isIsnv()+ ","+ 
		stu.getAge() + ",'" + 
		stu.getStucity()+"')";
		
		int  i = statement.executeUpdate(sql);
			if (i > 0) {
				flag =true;
			}
			
			statement.close();
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return flag;
	}
	//修改数据库中的数据
	public boolean updata(UserInfo stu){
		boolean flag = false;
		Connection connection = ContentSQL.getContnet();
		try {
			Statement  statement = connection.createStatement();
			String sql = "update t_user set stu_name='" + stu.getStuname() +"',stu_sex=" + 
					stu.isIsnv() + ",stu_age="+stu.getAge() + 
					",stu_city='" +stu.getStucity() + 
					"' where stu_id=" + stu.getStuid(); 
			int i = statement.executeUpdate(sql);
			if (i>0) {
				flag = true;
			}
			statement.close();
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return flag;
	}
	//删除数据库中的数据
	public boolean detele(int stuId){
		boolean flag = false;
		Connection connection = ContentSQL.getContnet();
		try {
			Statement statement = connection.createStatement();
			String sql = "delete from t_user where stu_id=" + stuId;
			int i = statement.executeUpdate(sql);
			if (i > 0) {
				flag = true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return flag;
	}
	//拿到数据库的信息(查询数据库)
	public ArrayList<UserInfo> seleteAll(){
		ArrayList<UserInfo> infos = null;
		Connection connection = ContentSQL.getContnet();
		try {
			Statement statement = connection.createStatement();
			String sql = "select * from t_user";
			ResultSet resultSet =  statement.executeQuery(sql);
			infos = new ArrayList<UserInfo>();
			while (resultSet.next()) {
				int stuId = resultSet.getInt("stu_id");
				String stuName = resultSet.getString("stu_name");
				boolean stuSex = resultSet.getBoolean("stu_sex");
				int stuAge = resultSet.getInt("stu_age");
				String city = resultSet.getString("stu_city");
				UserInfo stuinfo = new UserInfo(stuId, stuName, stuSex, stuAge, city);
				infos.add(stuinfo);
			}
			statement.close();
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return infos;
	}
	
	//查询一个学生的学生信息
	public UserInfo selectOne(int id){
		UserInfo info = null;
		Connection connection = ContentSQL.getContnet();
		
		try {
			Statement statement = connection.createStatement();
			String sql = "select * from t_user where stu_id=" + id;
			ResultSet resultSet = statement.executeQuery(sql);
			resultSet.next();
			int stuId = resultSet.getInt("stu_id");
			String stuName = resultSet.getString("stu_name");
			boolean stuSex = resultSet.getBoolean("stu_sex");
			int stuAge = resultSet.getInt("stu_age");
			String city = resultSet.getString("stu_city");
			info = new UserInfo(stuId, stuName, stuSex, stuAge, city);
			statement.close();
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return info;
	}
}

数据库中表对应的实例类

(一个表对应一个实例类)

public class UserInfo {
	private int stuid;
	private String stuname;
	private boolean isnv;
	private int age;
	private String stucity;
	public UserInfo(int stuid, String stuname,boolean isnv,int age,String stucity){
		this.stuid = stuid;
		this.stuname = stuname;
		this.isnv = isnv;
		this.age = age;
		this.stucity = stucity;
	}
	public int getStuid() {
		return stuid;
	}
	public void setStuid(int stuid) {
		this.stuid = stuid;
	}
	public String getStuname() {
		return stuname;
	}
	public void setStuname(String stuname) {
		this.stuname = stuname;
	}
	public boolean isIsnv() {
		return isnv;
	}
	public void setIsnv(boolean isnv) {
		this.isnv = isnv;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getStucity() {
		return stucity;
	}
	public void setStucity(String stucity) {
		this.stucity = stucity;
	}
	@Override
	public String toString() {
		return "stu_id = " + stuid  + "\t" + "stu_name =" + stuname +"\t" + "stu_sex=" + (isnv ? "男" : "女")+ "\t" + "stu_age=" + age + "\t" + "stu_city = " + stucity; 
	}
}

测试主类 

import java.util.ArrayList;

public class TestMain {

	public static void main(String[] args) {
		
		
		
		//添加一个人
//		DBControl control  = new DBControl();
//		Useslist one = new Useslist(1003, "zhaoliu", true, 28, "北京");
//		boolean flag = control.add(one);
//		if (flag) {
//			System.out.println("添加成功~~~");
//		}
//		修改一个人
//		DBControl control  = new DBControl();
//		Useslist two = new Useslist(1003, "libai", true, 100, "古代");
//		boolean flag1 = control.updata(two);
//		if (flag1) {
//			System.out.println("修改成功~~~");
//		}
		
//		删除t_user一个人信息
//		DBControl control = new DBControl();
//		//需要删除的id
//		int id = 1002;
//		boolean flag = control.detele(id);
//		if (flag) {
//			System.out.println("删除成功~~");
//		}
		
//		查询所有学生的学生信息
//		DBControl  control = new DBControl();
//		ArrayList<UserInfo> infos = control.seleteAll();
//		for (UserInfo useslist : infos) {
//			System.out.println(useslist);
//		}
//		查询一个人得信息
		DBControl  control = new DBControl();
		UserInfo info = control.selectOne(1001);
		if (info == null) {
			System.out.println("没有要查询的信息");
		}
		System.out.println(info);
	}

}

无奈源于不够强大

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值