mybatis的整合之路

2021/12/24 23:37:21

本文主要是介绍mybatis的整合之路,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

JDBC

一、导包

<!--mysql驱动包-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</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-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
    <dependency>
        <groupId>commons-pool</groupId>
        <artifactId>commons-pool</artifactId>
        <version>1.6</version>
    </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. 导包

    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>mchange-commons-java</artifactId>
        <version>0.2.19</version>
    </dependency>
  2. 编写配置文件

    <?xml version="1.0"  encoding="UTF-8"?>
            <c3p0-config>
            <!--
            c3p0的缺省(默认)配置
            如果在代码中ComboPooledDataSource ds=new ComboPooledDataSource();这样写就表示使用的是c3p0的缺省(默认)
            default-config
            -->
            <default-config>
    ​
                <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=true&amp;serverTimezone=UTC</property>
                <property name="user">root</property>
                <property name="password">123456</property>
    ​
                <property name="acquiredIncrement">5</property>
                <property name="initialPoolSize">10</property>
                <property name="minPoolSize">5</property>
                <property name="maxPoolSize">20</property>
    ​
            </default-config>
    ​
    ​
            <name-config name="MySQL">
                <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=true&amp;serverTimezone=UTC</property>
                <property name="user">root</property>
                <property name="password">123456</property>
    ​
                <property name="acquiredIncrement">5</property>
                <property name="initialPoolSize">10</property>
                <property name="minPoolSize">5</property>
                <property name="maxPoolSize">20</property>
            </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>
    <!--mysqlq驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.4</version>
    </dependency>
</dependencies>
​
<!--Maven静态资源过滤-->
<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </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" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <!--configuration核心配置文件-->
    <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&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;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" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    ​
    <!--namespace=绑定一个指定的Dao/Mapper接口-->
    <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>
    <!--mysqlq驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!-- 数据库连接池 -->   
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.5</version>
    </dependency>
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>mchange-commons-java</artifactId>
        <version>0.2.19</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.4</version>
    </dependency>
    <!--spring整合mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    
     <!--Servlet - JSP -->
    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
    </dependency>
    <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.2</version>
    </dependency>
    <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
    </dependency>
    
    <!--Spring AOP-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
</dependencies>
<!--Maven静态资源过滤-->
<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
   </resources>
</build>

二、步骤

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

  2. 配置数据源

  3. 配置SQLSessionFactory

  4. 配置扫描Dao接口包

    <beans>
    <!-- 配置整合mybatis -->
       <!-- 1.关联数据库文件 -->
       <context:property-placeholder location="classpath:database.properties"/>
    ​
       <!-- 2.数据库连接池 -->
       <!--数据库连接池
           dbcp 半自动化操作 不能自动连接
           c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
       -->
       <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}"/>
    ​
           <!-- c3p0连接池的私有属性 -->
           <property name="maxPoolSize" value="30"/>
           <property name="minPoolSize" value="10"/>
           <!-- 关闭连接后不自动commit -->
           <property name="autoCommitOnClose" value="false"/>
           <!-- 获取连接超时时间 -->
           <property name="checkoutTimeout" value="10000"/>
           <!-- 当获取连接失败重试次数 -->
           <property name="acquireRetryAttempts" value="2"/>
       </bean>
    ​
       <!-- 3.配置SqlSessionFactory对象 -->
       <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
           <!-- 注入数据库连接池 -->
           <property name="dataSource" ref="dataSource"/>
           <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
           <property name="configLocation" value="classpath:mybatis-config.xml"/>
       </bean>
    ​
       <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
       <!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
       <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
           <!-- 注入sqlSessionFactory -->
           <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
           <!-- 给出需要扫描Dao接口包 -->
           <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" ?>
    <!DOCTYPE configuration
           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>
    <!--mysqlq驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.4</version>
    </dependency>
    <!--mybatis-spring 整合包-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-start-jdbc</artifactId>
    </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.  

 



这篇关于mybatis的整合之路的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程