JDBC演变过程

JDBC

概述

JDBC:Java DataBase Connectivity ,JAVA数据库连接技术
1. 它是一组接口,我们的程序是面向接口开发
2. 不需要关注具体的实现细节,驱动程序由数据库厂商提供
那么通过什么连接数据的呢?主要是由4个核心接口和类实现的
名称作用
DriverManager 类与数据库进行连接
Connection接口数据库的连接对象
Statement 接口用于发送给数据库sql语句
RestSet接口接收从数据库获得的数据
具体咋用呢?如下伪代码所示
public void name(){
//与数据库建立连接,4个参数,Driver、url、username、password。
//Driver,表示连接mysql数据库
String driver = com.mysql.jdbc.Driver;
//url,表明数据库的位置,协议:子协议//主机:端口/库名?xxx各种参数
String url = "jdbc:mysql//localhost:3306/xxx?xxx";
//数据库账号
String username = xxx;
//数据库密码
String password = xxx;
//获取连接对象
Connection con = DriverManager.getConnection(url, username, password);
//编写sql语句并发送
String sql = "xxx";
Statement sta = con.createStatement();
ResultSet result = sta.excute(sql);
//获取返回结果并处理
while(rs.next()) {
	Xxx xx = rs.getXxx("字段名称");
}
}

JDBC事务

数据库的事务是非常重要的
1.获取连接
2.开启事务
3.创建statement对象
4.创建sql并发送
5.执行成功提交事务
6.执行失败回滚事务
7.关闭资源
public void xxx(){
Statement sta = null;
try{
Connection con = DriverManager.getConnection(url, username, password);
//开启事务
con.setAutoCommit(false);  //false为手动提交
String sql = "xxx";
sta = con.createStatement();
con.commit();			//提交事务
} catch (Exception e){
con.rollback();			//回滚事务
}
ResultSet result = sta.excute(sql);
while(rs.next()) {
	Xxx xx = rs.getXxx("字段名称");
}
xxx.close()
}

PreparedStatement接口可代替statement接口,有预编译功能,防止sql注入

Mybatis

在JDBC可见大量请求的话,要建立多次连接,大量重复代码,因此提取一个JDBCUtils
但是每次创建连接释放及其浪费时间,所以就有一个JDBC连接池,引入一个容器存放连接,使用完放回容器即可

Datasource

Datasource本身是一个接口,具体的实现由厂商去实现,常见的有Druid(阿里), DBCP(Apache),c3p0
连接池需要配置几个参数,driver,url,username,password,初始连接数,最大连接数,最长等待时间
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
    <!-- 默认配置 -->
    <default-config>
        <!--数据库连接参数-->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/day17</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!--连接池配置参数-->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">3000</property>
    </default-config>

    <!--命名配置-->
    <named-config name="otherc3p0">
        <!--数据库连接参数-->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/day17</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!--连接池配置参数-->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">15</property>
        <property name="checkoutTimeout">3000</property>
    </named-config>
</c3p0-config>

连接池的使用实例

public void xxx(){
	Datasource db = new ComboPooledDataSource("otherc3p0");
	Connection con = db.getConnnection();
	con.close();//归还到连接池
}

mybaits是属于软件三层架构(视图层,业务层,持久层)中的持久层框架,用于处理数据,运用了datasource技术,更进一步的简化了开发
Mybatis的ORM(Object Relational Mapping)对象关系映射

1.xml
2.注解

Mybatis的使用

1.环境搭建,导包,建表,创建实体类,创建dao/service/web包结构

2.导入核心配置文件,日志
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="default">
        <!--环境变量-->
        <environment id="default">
            <!--事务管理器:由JDBC管理事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源配置信息:POOLED 使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/xxx"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="com/itheima/dao/UserMapper.xml"/>
    </mappers>
</configuration>
<--关键在于核心配置文件, Datasource, 扫描映射文件-->
3.创建usermapper接口,创建用户映射文件xml
public interface UserMapper {
    /**
     查询所有的用户
     */
    List<User> findAllUsers();
}
<mapper namespace="com.itheima.dao.UserMapper">
    <!--
    查询语句
    id: 接口中方法的名字
    resultType:返回的实体类的类型,类全名
    -->
    <select id="findAllUsers" resultType="com.itheima.entity.User">
        select * from user
    </select>
</mapper>
4.测试
需要一个会话,相当于一个connection连接
	1.通过resuorce获取流加载核心配置文件
	2.获取SqlSessionFactoryBuilder 会话工厂建造类,临时类,创建会话工厂
	3.获取SqlSessionFactory会话工厂,可以加载配置文件创建会话工厂,一般只需要创建一个
	4.创建会话SqlSession
	5.通过会话的getMapper方法动态代理xxxMapper.class,获得对象mapper
	6.mapper调用方法返回结果
	7.关闭会话
public void xxx()
{
//1.通过Resources获取流加载核心配置文件
InputStream is = Resources.getResourceAsStream("sqlConfig.xml");
//2.获取SqlFactoryBuilder 会话工厂建造类,临时类,创建会话工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.获取SqlFactory会话工厂,可以加载配置文件创建会话工厂,一般只需要创建一个
SqlSessionFactory sessionFactory = builder.build(is);
//4.创建会话SqlSession
SqlSession session = sessionFactory.openSeesion(true);  //默认是true,自动提交事务
//5.通过会话的mapper方法加载xxxMapper.class
Object ob = session.xxx(xxxMapper.class);
//6.获取返回结果
System.out.println(ob);
//7.关闭会话
session.close;
}

使用mybais的处理事务,在openSession(false)处传入false表示手动提交事务,开启会话并打开事务,session.commit提交事务,必须手动提交,不然就自动回滚

Spring整合Mybatis

Spring整合mybatis主要是在SSM框架中为了统一
因为Spring当中的IOC容器概念,所以将mybatis中的使用进一步的简化,我们只需要关注sql的编写就可以了
主要是将SqlSessionFactory类交给IOC容器管理,再也工具类了
Mybatis的配置文件

1.数据源
2.扫描映射器接口文件Mapper接口,动态代理创建对象
3.事务管理
4.将SqlSessionFactoryBean放入IOC容器(取别名,扫描mapper.xml存放位置,数据源)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

    <!--1 引入属性文件,在配置中占位使用 -->
    <context:property-placeholder location="classpath*:jdbc.properties" />

    <!--2 配置一个Spring提供的数据源 :jdbc数据源,创建一个驱动管理数据源的bean -->
    <bean id="jdbcDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
    
    <!--3 会话工厂bean sqlSessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="jdbcDataSource"></property>
        <!-- 别名 -->
        <property name="typeAliasesPackage" value="com.zr.activiti.entity"></property>
        
        <!-- sql映射文件路径 -->
        <!-- 扫描mappers目录以及子目录下的所有xml文件 -->
        <property name="mapperLocations" value="classpath:mybatis/mappers/**/*.xml" />
    </bean>
    
    <!--4 自动扫描对象关系映射 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 -->
        <!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> -->
        <!-- basePackage 属性是让你为映射器接口文件设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径 -->
         <property name="basePackage" value="com.zr.workflow.activiti.dao,com.zr.workflow.springdemo.dao" />
    </bean>
    
    <!--5 声明式事务管理 -->
    <!--定义事物管理器,由spring管理事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="jdbcDataSource"></property>
    </bean>
    
    <!--支持注解驱动的事务管理,指定事务管理器 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

事务管理,在service方法上加@Transactional()即可,配置事务的隔离级别以及传播行为
注入XxxMapper即可调用方法,及其简单

Springboot整合mybatis

spring整合mybatis已经很简单了,为什么还需要springboot呢???
因为springboot的零xml,着实让人心动,极大的简化了开发
那么在springboot中使用mybatis的步骤是什么呢??

1.导入依赖
2.application.yml中配置数据源,实体类取别名即可
3.在启动类MapperScan("mapper.class所在包")
4.使用mapper

事务管理,在service方法上加@Transactional()即可,配置事务的隔离级别以及传播行为

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值