JDBC连接Mysql数据库

2 篇文章 0 订阅

博主使用的是mysql-connector-java6.0.6.jar架包

链接: https://pan.baidu.com/s/1SwXvB2nmhRAduaAvSUAPCQ 提取码: 78d2 

下载后buildpath导入架包

博主又导入内部架包test便于后期编写程序测试

 

一、基础概念

  1. JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API
  2. 简单地说,JDBC 可做三件事:与数据库建立连接、发送操作数据库的语句并处理结果

二、JDBC编程步骤

1.未用预编译(不安全)

//1.注册驱动
//方法一:
//DriverManager.registerDriver(new Driver());
//方法二:使用系统类注册驱动
//System.setProperty("jdbc.drivers", "com.mysql.cj.jdbc.Driver");
//方法三:使用反射的方式注册驱动(推荐使用)
Class.forName("com.mysql.cj.jdbc.Driver");
//加载Oracle驱动
// Class.forName("oracle.jdbc.driver.OracleDriver");
//2.建立连接
//url:用于指定连接具体的数据库表
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/d0115"
				+"?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT\r\n"  
				, "root", "ok");
//3.创建statement对象
Statement st = conn.createStatement();
//4.执行sql语句
ResultSet rs = st.executeQuery("select * from teacher");
//5.获取数据
while(rs.next()) {
	//从控制台输出语句(查询的表有几列写几个getObject())
	System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
}
//6.释放资源
rs.close();
st.close();
conn.close();

2.使用单例模式(使用静态内部类),将其写成工具类

public class JdbcUtilsSingLeton {
	//定义连接数据库的url、用户名、密码
	private static String url = "jdbc:mysql://localhost:3306/d0115?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT";
	private static String user ="root";
	private static String password ="ok";
	
	private JdbcUtilsSingLeton() {}
	
	//定义静态内部类
	private static class HolderClass {
		private final static JdbcUtilsSingLeton jus = new JdbcUtilsSingLeton();
	}
	
	public static JdbcUtilsSingLeton getInstance() {
		return HolderClass.jus;
	}
	//加载驱动
	static {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//提供一个获取连接的方法
	public Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, user, password);
	}
	
	//释放资源
	public void free(ResultSet rs,Statement st,Connection conn) {
		try {
			if(rs!=null) {
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(st!=null) {
					st.close();
				}
			}catch(Exception e2){
				e2.printStackTrace();
			}finally {
				try {
					if(conn!=null) {
						conn.close();
					}
				} catch (Exception e3) {
					e3.printStackTrace();
				}
			}
		}
	}
}

3.使用prepareStatemnet对象,结合静态内部类使用的单列模式,安全,推荐使用

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

public void read2(String name) {
	Connection conn = null;
	PreparedStatement pst = null;
	ResultSet rs = null;
	try {
		conn = JdbcUtilsSingLeton.getInstance().getConnection();
		//使用占位符传入制定参数
		String sql = "select * from teacher where teacher_name=?";
		//预编译sql语句
		pst = conn.prepareStatement(sql);
		//设置参数
		pst.setString(1,name);
		rs = pst.executeQuery();
		while(rs.next()) {
			System.out.println(rs.getObject(1)+"\t"+rs.getObject("teacher_name"));
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		JdbcUtilsSingLeton.getInstance().free(rs, pst, conn);
	}
}
	
@Test
public void test() {
	read2("小刘老师");
}

三、JDBC常用方法

1.加载驱动

Class.forName("com.mysql.jdbc.Driver")

2.获得数据库连接

Connection conn = DriverManager.getConnection(url, user, password)

3.操作数据库,实现增删改查

 1) Statement                  Statement st = conn.createStatement();

 2) PrepareStatement           PreparedStatement ptmt = conn.prepareStatement(sql);//(推荐使用,安全)

 3) Statement与PrepareStatement:

    (1)PreparedStatement可以写动态参数化的查询,先 String sql = "里面有占位符  ?",采用参数占位符,对于数据库来说是预编译再填充参数

    (2)PreparedStatement 的 SQL 对于数据库来说采用预编译,数据库会将其进行缓存,下一次可以直接拿来使用,省掉了解析 SQL 语句、编译 SQL 的时间

    (3)PreparedStatement 是 Statement 子接口,因此 Statement 有的功能 PreparedStatement 都有,而 Statement 没有的功能 PreparedStatement 也有

4.execute有关方法

(1) ResultSet executeQuery(String sql);    

    执行select语句,返回的是查询后得到的记录集(ResultSet)

(2) boolean executeUpdate(String sql);  

     执行任何sql语句(select,insert,update,delete),返回值是第一个结果的表现形式。

     当第一个执行结果是查询语句是,返回true,可以通过getResultSet()方法获取结果;

     当第一个执行结果是更新语句或DDL语句时,返回false,可以通过getUpdateCount()获取更新的记录条数  

(3)int executeUpdate(String sql)

    执行update, insert, delete语句,返回的是执行后收到影响的记录数(int)

    对于create table或者drop table等不操作行的DDL语句,返回值总为0

(4)Statement调用都需要传入sql,PrepareStatement调用不用传入sql,因为conn的get时候已经传入了预编译的sql

5. ResultSet中的方法

(1)boolean resultSet.next()                           放入循环里面,表示是否有下一个对象,是否还有对象

(2)String s = resultSet.getString(columnIndex)        获取某个字段的值,各种基本数据类型的方法不一样,但是都大同小异

6.Date数据处理

/**
 * 插入含有时间列的记录
 */
@Test
public void createDateFieldTest() {
	createDateField("白", new Date(), 24341.33f);//new Date()当前时间
}
public void createDateField(String name,Date birthday,float money) {
	Connection conn =null;
	PreparedStatement pst = null;
	
	try {
		conn = JdbcUtilsSingLeton.getInstance().getConnection();
		//定义sql
		String sql =  "insert into t_user(username,birthday,money) values(?,?,?)";
		pst = conn.prepareStatement(sql);
		//设置参数
		pst.setString(1, "jack");
		//插入参数是java.sql.date里的对象
		pst.setDate(2, new java.sql.Date(birthday.getTime()));
		pst.setFloat(3, money);
		int rows = pst.executeUpdate();
		System.out.println("成功执行了["+rows+"]行数据");
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		JdbcUtilsSingLeton.getInstance().free(null, pst, conn);
	}
}
	
/*
 * 根据用户id查询出该用户的生日
 */
public Date sele(int id){
	Connection conn =null;
	PreparedStatement pst = null;
	ResultSet rs = null;
	Date birthday =null;
	 try {
		conn=JdbcUtilsSingLeton.getInstance().getConnection();
		String sql = "select birthday from t_user where id = ?";
		pst = conn.prepareStatement(sql);
		pst.setInt(1, id);
		rs = pst.executeQuery();
		while(rs.next()) {
			birthday = rs.getDate("birthday");
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		JdbcUtilsSingLeton.getInstance().free(rs, pst, conn);
	}
	 return birthday;
}
	
@Test
public void seleTest() {
	System.out.println(sele(2));
}

7.总结

(1)增、删、改用Statement.executeUpdate来完成,返回整数(匹配的记录数)

(2)查询用Statement.executeQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果

四、大文本内容以及特殊文件的存取

1.COLB\rightarrow(储存文本内容)

           存:ps.setCharacterStream(index, reader, length);

               ps.setString(i, s);

           取:reader = rs. getCharacterStream(i);

               reader = rs.getClob(i).getCharacterStream();

               string = rs.getString(i)

 

(1)存储到数据库中

@Test
	public void create() {
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		
		try {
			conn = JdbcUtilsSingLeton.getInstance().getConnection();
			String sql = "insert into t_clob (clob_text) values (?)";
			pst = conn.prepareStatement(sql);
			//读取一个文件
			File in =new File("src/com/jdbc/d0118/ClobTest.java");
			Reader reader = new BufferedReader(new FileReader(in));
			pst.setCharacterStream(1, reader);
			//执行
			int rows = pst.executeUpdate();
			System.out.println("执行了["+rows+"]条记录");
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			JdbcUtilsSingLeton.getInstance().free(rs, pst, conn);
		}
	}

(2)读取保存到另一个文件中

@Test
	public void ReadTest(){
		read(1);
	}
	public void read(int id) {
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		
		try {
			conn = JdbcUtilsSingLeton.getInstance().getConnection();
			String sql = "select clob_text from t_clob where id =?";
			pst = conn.prepareStatement(sql);
			pst.setInt(1, id);
			rs = pst.executeQuery();
			while(rs.next()) {
				//System.out.println(rs.getClob("clob_text"));
				//获取text类的列
				Clob clob = rs.getClob("clob_text");
				Reader reader = clob.getCharacterStream();
				File file = new File("D:/image/d0118.java");
				Writer outfile = new BufferedWriter(new FileWriter(file));
				char[] buff = new char[1024];
				for (int i = 0;(i=reader.read(buff))>0 ; ) {
					outfile.write(buff, 0, i);
				}
				outfile.close();
				reader.close();
			}
			System.out.println("文件写入成功");
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			JdbcUtilsSingLeton.getInstance().free(rs, pst, conn);
		}
	}

2.BLOB\rightarrow(例如图片文件)

      存:ps.setBinaryStream(i, inputStream, length);

      取:rs.getBinaryStream(i);

               rs.getBlob(i).getBinaryStream();

 

注意:MySQL的四种BLOB类型

类型大小(单位:字节)

TinyBlob

最大255

Blob

最大65K

MediumBlob

最大16MB

LongBlob

最大4G

 

 

(1)存入数据库中

/*
	 * 将一张图片存到数据库中
	 */
	@Test
	public void create() {
		Connection conn = null;
		PreparedStatement pst =null;
		
		try {
			conn = JdbcUtilsSingLeton.getInstance().getConnection();
			String sql = "insert into t_blob (blob_text) values (?)";
			pst = conn.prepareStatement(sql);
			
			//获取图片内容
			File file = new File("b.png");
			InputStream is = new BufferedInputStream(new FileInputStream(file));
			
			//设置字段内容
			pst.setBinaryStream(1, is, file.length());
			//执行
			int rows = pst.executeUpdate();
			System.out.println("成功执行了["+rows+"]行");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtilsSingLeton.getInstance().free(null, pst, conn);
		}
	}

(2)读取数据库中blob类型的文件并存入到另一个文件中

/*
	 * 将数据库中的二进制文件读取到指定文件
	 */
	@Test
	public void readWrite() {
		Connection conn = null;
		PreparedStatement pst =null;
		ResultSet rs =null;
		try {
			conn = JdbcUtilsSingLeton.getInstance().getConnection();
			String sql = "select blob_text from t_blob where id=?";
			pst = conn.prepareStatement(sql);
			pst.setInt(1, 2);
			rs = pst.executeQuery();
			while(rs.next()) {
				Blob blob = rs.getBlob("blob_text");
				InputStream is = blob.getBinaryStream();
				File file = new File("D:/image/d0118.png");
				FileOutputStream os = new FileOutputStream(file);
				byte[] bs= new byte[1024];
				for (int i = 0;(i=is.read(bs))>0 ; ) {
					os.write(bs);
				}
				os.close();
				is.close();
				System.out.println("文件写入成功");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtilsSingLeton.getInstance().free(null, pst, conn);
		}
	}

参考文章:https://blog.csdn.net/Stream_who/article/details/81543466

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值