JDBC学习(一)

一、JDBC是什么?

  JDBC(java database connectivity)Java数据库连接。是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
  我们通常说的JDBC是面向关系型数据库的。

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

2.1 java.sql包DriverManager类--负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接。 驱动程序,会将自身加载到DriverManager中去。

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

  例如:MySQL数据库----数据库驱动程序下载
    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.1.2向调用者返回相应的数据库连接

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

static  Connection   getConnection(url,username,password)

  参数url —> 指定被连接的数据库位置
    【jdbc:mysql://数据库服务器IP:端口/数据库名称】
  参数username —> 登陆数据库服务器的用户名
  参数password —> 登陆数据库服务器的密码

2.2 java.sql包Connection接口 ---> 数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。

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

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

Statement  createStatement()
select   * from  t_user  where uid=12;[需要给sql拼接参数值]

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

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

PreparedStatement  prepartatement(Sql)

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

   select   * from  t_user  where uid=?;【需要给sql动态传递参数值】
   ?表示 ---占位符

2.3 java.sql包Statement接口---用以执行SQL查询和更新(针对静态SQL语句和单次执行)

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

  int executeUpdate(SQL)
    参数SQL---[insert / update /delete]字符串类型的sql语句。

  (2) 以执行SQL查询【select】

 ResultSet    executeQuery(SQL)
  参数SQL---[select]字符串类型的sql语句。

2.4 java.sql包PreparedStatement接口 ---> 用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)
      以执行SQL更新【insert / update /delete】
      int executeUpdate()
      以执行SQL查询【select】
      ResultSet    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语句中“?”具体数据值

2.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]
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访问数据库的流程

在这里插入图片描述

实例1:实现信息的增删改查【Statement】

  1. 创建数据库表
create table t_user(
user_id int primary key auto_increment,
user_name varchar(20),
user_age int,
user_sex bit,
user_address varchar(30),
user_day datetime
);

  1. 创建一个java工程
  2. 导入数据库驱动包
  3. 创建java实体类
package com.wangxing.bean;
import java.util.Date;
/**
 * 保存用户信息的java实体类
 * @author Administrator
 *
 */
public class UserBean {
	private int userid;
	private String username;
	private int userage;
	private boolean usersex;
	private String useraddress;
	private Date  userday;
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getUserage() {
		return userage;
	}
	public void setUserage(int userage) {
		this.userage = userage;
	}
	public boolean isUsersex() {
		return usersex;
	}
	public void setUsersex(boolean usersex) {
		this.usersex = usersex;
	}
	public String getUseraddress() {
		return useraddress;
	}
	public void setUseraddress(String useraddress) {
		this.useraddress = useraddress;
	}
	public Date getUserday() {
		return userday;
	}
	public void setUserday(Date userday) {
		this.userday = userday;
	}
}

  1. 创建连接数据库的java类
package com.wangxing.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 数据库连接类
 * @author Administrator
 *
 */
public class DBConnection {
	//定义数据库驱动名称
	private  static final String DRIVER_NAME="";
	//定义数据库url
	private  static final String URL="jdbc:mysql://127.0.0.1:3306/test";
	//定义数据库用户名
	private  static final String USERNAME="root";
	//定义数据库密码
	private  static final String PASSWORD="123456";
	//通过静态代码块加载数据库驱动
	static {
		try {
			Class.forName(DRIVER_NAME);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 得到数据库连接
	 */
	public static Connection getConnection() {
		Connection  conn=null;
		try {
			conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

6.创建数据库访问类

package com.wangxing.dbacsess;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.wangxing.bean.UserBean;
import com.wangxing.db.DBConnection;

/**
 * 数据库用户信息的访问类
 * @author Administrator
 *
 */
public class UserAcesess {
	/**
	 * 添加用户信息
	 */
	public  boolean insertUser(UserBean userbean) {
		boolean flag=false;
		try {
		Connection conn=DBConnection.getConnection();
		String insertsql="insert into t_user values(null,'"+userbean.getUsername()+
				"',"+userbean.getUserage()+","+userbean.isUsersex()+
				",'"+userbean.getUseraddress()+"','"+userbean.getUserday()+"');";
		Statement statement=conn.createStatement();
		int temp=statement.executeUpdate(insertsql);
		if(temp>0) flag=true;
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	/**
	 * 修改用户信息
	 */
	public  boolean  updateUser(UserBean userbean) {
		boolean flag=false;
		try {
		Connection conn=DBConnection.getConnection();
		String updatesql="update t_user set user_name='"+userbean.getUsername()+
				"',user_age="+userbean.getUserage()+
				",user_sex="+userbean.isUsersex()+
				",user_address='"+userbean.getUseraddress()+
				"',user_day='"+userbean.getUserday()+
				"' where user_id="+userbean.getUserid()+";";
		Statement statement=conn.createStatement();
		int temp=statement.executeUpdate(updatesql);
		if(temp>0) flag=true;
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	/**
	 * 删除用户信息
	 */
	public  boolean  deleteUser(int userid) {
		boolean flag=false;
		try {
		Connection conn=DBConnection.getConnection();
		String deletesql="delete from t_user where user_id="+userid+";";
		Statement statement=conn.createStatement();
		int temp=statement.executeUpdate(deletesql);
		if(temp>0) flag=true;
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	/**
	 * 查询所有用户信息
	 */
	public  List<UserBean>  selectUser() {
		List<UserBean> userlist=null;
		try {
		Connection conn=DBConnection.getConnection();
		String selectsql="select * from t_user;";
		Statement statement=conn.createStatement();
		ResultSet rs=statement.executeQuery(selectsql);
		userlist=new ArrayList<UserBean>();
		while(rs.next()) {
			int userid=rs.getInt("user_id");
			String username=rs.getString("user_name");
			int userage=rs.getInt("user_age");
			boolean usersex=rs.getBoolean("user_sex");
			String useraddress=rs.getString("user_address");
			Date userday=rs.getDate("user_day");
			UserBean user=new UserBean();
			user.setUserid(userid);
			user.setUsername(username);
			user.setUserage(userage);
			user.setUsersex(usersex);
			user.setUseraddress(useraddress);
			user.setUserday(userday);
			userlist.add(user);
		}
		rs.close();
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return userlist;
	}
	/**
	 * 根据userid查询用户信息
	 */
	public  UserBean  selectUserById(int userid) {
		UserBean user=null;
		try {
		Connection conn=DBConnection.getConnection();
		String selectsql="select * from t_user where user_id="+userid+";";
		Statement statement=conn.createStatement();
		ResultSet rs=statement.executeQuery(selectsql);
		if(rs.next()) {
			int id=rs.getInt("user_id");
			String username=rs.getString("user_name");
			int userage=rs.getInt("user_age");
			boolean usersex=rs.getBoolean("user_sex");
			String useraddress=rs.getString("user_address");
			Date userday=rs.getDate("user_day");
			user=new UserBean();
			user.setUserid(id);
			user.setUsername(username);
			user.setUserage(userage);
			user.setUsersex(usersex);
			user.setUseraddress(useraddress);
			user.setUserday(userday);
		}
		rs.close();
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return user;
	}
}

实例2:实现信息的增删改查【PreparedStatement】

package com.wangxing.dbacsess;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.wangxing.bean.UserBean;
import com.wangxing.db.DBConnection;

/**
 * 数据库用户信息的访问类
 * @author Administrator
 *
 */
public class UserAcesess {
	/**
	 * 添加用户信息
	 */
	public  boolean insertUser(UserBean userbean) {
		boolean flag=false;
		try {
		Connection conn=DBConnection.getConnection();
		String insertsql="insert into t_user values(null,?,?,?,?,?);";
		PreparedStatement statement=conn.prepareStatement(insertsql);
		statement.setString(1, userbean.getUsername());
		statement.setInt(2, userbean.getUserage());
		statement.setBoolean(3, userbean.isUsersex());
		statement.setString(4, userbean.getUseraddress());
		statement.setDate(5, userbean.getUserday());
		int temp=statement.executeUpdate();
		if(temp>0) flag=true;
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	/**
	 * 修改用户信息
	 */
	public  boolean  updateUser(UserBean userbean) {
		boolean flag=false;
		try {
		Connection conn=DBConnection.getConnection();
		String updatesql="update t_user set user_name=?,user_age=?,user_sex=?,user_address=?,user_day=? where user_id=?;";
		PreparedStatement statement=conn.prepareStatement(updatesql);
		statement.setString(1, userbean.getUsername());
		statement.setInt(2, userbean.getUserage());
		statement.setBoolean(3, userbean.isUsersex());
		statement.setString(4, userbean.getUseraddress());
		statement.setDate(5, userbean.getUserday());
		statement.setInt(6, userbean.getUserid());
		int temp=statement.executeUpdate();
		if(temp>0) flag=true;
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	/**
	 * 删除用户信息
	 */
	public  boolean  deleteUser(int userid) {
		boolean flag=false;
		try {
		Connection conn=DBConnection.getConnection();
		String deletesql="delete from t_user where user_id=?;";
		PreparedStatement statement=conn.prepareStatement(deletesql);
		statement.setInt(1,userid);
		int temp=statement.executeUpdate();
		if(temp>0) flag=true;
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}
	/**
	 * 查询所有用户信息
	 */
	public  List<UserBean>  selectUser() {
		List<UserBean> userlist=null;
		try {
		Connection conn=DBConnection.getConnection();
		String selectsql="select * from t_user;";
		PreparedStatement statement=conn.prepareStatement(selectsql);
		ResultSet rs=statement.executeQuery();
		userlist=new ArrayList<UserBean>();
		while(rs.next()) {
			int userid=rs.getInt("user_id");
			String username=rs.getString("user_name");
			int userage=rs.getInt("user_age");
			boolean usersex=rs.getBoolean("user_sex");
			String useraddress=rs.getString("user_address");
			Date userday=rs.getDate("user_day");
			UserBean user=new UserBean();
			user.setUserid(userid);
			user.setUsername(username);
			user.setUserage(userage);
			user.setUsersex(usersex);
			user.setUseraddress(useraddress);
			user.setUserday(userday);
			userlist.add(user);
		}
		rs.close();
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return userlist;
	}
	/**
	 * 根据userid查询用户信息
	 */
	public  UserBean  selectUserById(int userid) {
		UserBean user=null;
		try {
		Connection conn=DBConnection.getConnection();
		String selectsql="select * from t_user where user_id=?;";
		PreparedStatement statement=conn.prepareStatement(selectsql);
		statement.setInt(1, userid);
		ResultSet rs=statement.executeQuery();
		if(rs.next()) {
			int id=rs.getInt("user_id");
			String username=rs.getString("user_name");
			int userage=rs.getInt("user_age");
			boolean usersex=rs.getBoolean("user_sex");
			String useraddress=rs.getString("user_address");
			Date userday=rs.getDate("user_day");
			user=new UserBean();
			user.setUserid(id);
			user.setUsername(username);
			user.setUserage(userage);
			user.setUsersex(usersex);
			user.setUseraddress(useraddress);
			user.setUserday(userday);
		}
		rs.close();
		statement.close();
		conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return user;
	}
}

Statement与PreparedStatement的区别

Statement接口PreparedStatement接口
继承关系是Statement接口的子接口
使用范围当执行相似SQL(结构相同,具体值不同)语句的次数比较少当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作…)语句一样,只是具体的值不一样,被称为动态SQL
优点语法简单语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
缺点采用硬编码效率低,安全性较差执行非相似SQL语句时,速度较慢
原理硬编码,每次执行时相似SQL都会进行编译相似SQL只编译一次,减少编译次数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值