java连接数据库

java连接数据库(Driver、url、user、password、Connection、Statement、sql(String)、RusultSet)


以往数据库插入为例,下面是一种比较直接的方式

/**
	 * 插入一"学生"。
	 * 
	 * @param student
	 * @return
	 * @throws Exception
	 */
	public int insertStudent1(Student student) throws Exception {
		int ret = 0;
		// 连接数据库的配置。
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
		String user = "root";
		String password = "123456";
		// 引入mysql的驱动类
		Class.forName(driver);
		// 拿到数据库的连接。
		Connection conn = DriverManager.getConnection(url, user, password);
		System.out.println(conn);
		// 插入学生
		String sql = "INSERT INTO student(`name`, age, telephone) VALUES (?, ?, ?)";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		// 设置参数
		pstmt.setString(1, student.getName());
		pstmt.setInt(2, student.getAge());
		pstmt.setString(3, student.getTelephone());
		// 执行插入
		ret = pstmt.executeUpdate();
		// 关闭资源
		pstmt.close();
		conn.close();
		return ret;
	}
	
public static void main(String[] args) throws Exception {
		StudentDao dao = new StudentDao();
		Student s1 = new Student("yelistening", 18, "123456789012");
		dao.insertStudent1(s1);
	}

简单介绍一下各个属性

一、driver(驱动)—数据库的连接工具(包装数据给数据库,解析数据给使用者)

//MySql
"com.mysql.jdbc.Driver"//固定格式
//sql
"com.microsoft.sqlserver.jdbc.SQLServerDriver"

jdk没有直接访问数据库的能力,但它提供了一些接口,比如connection接口,功能具体的实现由各个数据库的驱动jar包来完成,

另外数据库的驱动jar包是通过,Class.forDriver(driver),和jdk相关的数据库访问类,接口勾搭的。
MySql-jar
在这里插入图片描述

1)数据库驱动的三种连接方式

		//数据库驱动的加载-方式1
		String driver = "com.mysql.jdbc.Driver";
		Class.forName(driver);
		//数据库的驱动加载-方式2 可以加载多个驱动
		System.setProperty("jdbc.drivers","com.mysql.cj.jdbc.Driver");// 加载数据库驱动
		//数据库的驱动加载-方式3 
		new com.mysql.cj.jdbc.Driver();

加载完驱动后就是连接数据库了

二、connection conn 有两种方式来连接

//方法1
Connection conn = DriverManager.getconnection(url)  
//方法2
// 获取数据源
DataSource datesource = new MysqlDataSource();
//设置url
((MysqlDataSource) datesource ).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) datesource ).setUser("root");
((MysqlDataSource) datesource ).setPassword("123456");
//建立连接
Connection connection = datesource .getConnection();

这里面有 url

三、String url

String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
jdbc:mysql://[host:port]/[database][?参数名1][=参数值1][&参数名2][=参数值2]...

==常用的两种==
useUnicode	是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk。

characterEncoding	当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk

连接完成后就要开始sql语句的编译和执行了

当然sql语句也要写啦

String sql = "INSERT INTO student(`name`, age, telephone) VALUES (?, ?, ?)"

四、PrepareStatement 、Statement

关于两者的区别 PrepareStatement 的对象有预编译能力。
而Statement的对象没有。

预编译是指:PrepareStatement对set/get[String][int][…]先预处理 再一次性执行(效率高)
而Statement则是编译 一条,执行一条

两者都是通过Connection对象的createStatement方法创建Statement或PrepareStatement对象,executeQuery() 执行。

//PrepareStatement方法
PreparedStatement pstmt = conn.prepareStatement(sql);
		// 设置参数
		pstmt.setString(1, student.getName());
		pstmt.setInt(2, student.getAge());
		pstmt.setString(3, student.getTelephone());
		// 执行插入
		ret = pstmt.executeUpdate();
		
//Stetement 方法
       Statement stmt;
		ResultSet rs;
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery("SELECT* FROM goods");//SQL查询语句
			while (rs.next()) {
				String number = rs.getString(1); 
				String name = rs.getString(2);
				Date date = rs.getDate(3);
				float price = rs.getFloat(4);
				}
			conn.close();
			stmt.close();
			rs.close();
		} catch (SQLException e) {
			System.out.println(e);
		}

再就是关闭资源了

五、close();//关闭资源

pstmt.close();
conn.close();
rs.close();

事实上我们最开始的代码还是存在问题,有一部分是每次插入一个学生对象都要初始化的,我们的String driver、String url、String user、 String password以及关闭资源close() 咋办嘛? JDBCUilts是个不错的东西

六、JDBCUilts

public class JdbcUtils {

	/**
	 * 驱动
	 */
	private static String driver = "com.mysql.jdbc.Driver";
	/**
	 * 数据库的URL
	 */
	private static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
	/**
	 * 数据库的用户名
	 */
	private static String user = "root";
	/**
	 * 数据库的密码。
	 */
	private static String password = "";
	/**
	 * 静态代码块:它只执行一次。
	 */
	static {
		// 只加载一次,用于节省时间。
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取数据库的连接。
	 * @return
	 */
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	 * 我们按照顺序关闭各种资源:ResultSet -> Statement -> Connection
	 * @param re
	 * @param stmt
	 * @param conn
	 */
	public static void closeReource(ResultSet rs, Statement stmt, Connection conn) {
	
		try {
			if(rs != null) {
				// close ResultSet
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

事实上我们插入学生也不会是”一个一个“插入 也许直接来一串呢!!! 并且connection
连接数据库连接一次就够了不需要每次都连接 那么它就可以被放到静态代码块里面

	public int[] insertStudentBatch(List<Student> students) {
		int rets[] = null;
		PreparedStatement pstmt = null;
		try {
			// 获取数据库的连接。
			// conn = JdbcUtils.getConnection(); // 不需要数据库连接。
			String sql = "INSERT INTO student(name, age, telephone) VALUES (?, ?, ?)";
			pstmt = conn.prepareStatement(sql);
			for(Student student : students) {
				// 设置参数
				pstmt.setString(1, student.getName());
				pstmt.setInt(2, student.getAge());
				pstmt.setString(3, student.getTelephone());
				// 添加批处理
				pstmt.addBatch();
			}
			// 执行批处理
			rets = pstmt.executeBatch();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeReource(null, pstmt, null);
		}
		return rets;
	}

七、总结

参考的博客和csdn如下 -> Thank You!!!

https://blog.youkuaiyun.com/weixin_45062761/article/details/104510644
https://www.cnblogs.com/andong2015/p/4305756.html
https://www.cnblogs.com/thaipine/p/11634772.html
https://blog.youkuaiyun.com/yuiop123455/article/details/107206171

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值