JDBC连接数据库--各类说明

本文主要介绍了使用JDBC进行数据库连接的方法,包括Navicat工具的使用,JDBC的基本概念,PreparedStatement对象的详细操作,以及数据库连接池的概念和重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Navicat软件的使用

1.新建连接:连接名随便起一个就可,主机名/IP地址,端口,用户名都是默认的,直接输入密码就ok
2.新建数据库时,左边栏不显示新建的数据库,右键连接刷新即可
3.如何导入/导出--java/web程序到Eclipse
	(1)导出:--想把文件发给别人,直接复制粘贴到桌面即可导出
	(2)导入:--新建一个同类型的的项目,名字后面加上-teacher(跟自己的不一样就可以)
			 然后复制目录下的src和WebContent到项目里即可
	Import导入:Import-General-Existing Projects into Workspace--select root directory
	选上Copy projects into workspace选项(就会自动保存在工作空间里一份)

二、JDBC(Java DataBase Connectivity)-- Java数据库连接

1.其实就是利用Java语言/Java程序连接并访问数据库的一门技术,开发中都是通过程序来连接数据库
  如果是Java语言通过程序连接数据库,就必须要学习JDBC这门技术
2.如何通过Java程序连接mysql数据库-- 入门程序
	(1)课前资料的SQL脚本复制到Navicat软件中执行,创建jt_bd库,包含表(acc,account,user,stu)
	(2)创建一个CGB-JDBC-01项目
	(3)课前资料里找到mysql-connector-java-5.1.32.jar
	(4)如果是web项目:直接把文件复制到WebContent/WEB-INF/lib目录下 
	   如果是Java基础项目:可以在项目中建一个lib目录,上面的jar文件复制到项目的lib下,在选中jar文件
	   右键--> Build Path --> Add to Build Path..
	(5)创建一个测试类JdbcTest01,代码如下--查询:
		public class JdbcTest01 {
		-- 练习1:查询asscount表中的所有记录并输出到控制台
		@Test
		public void testFindAll() throws Exception {
			-- 1.注册数据库驱动--JDBC4.0之后会自动注册驱动,但最好加上,否则某些时候会报错
			Class.forName("com.mysql.jdbc.Driver");
			--  2.获取数据库连接
			Connection conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/jt_db?characterEncoding=utf-8",
					"root", "root");
			--  3.获取传输器
			Statement st = conn.createStatement();
			--  4.发送SQL到服务器执行,并返回运行结果
			String sql = "select * from account";
			-- 查询用的是executeQuery(sql)返回的是一个表格
			-- 增删改用的是excuteUpdate(sql),返回的是int值,表示影响的行数
			ResultSet rs = st.executeQuery(sql);
			--  5.处理执行后的结果
			while (rs.next()) {
			-- 也可以传入数值,代表传入的是第一列 -- int id=ra.getInt(1);
				int id = rs.getInt("id");
				String name = rs.getString("name");
				Double money = rs.getDouble("money");
				System.out.println(id + "," + name + "," + money);
			}
			--  6.释放资源
			rs.close();
			st.close();
			conn.close();
			System.out.println("ok");
		}
		(6)创建一个测试类JdbcTest02,代码如下--增加:
		/* 练习2:往account表中添加一条记录,名称为'john',金额是3500 */
		@Test
		public void testInsert02() throws Exception {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection(
			"jdbc:mysql:///jt_db?characterEncoding=utf-8", "root", "root");
			Statement st = conn.createStatement();
			String sql = "insert into account values(null,'john',3500);";
			int rs = st.executeUpdate(sql);
			System.out.println("成功--影响行数为" + rs);
			st.close();
			conn.close();
		}
		修改和删除只需要改一下sql语句即可,就不举例了

三、PreparedStatement对象

1.模拟登录-- 代码详见E:/WS_CGB2008/工作空间下的/CGB-JDBC-01/cn.tedu.ps/LoginUser
2.上面那样写会出现bug,用户名输入(张飞'#,张飞' or '1=1)或密码输入--' or '2=2都可以显示登录成功
-- 这种bug叫做SQL注入攻击
3.SQL注入攻击
	SQL注入攻击产生的原因: 由于后台执行的SQL语句是拼接而来的:其中的参数值(username和password的值)是用户提交过来的
	如果用户在提交参数时,在参数中掺杂了一些SQL关键字(比如or)或者特殊符号(#、-- 、' 等),就可能会导致SQL语句语义
	的变化,从而执行一些意外的操作(用户名或密码不正确也能登录成功)!
	delete from user where id=1 or 1 = 1; -- 这样是恶意攻击,这样user表的数据全被删除了
	3.1--解决SQL注入攻击:
		(1)可以对用户提交过来的参数进行校验,这种方式不推荐,需要自己手写代码
			通过正则表达式对用户名和密码进行校验,如果用户名和密码中有类似于or,#,-- 等符号,就不再登录
		(2)使用PreparedStatement对象来替代Statement对象。
			代码详见E:/WS_CGB2008/工作空间下的/CGB-JDBC-01/cn.tedu.ps/LoginUser2
			--原理--使用PreparedStatement对象是先将SQL语句的骨架(不包含参数)发送给服务器编译并确定下来
				String sql = "select * from user where username = ? and password = ?";
				PreparedStatement ps = conn.prepareStatement(sql);
			--再将SQL语句中的参数值传递给服务器
				ps.setString(1, user);
				ps.setString(2, psw);
				-- 执行SQL语句,返回执行结果
				ResultSet rs = ps.executeQuery();
			由于前面SQL语句的骨架已经确定了,因此SQL语句参数中即使再包含SQL关键字或者特殊符号
			也不会导致SQL语句的骨架或语义,只会被当作普通的文本来处理,因此可以防止SQL注入攻击!

四、数据库连接池

1.什么是连接池
	池:常量值、线程池、连接池等中的池就是一个容器,是指内存中的一片空间
	连接池:就是将一批连接资源存入到一个容器中,目的是为了实现连接的复用,减少连接创建和关闭的次数,以此来提高程序执行的效率
2.为什么要使用连接池
	传统方式中,每次需要连接都是直接创建连接,在基于这个创建的连接去连接数据库,最后用完连接还要关闭!而每次创建连接和关闭连
	接相比使用连接要消耗大量的时间和资源,导致程序的执行效率非常低下,为了提高程序执行的效率,我们可以在程序一启动时,就创建
	一批连接放在一个容器中,供整个程序共享。当用户需要连接时,不需要再创建连接,而是直接从连接池中获取一个连接使用,用完连接
	后,也不需要关闭,而是直接将连接还回连接池中,这样一来,用来用去都是池中的这一批连接,实现了连接的复用,减少了连接创建和
	关闭的次数,从而提高了程序执行的效率!
3.怎么使用C3PO连接池
	(1)导入jar包:--二阶段课件\unit06-jdbc\resource\c3p0下的c3p0-0.9.1.2.jar
	(2)在程序中创建一个连接池对象(就是存放连接的容器)
		ComboPooledDataSource pool = new ComboPooledDataSource();
	(3)设置连接数据库的基本信息(四个参数)
		方式1:将连接数据库的参数通过setXXX方法直接通过java,这种方式不推荐使用,代码如下:
			pool.setDriverClass("com.mysql.jdbc.Driver");
			pool.setJdbcUrl("jdbc:mysql:///jt_db?characterEncoding=utf-8");
			pool.setUser("root");
			pool.setPassword("root");
		这种方式不推荐
		方式2:将连接数据库的参数提取到c3p0.properties(文件名是固定的)文件中并且需要将这个文件放在源码目录中,代码如下:
			c3p0.driverClass=com.mysql.jdbc.Driver
			c3p0.jdbcUrl=jdbc:mysql:///jt_db?characterEncoding=utf-8
			c3p0.user=root
			c3p0.password=root
		再次强调:这个文件的位置和名字是固定的,因为底层c3p0会到指定的位置找指定的文件,如果没有按照要求去存放文件或者没有
		按照要求去指定文件名称,都会导致c3p0找不到文件,也就无法读取其中的配置信息,必然会导致连接不上数据库。
		方式3:将连接数据库的参数提取到c3p0-config.xml(文件名也是固定的)文件中并且需要将这个文件放在源码根目录下,代码如下:
			<?xml version="1.0" encoding="UTF-8"?>
			<c3p0-config>
				<default-config>
					<property name="driverClass">
						com.mysql.jdbc.Driver
					</property>
					<property name="jdbcUrl">
						jdbc:mysql:///jt_db?characterEncoding=utf-8
					</property>
					<property name="user">
						root
					</property>
					<property name="password">
						root
					</property>
				</default-config>
			</c3p0-config>
		再次强调:这个文件的位置和名字是固定的,因为底层c3p0会到指定的位置找指定的文件,如果没有按照要求去存放文件或者没有
		按照要求去指定文件名称,都会导致c3p0找不到文件,也就无法读取其中的配置信息,必然会导致连接不上数据库。
	(4)从连接池中获取一个连接对象进行使用
		Connection conn=pool.getConnection();
	(5)将用完的连接对象还回到连接池中
		conn.close;
	如果在程序中没有使用任何连接池,需要连接就通过DriverManager.getConnection获取(创建)一个连接,用完之后,调用conn.close()
	就是将连接资源关闭,如果使用了连接池,通过连接池对象调用getConnection方法获取一个连接对象,此时获取的连接对象已经被改造了
	用完之后,再调用conn.close()方法是将连接还回到连接池中,也就是说,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值