**
**
JDBC:(Java DataBase Connectivity Java数据库连接).
* 是一种用于执行SQL语句的Java 的API.可以为多种关系型数据库提供统一的访问.它是由一组使用Java语言编写的类或接口组成.
任意一个应用:
学生选课:
ERP
OA:
系统都需要与数据库进行交互.都需要使用JDBC.
驱动:两个设备之间的通信桥梁.
Java语言要连接数据库必须使用数据库的驱动.
各个数据库的生产商提供数据库的驱动.使用Java连接各种数据库.需要了解各个数据库的驱动.增加Java程序员压力.
SUN公司与各个数据库生产商协商.由SUN公司提供一套统一的规范.由各个数据库的生产商提供这套规范的实现.
SUN公司提供了一组接口.各个数据库生产商提供了这套接口的实现.(这组规范就是JDBC规范.)
**
步骤1:搭建开发环境,引入数据库的驱动.
步骤2:在程序中加载数据库驱动.
步骤3:获得数据库连接.
步骤4:编写SQL.执行SQL.
步骤5:释放资源.
public void demo1() throws SQLException{<br /> // 1.加载驱动<br /> DriverManager.registerDriver(new Driver());<br /> // 2.获得连接.<br /> Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_db1", "root", "111");<br /> // 3.编写SQL并且执行SQL.<br /> String sql = "select * from user";<br /> Statement statement = connection.createStatement();<br /> // 结果集:查询后的数据的封装.<br /> ResultSet rs = statement.executeQuery(sql);<br /> // 遍历:<br /> while(rs.next()){<br /> int id = rs.getInt("id");<br /> String username = rs.getString("username");<br /> String password = rs.getString("password");<br /> System.out.println(id+" "+username+" "+password);<br /> }<br /> // 4.释放资源.<br /> rs.close();<br /> statement.close();<br /> connection.close();<br /> }
**
主要的作用:
一、注册驱动:(加载驱动)
registerDriver(Driver driver);
- import com.mysql.jdbc.Driver;
throw new RuntimeException(“Can’t register driver!
**
* 反射: Class.forName(“com.mysql.jdbc.Driver
二、获得连接:
getConnection(String url,String username,String password);
url :数据库连接的路径.
username :连接数据库用户名.
password :连接数据库密码.
** url的写法:
jdbc:mysql://localhost:3306/jdbc_db1
jdbc :连接数据库协议.
mysql :JDBC协议的一个子协议.
localhost :数据库服务器主机名.
3306 :mysql数据库服务器的端口号.
jdbc_db1 :数据库名称.
url简写为 :jdbc:mysql://localhost:3306/jdbc_db1
默认连接本地的mysql服务器默认的端口号3306.
简写 :jdbc:mysql:///jdbc_db1
Connection由DriverManager创建的.代表的是一个连接的对象.
主要有两个作用:
一、创建执行SQL语句的对象.
Statement createStatement()
创建Statement对象.
创建PreparedStatement对象.对SQL进行预编译.(防止SQL注入的漏洞.)
创建CallableStatement.用来执行数据库中存储过程.
二、进行事务的管理:
设置事务不自动提交.
事务提交.
事务回滚.
Statement对象由Connection对象创建的.代表是可以运行SQL的类.
主要有两个作用:
一、执行SQL语句.
执行查询语句.执行select语句.返回了一个ResultSet对象.代表查询结果的表格数据.
执行更新语句.执行update、insert、delete语句的时候.返回int类型数据.int类型的数据代表的是影响的行数.
执行SQL语句.执行select、insert、update、delete语句.返回的是boolean值.如果返回的结果为ResultSet.那么boolean值为true.如果返回的是更新的记录数.那么boolean就为false.
二、执行批处理.
将SQL添加到批处理中.
清空批处理.
执行批处理.
ResultSet对象由Statement对象中executeQuery(String sql);返回的.ResultSet对象代表的是select查询后的结果.
在ResultSet内部维护了一个指向表格数据行的游标Cursor,初始化时候,游标在第一行之前的位置.调用ResultSet中next()方法.可以使游标指向具体的数据行,进而调用方法获得该行的数据.
方法:
向下移动光标.
获得结果集中整形数据.
获得结果集中字符串类型的数据:
…
遍历结果集:
while(rs.next()){
int id = rs.getInt(“id”);
String username = rs.getString(“username”);
String password = rs.getString(“password”);
System.out.println(id+” “+username+” “+password);
}
获得结果集中的数据:
int id = rs.getInt(“id”);
String username = rs.getString(“username”);
String password = rs.getString(“password”);
-
结果集默认的情况下只能向下而且不可以在结果集上进行修改记录.
MYSQL数据库结果集可以滚动.
在Statement被创建的时候:
Statement createStatement(int resultSetType,int resultSetConcurrency);
resultSetType :结果集类型
TYPE_FORWARD_ONLY :结果集只能向下.
TYPE_SCROLL_INSENSITIVE :结果集可以滚动.不允许进行修改结果集
TYPE_SCROLL_SENSITIVE :结果集可以滚动.允许在修改结果集.
resultSetConCurrency :结果集并发策略.
CONCUR_READ_ONLY :结果集不可以修改
CONCUR_UPDATABLE :结果集可以修改.
组合:
** TYPE_FORWARD_ONLY CONCUR_READ_ONLY
TYPE_SCROLL_INSENSITIVE CONCUR_READ_ONLY :结果集可以滚动,但是不可以修改结果集.
TYPE_SCROLL_SENSITIVE CONCUR_UPDATABLE :结果集可以滚动,而且可以修改结果集.
案例:
public void demo2() throws ClassNotFoundException, SQLException {
// 1.加载驱动
Class.forName(“com.mysql.jdbc.Driver”);
// 2.获得连接
Connection conn = DriverManager.getConnection(“jdbc:mysql:///jdbc_db1”,
“root”, “123”);
// 3.执行SQL.
String sql = “select from user”;
ResultSet rs = stmt.executeQuery(sql);
// 直接定位到某一行:
rs.updateString(“username”, “eee
*
// 4.释放资源
rs.close();
stmt.close();
conn.close();
}**
资源的释放是非常重要,我们写的资源释放的代码,是非常不规范!!!
尤其Connection对象是非常稀有!代表的是数据库连接对象.安装MYSQL的数据库时候,MYSQL有最大连接数量.如果达到MYSQL的最大连接数量,而且Connection都没有被释放.其他人连接不到数据库.
如果Connection不能及时,正确关闭.极易导致系统宕机.Connection的使用原则:尽量要晚创建,尽量早释放!!!
资源释放的一段标准代码:
// 4.释放资源.
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null; // 为了让JVM垃圾回收更早回收该对象.
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}**
**
public class JDBCUtils {
private static final String DRIVERCLASS;
private static final String URL;
private static final String USERNAME;
private static final String PASSWORD;
static {
// 解析属性文件:Properties.
/ Properties properties = new Properties();
// 获得代表属性文件的输入流:
// 使用类的加载器获得属性文件的输入流:
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream(
“jdbc.properties”);
// 加载属性文件:
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
DRIVERCLASS = properties.getProperty(“jdbc.driverClass”);
URL = properties.getProperty(“jdbc.url”);
USERNAME = properties.getProperty(“jdbc.username”);
PASSWORD = properties.getProperty(“jdbc.password”);/
// 国际化有关:
DRIVERCLASS = ResourceBundle.getBundle(“jdbc”).getString(“jdbc.driverClass”);
URL = ResourceBundle.getBundle(“jdbc”).getString(“jdbc.url”);
USERNAME = ResourceBundle.getBundle(“jdbc”).getString(“jdbc.username”);
PASSWORD = ResourceBundle.getBundle(“jdbc”).getString(“jdbc.password”);
}
/
注册驱动的方法:
/
public static void loadDriver() {
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/
获得连接的方法
/
public static Connection getConnection() {
Connection conn = null;
try {
// 加载驱动
loadDriver();
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/*
释放资源的代码
*/
public static void release(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}**
DAO:Data Access Object.数据访问对象.
DAO:DAO中封装对数据源的单个操作,需要对外提供一组接口供业务层访问.访问DAO的时候传递一个Java对象.
使用DAO的模式完成CRUD的操作.**
步骤一:创建一个web项目,引入相应的jar包.
mysql的驱动.
jstl的包.
beanutils的包.
步骤二:设计登录页面:登录页面
步骤三:创建包结构:
com.juwins.web.servlet
LoginServlet
com.juwins.service
UserService
com.juwins.dao
UserDao
UserDaoImpl
com.juwins.domain
User
com.juwins.utils
JDBCUtils
步骤四:编写LoginServlet:
接收参数
封装数据
调用业务层类
页面跳转.
步骤五:编写UserService:
调用DAO.
步骤六:编写UserDao.
使用JDBC的操作完成对数据库查询.
步骤七:设计登录成功页面:
**
SQL注入的漏洞在早期互联网中是普遍存在.
* 在用户名地方输入:aaa’
** select from user where username = ‘aaa’ or ‘1=1’ —
select from user where username = ‘
**
* 在地址上上直接输入访问路径.loginServlet?username=aaa’ or ‘1=1
**