一、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()方法是将连接还回到连接池中,也就是说,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。