JavaSE之JDBC数据库连接

JavaSE之JDBC数据库连接


一、JDBC连接数据库

1.JDBC

  (1)JDBC:是Java 访问数据库的标准规范,操作数据库需要使用具体的实现类,也就是数据库驱动。
    我们只需要会调用JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。

  (2)好处:
    1)开发访问数据库的程序,只需要会调用JDBC 接口中的方法,不用关注类是如何实现的。
    2)使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库。

  (3)使用到的包:
    java.sql:所有与JDBC访问数据库相关的接口和类。
    javax.sql:数据库扩展包,提供数据库额外的功能。
    数据库的驱动:由各大数据库厂商提供,是对 JDBC 接口实现的类。

  (4)JDBC的核心API:
    DriverManager类:管理和注册数据库驱动,得到数据库连接对象。
    Connection接口:数据库连接,可用于获取Statement的子类对象。
    Statement接口:SQL语句提交工具,用于将SQL语句发送给数据库服务器。
    PreparedStatemen接口:较安全的执行SQL 语句的对象,是 Statement的子接口。
    ResultSet接口:用于封装数据库查询的结果集,返回给客户端Java 程序。

  (5)注意事项:从JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。

2.JDBC连接与使用数据库的过程

  (1)导入驱动jar包

  (2)加载和注册驱动

		Class.forName("com.mysql.jdbc.Driver") ;

  (3)获取数据库连接对象
    java.sql 类 DriverManager :驱动管理类(就是JDBC驱动服务)
    public static Connection getConnection(String url, String user,String password)
    url:统一资源定位符号:是链接的具体哪个数据库名
    user:数据库的用户名
    password:数据库的密码

		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456") ;

  (4)准备sql语句
    操作mydb里面账户表;account

		String sql = "update account set balance = balance + 500 where id= 1" ; 	

  (5)通过数据库连接对象Cononection获取执行对象java.sql.Statement: 执行静态sql语句
    Statement createStatement():创建执行对象并将sql准备发送数据库中。

		Statement stmt = conn.createStatement() ;

  (6)执行sql:执行对象Statement
    执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句
    int executeUpdate(String sql)

		int count = stmt.executeUpdate(sql) ;

    select语句
    ResultSet executeQuery(String sql)

		 ResultSet rs=stmt.executeQuery(sql);

  (7)处理结果:

		返回值:
			int :影响的行数
				System.out.println("影响了"+count+"行");
			ResultSet:查询到的记录,返回结果集。
				将结果集封装到实体对象中

  (8)释放资源

		rs.close();
		stmt.close();
		conn.close();

  (9)过程中的注意事项:
    1)在编写 DML 语句时,包裹字符串参数的符号是单引号 ‘值’。
    2)DML语句:增删改时,返回受影响行数(int 类型)。
    3)DQL语句:查询时,返回结果数据(ResultSet 结果集)。
    4)释放资源时遵循先开后关原则,释放所使用到的资源对象。

3.DriverManager类

  (1)DriverManager 作用:
    1) 管理和注册驱动
    2) 创建数据库的连接
  (2)方法:DriverManager类中的静态方法
    Connection getConnection(String url,String user,String password)
    作用:通过连接字符串,用户名,密码来得到数据库的连接对象。

    Connection getConnection (String url, Properties info)
    作用:通过连接字符串,属性对象来得到连接对象。

  (3)JDBC 连接数据库的四个参数:
    用户名:登录数据库管理系统的用户名。
    密码:登录数据库管理系统的密码。
    URL:不同的数据库URL是不同的,
    驱动类的全限定名:com.mysql.jdbc.Driver;

  (4)连接数据库的URL地址格式:
    协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值
    mysql的写法:jdbc:mysql://localhost:3306/数据库[?参数名=参数值]

  (5)Mysql的简写格式
    前提:必须是本地服务器,端口号是 3306 。
    jdbc:mysql:///数据库名

  (6)如果数据库出现乱码,可以指定参数: ?characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据。

4.Connection 接口

  (1)作用:连接数据库对象。

  (2)方法:
    Statement createStatement()
    作用:创建一个SQL 语句执行对象。

    PreparedStatement prepareStatement(String sql)
    作用:创建一个指定预编译的SQL 语句,SQL语句中使用占位符”?”,的sql语句执行对象。

5.Statement

  (1)作用:sql语句执行对象,用于发送 SQL 语句给服务器,用于执行静态SQL语句,并返回结果。

  (2)缺点:存在字符串拼接,造成sql注入。

  (3)方法:
    int executeUpdate(String sql)
    作用:发送 DDL/DML 语句,实现增删改的操作。
    参数:SQL 语句
    返回值:返回对数据库影响的行数。

    ResultSet executeQuery(String sql)
    作用:发送 DQL 语句,执行查询的操作。
    参数:SQL 语句
    返回值:查询的结果集。

6.ResultSet 接口

  (1)作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。

  (2)方法:
    boolean next()
    作用:游标向下移动1行,判断当前指向的记录是否还有下一条记录。
    返回值:如果还有下一条记录,返回 true,否则返回 false。

    数据类型 getXxx()
      1)通过字段名获取对应列的数据,参数是 String 类型。
      2)通过列号获取对应列的数据,参数是整数,从 1 开始。

  (3)注意事项:
    1)如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set。
    2)如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set。
    3)使用完毕以后要先关闭结果集ResultSet,再关闭 Statement,再关闭 Connection。

7.PreparedStatement

  (1)描述:是Statement接口的子接口,继承于父接口中所有的方法。它是一个预编译的SQL语句执行对象。
    通过连接对象获取预编译对象的同时将参数化的sql发送数据库进行预编译。

  (2)优点:
    1)因为有预先编译的功能,提高SQL的执行效率。
    2)可以有效的防止SQL注入的问题,安全性更高。
    3)提高了程序的可读性。

  (3)方法:
    int executeUpdate()
    作用:执行 DML增删改的操作,返回影响的行数。

    ResultSet executeQuery()
    作用:执行 DQL查询的操作,返回结果集。

  (4)使用PreparedStatement 的步骤:
    1)编写 SQL语句,未知内容使用’?'占位:

			"SELECT * FROM user WHERE name=? AND password=?"; 

    2)获得 PreparedStatement对象;
    3)设置实际参数:setXxx(占位符的位置, 真实的值);
    4)执行参数化 SQL 语句;
    5)关闭资源。
  (5)注意:
    在使用参数化sql时,将需要设置参数,且与参数相连接的这段sq看做一个 整体。
    这个整体将作为一个占位符位置,将这段sql与参数直接拼接,作为参数。

8.JDBC事务的处理

  (1)Connection接口中与事务有关的方法
    void setAutoCommit(boolean autoCommit)
    参数:true 或 false
    作用:如果设置为 false,表示关闭自动提交,相当于开启事务。

    void commit()
    作用:提交事务

    void rollback()
    作用:回滚事务

  (2)步骤
    1)获取连接 。
    2)开启事务 。
    3)获取到PreparedStatement 。
    4)使用 PreparedStatement执行两次更新操作 。
    5)正常情况下提交事务,提交事务方法在try语句末尾。
    6)出现异常回滚事务,回滚事务在catch语句中。
    7)最后关闭资。

9.数据库连接池

  (1)概念:其实就是一个容器(集合),存放数据库连接的容器。
    当数据库连接池被创建,其中会申请一些连接对象。
    当需要访问数据库时,从容器中获取连接对象,访问完之后,会将连接对象归还给容器。

  (2)好处:
    节约资源
    访问高效

  (3)实现:
    标准接口:javax.sql.DataSource包下,物理数据源对象,代替了DriverManager。
    方法:
      获取连接:getConnection()
      归还连接:Connection对象.close()。
    如果连接Connection对象是从连接池中获取的,那么调用close() 方法,则不会再关闭连接了,而是归还连接。

  (4)常见数据库连接池
    C3P0:数据库连接池技术 。
    Druid:数据库连接池实现技术,由阿里巴巴提供 。

  (5)C3P0:数据库连接池技术
    步骤:
    1)导入两个jar包,以及数据库驱动jar包
      c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
    2)定义配置文件:
      名称:c3p0.properties 或者 c3p0-config.xm。
      路径:直接将文件放在src目录下即可。
      配置文件的内容:
        基本参数
          driverClass:数据库驱动实现
          jdbcUrl 连接特定的数据库
          user用户名
          password 密码
        连接池的参数信息
          initialPoolSize :初始化连接数量
          maxPoolSize:最大连接数量
          checkoutTimeout:超时时间,单位为毫秒,如果超过最大连接数量,在指定时间连接不上,就会报错。

    3)创建核心对象数据库连接池对象:ComboPooledDataSource

			DataSource ds = new ComboPooledDataSource();

    4)获取连接:getConnection()

			Connection conn = ds.getConnection(); 

  (6)Druid:数据库连接池实现技术,由阿里巴巴提供的 。

  (7)优点:
    连接速度很快。
    可以更有效的监控sql语句,查询语句的耗时以及并发时间。

  (8)步骤:
    1)导入jar包 druid-1.0.9.jar
    2)定义配置文件:
      任意名称且后缀为”.properties”的文件,可以放在任意目录下。
      配置文件的内容:

        基本参数
          driverClassName=com.mysql.jdbc.Driver
          url=jdbc:mysql://localhost:3306/mydb_02
          username=root
          password=123456

        连接池的默认配置信息
          initialSize=5 初始化连接数量5
          maxActive=10 最大激活数量10个
          maxWait=3000 最大的等待时间

    3)加载配置文件。

			Properties pps=new Properties();
			pps.load(所在类.class.getClassLoader().getResourceAsStream(“.properties配置文件”));

    4)获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
      public static DataSource createDataSource(Properties properties);
      创建物理数据源对象

			 DruidDataSourceFactory.createDataSource(pps)。

    5)获取连接:getConnection()

10.定义数据库连接工具类

  传统连接方式
    (1)定义一个类 JDBCUtils ,私有化无参构造。
    (2)声明配置文件中各属性的成员变量。
    (3)在静态代码块中读取配置文件中的内容,赋值给相应变量。
    (4)注册驱动。
    (5)定义获取Connection对象的静态方法。
    (6)定义关闭资源的方法。

  连接池方式
    (1)定义一个类 JDBCUtils ,私有化无参构造。
    (2)提供静态代码块加载配置文件,初始化连接池对象 。
    (3)定义获取连接池对象的方法。
    (4)定义获取连接对象方法:通过数据库连接池获取连接对象。
    (5)定义释放资源的方法。

  DbUtils工具类:
    (1)apache提供的开源类库: 对jdbc简单封装的工具类。
    (2)核心jar包:commons-dbutils-1.7.jar。
    (3)使用步骤:
      1)导入包
      2)执行对象:

				QueryRunner qr=new QueryRunner(DataSource ds);

      3)准备sql : 参数化的sql

				String sql=”insert into user(name,gender,address) values(?,?,?)”;

      4)执行sql语句
        DDL/DML语句使用:update(String sql,Object…parameters)。
          参数2:是对占位符所对应的参数进行赋值的数组。
        DQL语句使用:query(String sql,
          ResultSetHandler<?> rs,Object …parame)。

        ResultSetHandler:结果集的处理程序接口
        实现类:
          需要将查询的某条记录封装成对象:
            BeanHandler<?>(Class<?> c)。
          需要将查询的多条记录(查询所有)封装到List集合中 :
            BeanListHandler<?>(Class<?> c)
          查询的单行单列的数据:查询总记录数
            ScalarHandler<>()。

二、其他知识点

1.测试:

  (1)分类:黑盒测试和白盒测试。

  (2)黑盒测试:不考虑内部结构以及逻辑结构,适用于功能性测试。

  (3)白盒测试:知道当前逻辑结构以及内部结构,通过编写代码、设置参数检测某个业务是否存在漏洞。

  (4)单元测试:白盒测试的一种,针对某个业务测试,使用单元测试,单元测试需要用到Jutil.jar包。

  (5)用到的方法和注解
    Assert:断言 :期望值和实际值是否匹配,如果不匹配 单元测试失败。
    Assert.assertEquals(expected, actual);
      expected:期望值。
      actual:实际值。

    @Before :在执行单元测试之前优先执行这个方法。
    应用:环境的加载,某些数据的初始化。

    @Test:测试被标记的方法(单元)。

    @After:在执行单元测试方法之后执行。
    应用:处理临时数据释放资源。

2.MVC设计理念

  (1)MVC
    Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
       通常模型对象负责在数据库中存取数据。

    View(视图)是应用程序中处理数据显示的部分。
       通常视图是依据模型数据创建的。

    Controller(控制器)是应用程序中处理用户交互的部分。
       通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

  (2)MVC三层架构
    表示层:
      命名:XXXView
      职责:收集用户的数据和需求、展示数据。
    业务逻辑层:
      命名:XXXServiceImpl
      职责:数据加工处理、调用DAO完成业务实现、控制事务。
    数据访问层:
      命名:XXXDaoImpl
      职责:向业务层提供数据,将业务层加工后的数据同步到数据库。

  (3)流程:视图层------->控制层-------->业务层------->数据库访问层
    数据库访问层得到结果后向上逐层返回。

    首先,客户点击JSP页面上的内容浏览器发送请求,请求到Controller控制器模块,也就是Servlet服务器中。

    Servlet服务器通过分析请求,判断客户的需求,然后将需求交给Model 模型的Service层。

    service层根据业务需求调用Dao层,对数据库进行增删改查操作。

    然后Dao层将操作结果提交给service层。

    service层将业务处理结果提交给Servlet层。

    Servlet层将数据驱动到View视图层也就是JSP页面中。

    JSP页面响应给浏览器,客户看到动态的内容。
  (4)三层架构项目搭建

    utils 存放工具类(DBUtils)
    entity 存放实体类(Person)
    dao 存放 DAO 接口(PersonDao)
    impl 存放 DAO 接口实现类(PersonDaoImpl)
    service 存放 service 接口(PersonService)
    impl 存放 service 接口实现类(PersonServiceImpl)
    view 存放程序启动类(main)

  (5)程序设计时,考虑易修改、易扩展,为Service层和DAO层设计接口, 便于未来更换实现类。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值