mybatis的整合之路


JDBC

一、导包


<dependency>
   <groupId>mysqlgroupId>
   <artifactId>mysql-connector-javaartifactId>
   <version>5.1.47version>
dependency>

二、步骤:

  1. 加载驱动

  2. 用户信息username,password和url

  3. 创建连接

  4. 通过连接获取执行sql的对象,执行sql,处理结果

    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true";
    String username ="root";
    String password ="123456";
    Connection connection = DriverManager.getConnection(url,username,password);
    Statement statement= connection.createStatement();
  5. 释放连接

三、编写配置文件,提取工具类

  1. 将数据库连接的信息写到配置文件db.properties中

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true
    username=root
    password=123456
  2. 提取工具类JdbcUtils

    static{ 
        Properties p = new Properties();
        try {
               properties.load(JdbcUtils.class.getClassLoader()
                              .getResourceAsStream("db.properties"));
               String driver = properties.getProperty("driver");
               String url = properties.getProperty("url");
               String username = properties.getProperty("username");
               String password = properties.getProperty("password");
               Class.forName(driver);
          } catch (IOException e) {
               e.printStackTrace();
               throw new RuntimeException( "读取db.properties失败",e);
          } catch (ClassNotFoundException e) {
                   e.printStackTrace();
                   throw new RuntimeException("找不到这个驱动类",e);
          }
    }
    public static Connection getConnection()throws SQLException {
       return DriverManager.getConnection(url, user, password);
    }
    public static void close(Connection conn) {
       if(conn != null) {
           try {
               conn.close();
          } catch (SQLException e) {
               e.printStackTrace();
               throw new RuntimeException("关闭连接失败",e);
          }
      }
    }

四、增加连接池

1.DBCP

  1. 导包

    <dependency>
     <groupId>commons-dbcpgroupId>
     <artifactId>commons-dbcpartifactId>
     <version>1.4version>
    dependency>

    <dependency>
       <groupId>commons-poolgroupId>
       <artifactId>commons-poolartifactId>
       <version>1.6version>
    dependency>
  2. 编写配置文件

    #连接设置
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true
    username=root
    password=123456
    ?
    #!-- 初始化连接 --
    initialSize=10
    ?
    #最大连接数量
    maxActive=50
    ?
    #!-- 最大空闲连接 --
    maxIdle=20
    ?
    #!-- 最小空闲连接 --
    minIdle=5
    ?
    #!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --
    maxWait=60000
    #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
    #注意:user 与 password 两个属性会被明确地传递,因此这里不需要包含他们。
    connectionProperties=useUnicode=true;characterEncoding=UTF8
    ?
    #指定由连接池所创建的连接的自动提交(auto-commit)状态。
    defaultAutoCommit=true
    ?
    #driver default 指定由连接池所创建的连接的只读(read-only)状态。
    #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
    defaultReadOnly=
    ?
    #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
    #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
    defaultTransactionIsolation=READ_UNCOMMITTED
  3. 重构工具类

    static DataSource dataSource = null;
    static{
        Properties properties = new Properties();
        try {
               properties.load(JdbcUtils.class.getClassLoader()
                              .getResourceAsStream("db.properties"));
              dataSource = BasicDataSourceFactory.createDataSource(properties);
          } catch (Exception e) {
               e.printStackTrace();
               throw new RuntimeException("读取db.properties失败",e);
          }
    }
    /**
    * 由连接池创建的连接,其实现类由连接池提供.
    */
    public static Connection getConnection() throws SQLException {
       return dataSource.getConnection();
    }
    ?
    /**
    * 连接池提供的实现类,其close方法内部逻辑是,
    * 将连接归还给连接池,即它会清空连接对象中的数据,
    * 并且将连接标记为空闲态.
    */
    public static void close(Connection conn) {
       if(conn != null) {
           try {
               conn.close();
          } catch (SQLException e) {
               e.printStackTrace();
               throw new RuntimeException( "归还连接失败", e);
          }
      }
    }

2.C3P0

  1. 导包


    <dependency>
       <groupId>com.mchangegroupId>
       <artifactId>c3p0artifactId>
       <version>0.9.5.5version>
    dependency>

    <dependency>
       <groupId>com.mchangegroupId>
       <artifactId>mchange-commons-javaartifactId>
       <version>0.2.19version>
    dependency>
  2. 编写配置文件

    <?xml version="1.0"  encoding="UTF-8"?>
           <c3p0-config>
           
           <default-config>
    ?
               <property name="driverClass">com.mysql.cj.jdbc.Driverproperty>
               <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&characterEncoding=utf8&uesSSL=true&serverTimezone=UTCproperty>
               <property name="user">rootproperty>
               <property name="password">123456property>
    ?
               <property name="acquiredIncrement">5property>
               <property name="initialPoolSize">10property>
               <property name="minPoolSize">5property>
               <property name="maxPoolSize">20property>
    ?
           default-config>
    ?
    ?
           <name-config name="MySQL">
               <property name="driverClass">com.mysql.cj.jdbc.Driverproperty>
               <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&characterEncoding=utf8&uesSSL=true&serverTimezone=UTCproperty>
               <property name="user">rootproperty>
               <property name="password">123456property>
    ?
               <property name="acquiredIncrement">5property>
               <property name="initialPoolSize">10property>
               <property name="minPoolSize">5property>
               <property name="maxPoolSize">20property>
           name-config>
    ?
           c3p0-config>
  3. 重构工具类

    static DataSource dataSource = null;
    static{
     try{//xml不用读取,会自动匹配
      //创建数据源 工厂模式创建
       dataSource = new ComboPooledDataSource("MySQL");//配置文件写法
    } catch (Exception e) {
           e.printStackTrace();
      }
    }
    /**
    * 由连接池创建的连接,其实现类由连接池提供.
    */
    public static Connection getConnection() throws SQLException {
       return dataSource.getConnection();
    }
    ?
    /**
    * 连接池提供的实现类,其close方法内部逻辑是,
    * 将连接归还给连接池,即它会清空连接对象中的数据,
    * 并且将连接标记为空闲态.
    */
    public static void close(Connection conn) {
       if(conn != null) {
           try {
               conn.close();
          } catch (SQLException e) {
               e.printStackTrace();
               throw new RuntimeException( "归还连接失败", e);
          }
      }
    }

    小结:无论使用什么数据源,本质都是一样的,DataSource接口不变,方法不变。

Mybatis

一、导包


<dependencies>
   
   <dependency>
       <groupId>mysqlgroupId>
       <artifactId>mysql-connector-javaartifactId>
       <version>5.1.47version>
   dependency>
   
   <dependency>
       <groupId>org.mybatisgroupId>
       <artifactId>mybatisartifactId>
       <version>3.5.4version>
   dependency>
dependencies>
?

<build>
  <resources>
      <resource>
          <directory>src/main/javadirectory>
          <includes>
              <include>**/*.propertiesinclude>
              <include>**/*.xmlinclude>
          includes>
          <filtering>falsefiltering>
      resource>
      <resource>
          <directory>src/main/resourcesdirectory>
          <includes>
              <include>**/*.propertiesinclude>
              <include>**/*.xmlinclude>
          includes>
          <filtering>falsefiltering>
      resource>
  resources>
build>

二、步骤

  1. 通过SqlSessionFactoryBuilder获取SqlSessionFactory

  2. 通过SqlSessionFactory 获取SqlSession

  3. 通过SqlSession获取Mapper实现类

    //使用Mybatis第一步 :获取sqlSessionFactory对象
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactoryBuilder bulider = new SqlSessionFactoryBuilder();
    SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  4. 通过Mapper实现类就可以进行增删改查操作。

三、重构步骤

  1. 编写mybatis核心配置文件mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
           PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-config.dtd">

    <configuration>
       <environments default="development">
           <environment id="development">
               <transactionManager type="JDBC"/>
               <dataSource type="POOLED">
                   <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                   <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
                   <property name="username" value="root"/>
                   <property name="password" value="root"/>
               dataSource>
           environment>
       environments>
    configuration>
  2. 编写工具类MybatisUtis

    //sqlSessionFactory --> sqlSession
    public class MybatisUtils {
       static SqlSessionFactory sqlSessionFactory = null;
       static {
           try {
               //使用Mybatis第一步 :获取sqlSessionFactory对象
               String resource = "mybatis-config.xml";
               InputStream inputStream = Resources.getResourceAsStream(resource);
               sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
    ?
       //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例.
       // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
       public static SqlSession getSqlSession(){
           return sqlSessionFactory.openSession();
      }
    }

     

  3. 编写接口UserMapper,UserMapper.xml

    public interface UserMapper {
       public List<User> getUserList();
    }
    <?xml version="1.0" encoding="UTF-8" ?>
           PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    ?

    <mapper namespace="com.kuang.dao.UserDao">
       <select id="getUserList" resultType="com.kuang.pojo.User">
      select * from USER
     select>
    mapper>
  4. 将Mapper添加到mybatis-config.xml中

    <mappers>
       <mapper class="com.kuang.dao.UserMapper"/>
    mappers>

    注意点:

    • 接口和他的Mapper配置文件必须同名

    • 接口和他的Mapper配置文件必须在同一个包下

  5. 测试

    @Test
    public void test(){
    ?
       //1.获取SqlSession对象
       SqlSession sqlSession = MybatisUtils.getSqlSession();
       //2.执行SQL
       // 方式一:getMapper
       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
       List<User> userList = userDao.getUserList();
       for (User user : userList) {
           System.out.println(user);
      }
    ?
       //关闭sqlSession
       sqlSession.close();
    }

Spring

Spring整合Mybatis 三种方式:

  1. SqlSessionTemplate(不常用,了解即可)

  2. SqlSessionDaoSupport(也不常用,了解)

  3. 扫描包(重点)

一、导包


<dependencies>
   
   <dependency>
       <groupId>mysqlgroupId>
       <artifactId>mysql-connector-javaartifactId>
       <version>5.1.47version>
   dependency>
     
   <dependency>
       <groupId>com.mchangegroupId>
       <artifactId>c3p0artifactId>
       <version>0.9.5.5version>
   dependency>
   <dependency>
       <groupId>com.mchangegroupId>
       <artifactId>mchange-commons-javaartifactId>
       <version>0.2.19version>
   dependency>
   
   <dependency>
       <groupId>org.mybatisgroupId>
       <artifactId>mybatisartifactId>
       <version>3.5.4version>
   dependency>
   
   <dependency>
       <groupId>org.mybatisgroupId>
       <artifactId>mybatis-springartifactId>
       <version>2.0.4version>
   dependency>
   <dependency>
       <groupId>org.springframeworkgroupId>
       <artifactId>spring-jdbcartifactId>
       <version>5.2.3.RELEASEversion>
   dependency>
   <dependency>
       <groupId>org.springframeworkgroupId>
       <artifactId>spring-webmvcartifactId>
       <version>5.2.3.RELEASEversion>
   dependency>
   
   
   <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>servlet-apiartifactId>
      <version>2.5version>
   dependency>
   <dependency>
      <groupId>javax.servlet.jspgroupId>
      <artifactId>jsp-apiartifactId>
      <version>2.2version>
   dependency>
   <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>jstlartifactId>
      <version>1.2version>
   dependency>
   
   
   <dependency>
       <groupId>org.aspectjgroupId>
       <artifactId>aspectjweaverartifactId>
       <version>1.9.4version>
   dependency>
dependencies>

<build>
  <resources>
      <resource>
          <directory>src/main/javadirectory>
          <includes>
              <include>**/*.propertiesinclude>
              <include>**/*.xmlinclude>
          includes>
          <filtering>falsefiltering>
      resource>
      <resource>
          <directory>src/main/resourcesdirectory>
          <includes>
              <include>**/*.propertiesinclude>
              <include>**/*.xmlinclude>
          includes>
          <filtering>falsefiltering>
      resource>
  resources>
build>

二、步骤

  1. 在spring配置文件中:读取数据库配置文件

  2. 配置数据源

  3. 配置SQLSessionFactory

  4. 配置扫描Dao接口包

    <beans>

     
      <context:property-placeholder location="classpath:database.properties"/>
    ?
     
     
      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         
          <property name="driverClass" value="${jdbc.driver}"/>
          <property name="jdbcUrl" value="${jdbc.url}"/>
          <property name="user" value="${jdbc.username}"/>
          <property name="password" value="${jdbc.password}"/>
    ?
         
          <property name="maxPoolSize" value="30"/>
          <property name="minPoolSize" value="10"/>
         
          <property name="autoCommitOnClose" value="false"/>
         
          <property name="checkoutTimeout" value="10000"/>
         
          <property name="acquireRetryAttempts" value="2"/>
      bean>
    ?
     
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         
          <property name="dataSource" ref="dataSource"/>
         
          <property name="configLocation" value="classpath:mybatis-config.xml"/>
      bean>
    ?
     
     
      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
         
          <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
         
          <property name="basePackage" value="com.lele.dao"/>
      bean>
    beans>
  5. 通过扫描Dao接口包获取UserMapper实现类

    ApplicationContext ac = new ClassPathXmlApplicationContext( "spring-mybatis.xml");
    UserMapper userMapper = ac.getBean("userMapper", UserMapper.class);
  6. 通过UserMapper实现类就可以进行增删改查操作。

三、 重构步骤

  1. 编写数据库配置文件db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
    jdbc.username=root
    jdbc.password=123456
  2. 编写mybatis核心配置文件mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
     
      <typeAliases>
          <package name="com.lele.pojo"/>
      typeAliases>
      <mappers>
          <mapper resource="com/lele/dao/UserMapper.xml"/>
      mappers>
    configuration>
  3. 编写Spring配置文件spring-mybatis.xml(略)

  4. 编写实体类,UserMapper接口,UserMapper.xml

  5. 将UserMapper.xml关联到mybatis-config.xml中。

  6. 可以直接从Spring容器中获得UserMapper实现类;

  7. 通过UserMapper实现类就可以进行增删改查操作。

    ApplicationContext ac = new ClassPathXmlApplicationContext( "spring-mybatis.xml");
    UserMapper userMapper = ac.getBean("userMapper", UserMapper.class);
    List<User> users = dao.findAll();
    System.out.println(users);

     

SpringBoot

一、导包


<dependencies>
   
   <dependency>
       <groupId>mysqlgroupId>
       <artifactId>mysql-connector-javaartifactId>
       <version>5.1.47version>
   dependency>
   
   <dependency>
       <groupId>org.mybatisgroupId>
       <artifactId>mybatisartifactId>
       <version>3.5.4version>
   dependency>
   
   <dependency>
       <groupId>org.mybatis.spring.bootgroupId>
       <artifactId>mybatis-spring-boot-starterartifactId>
       <version>2.2.0version>
   dependency>
    <dependency>
       <groupId>org.springframework.bootgroupId>
       <artifactId>spring-boot-start-jdbcartifactId>
   dependency>    
dependencies>

二、步骤

  1. 编写springboot配置文件application.yml

    spring:
    datasource:
      username: root
      password: 123456
      url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
      driver-class-name: com.mysql.cj.jdbc.Driver
  2. 编写实体类,UserMapper接口,UserMapper.xml

  3. 在application.xml中配置mybatis

    #整合mybatis
    mybatis:
    type-aliases-package: com.lele.pojo
    mapper-locations: classpath:mybatis/mapper/*.xml
  4. 获取UserMapper实现类

    @autowired
    UserMapper userMapper;
  5. 通过UserMapper实现类就可以进行增删改查操作。

三、扩展

  1. 如何在SpringBoot中添加一个bean,如何绑定数据源。

    //Druid强大之处
    @Configuration
    public class DruidConfig {
       @Bean
       @ConfigurationProperties(prefix = "spring.datasource")//与配置文件DataSource绑定
       public DataSource druidDataSource(){
           return new DruidDataSource();
      }
    }

     

  2.