l JDBC

**

**

JDBC:(Java DataBase Connectivity Java数据库连接).
* 是一种用于执行SQL语句的Java 的API.可以为多种关系型数据库提供统一的访问.它是由一组使用Java语言编写的类或接口组成.

JDBC功能主要就是使用Java语言连接到数据库.

任意一个应用:
学生选课:
ERP
OA:
系统都需要与数据库进行交互.都需要使用JDBC.

驱动:两个设备之间的通信桥梁.
Java语言要连接数据库必须使用数据库的驱动.
各个数据库的生产商提供数据库的驱动.使用Java连接各种数据库.需要了解各个数据库的驱动.增加Java程序员压力.
SUN公司与各个数据库生产商协商.由SUN公司提供一套统一的规范.由各个数据库的生产商提供这套规范的实现.
SUN公司提供了一组接口.各个数据库生产商提供了这套接口的实现.(这组规范就是JDBC规范.)

**

步骤1:搭建开发环境,引入数据库的驱动.
步骤2:在程序中加载数据库驱动.
步骤3:获得数据库连接.
步骤4:编写SQL.执行SQL.
步骤5:释放资源.

  1. 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()
图片.png
创建Statement对象.
图片.png
创建PreparedStatement对象.对SQL进行预编译.(防止SQL注入的漏洞.)
图片.png
创建CallableStatement.用来执行数据库中存储过程.

二、进行事务的管理:
图片.png
设置事务不自动提交.
图片.png
事务提交.
图片.png
事务回滚.

Statement对象由Connection对象创建的.代表是可以运行SQL的类.
主要有两个作用:
一、执行SQL语句.
图片.png
执行查询语句.执行select语句.返回了一个ResultSet对象.代表查询结果的表格数据.
图片.png
执行更新语句.执行update、insert、delete语句的时候.返回int类型数据.int类型的数据代表的是影响的行数.
图片.png
执行SQL语句.执行select、insert、update、delete语句.返回的是boolean值.如果返回的结果为ResultSet.那么boolean值为true.如果返回的是更新的记录数.那么boolean就为false.

二、执行批处理.
图片.png
将SQL添加到批处理中.
图片.png
清空批处理.
图片.png
执行批处理.

ResultSet对象由Statement对象中executeQuery(String sql);返回的.ResultSet对象代表的是select查询后的结果.
在ResultSet内部维护了一个指向表格数据行的游标Cursor,初始化时候,游标在第一行之前的位置.调用ResultSet中next()方法.可以使游标指向具体的数据行,进而调用方法获得该行的数据.
方法:
图片.png
向下移动光标.
图片.png
获得结果集中整形数据.
图片.png
获得结果集中字符串类型的数据:
图片.png
图片.png


遍历结果集:
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”);

  • if(rs.next()){

    }

    结果集默认的情况下只能向下而且不可以在结果集上进行修改记录.
    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
**