1. 说明:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

什么意思,看下例子,原生的jdbc案例:

//STEP 1. Import required packages
import java.sql.*;public class FirstExample {// JDBC driver name and database URLstatic final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  static final String DB_URL = "jdbc:mysql://localhost/emp";//  Database credentialsstatic final String USER = "root";static final String PASS = "123456";public static void main(String[] args) {Connection conn = null;Statement stmt = null;try{//STEP 2: Register JDBC driverClass.forName("com.mysql.jdbc.Driver");//STEP 3: Open a connectionSystem.out.println("Connecting to database...");conn = DriverManager.getConnection(DB_URL,USER,PASS);//STEP 4: Execute a querySystem.out.println("Creating statement...");stmt = conn.createStatement();String sql;sql = "SELECT id, first, last, age FROM Employees";ResultSet rs = stmt.executeQuery(sql);//STEP 5: Extract data from result setwhile(rs.next()){//Retrieve by column nameint id  = rs.getInt("id");int age = rs.getInt("age");String first = rs.getString("first");String last = rs.getString("last");}//STEP 6: Clean-up environmentrs.close();stmt.close();conn.close();}catch(SQLException se){//Handle errors for JDBCse.printStackTrace();}catch(Exception e){//Handle errors for Class.forNamee.printStackTrace();}finally{//finally block used to close resourcestry{if(stmt!=null)stmt.close();}catch(SQLException se2){}// nothing we can dotry{if(conn!=null)conn.close();}catch(SQLException se){se.printStackTrace();}//end finally try}//end trySystem.out.println("There are so thing wrong!");
}//end main
}//end FirstExample

原生的jdbc 代码阅读困难, 耦合性强,复用能力查,设计模式粗糙。为了将这个过程格式化或者说是模板话,便出来了好多工具。

例如:DBUtil, Mybaitis, Hibernate

接下来我们就介绍下Mybatis的使用方式。

1. 项目依赖:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version>
</dependency>

2. 引用:

使用Mybaits 分为两步:

  1. 获取 SqlSessionFactory
  2. 获取 SqlSession
  3. 获取数据、执行更新。

简单吧。

2.1 从xml中获取 SqlSessionFaction:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

这里需要解释下 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
  • environments :
    表示环境配置。
    在实际开发中,我们通常有多个环境,例如开发环境(development)、测试环境(test)、生产环境(production)等,不同的环境的配置都是不同的。
    因此在environments元素中,可以配置多个表示具体某个环境的environment子元素。
    而default属性用于指定默认的环境。

  • transactionManager:
    事务管理器,属性type取值有2个,JDBC|MANAGED。
    其中:JDBC表示任何对数据库的修改操作,mybatis都会自动开启事务。
    这里配置的是MANAGED,表示事务由应用程序来控制,也就是我们需要手动的开启事务和提交事务。
    和spring整合时,开启和提交事务的操作交由spring来管理。

  • datasource :
    表示数据源配置。这个更好理解,因为不同的环境中,我们访问的数据库url、username、password都是不同的,因此在每个environment元素下面都有一个dataSource配置。
    属性type表示使用的数据源类型,取值有三个:UNPOOLED|POOLED|JNDI,
    这里指定POOLED,表示使用mybatis自带的PooledDataSource。
    而dataSource内部通过property元素配置的属性,都是PooledDataSource支持的。
    注意不同的数据源实现,可以配置的property是不同的。

  • mappers :
    表示映射文件列表,前面提到通常我们针对数据库中每张表,都会建立一个映射文件。
    而在mappers元素中,就通过mapper元素,列出了所有配置文件的路径。例如mapper元素可以通过以下属性指定映射文件的路径:
    resource属性:表示映射文件位于classpath下。例如上面的配置中就表示在classpath的mappers目录下,有一个UserMapper.xml映射文件
    url属性:使用完全限定资源定位符指定映射文件路径,如file:///var/mappers/uthorMapper.xml
    class属性:通过java类来配置映射关系,可以一个java映射类对应一个xml映射文件
    package:如果有多个java映射类,且位于同一个包下面,我们可以直接使用package属性指定包名,不需要为每个java映射配置一个class属性。

如何引用第三方 Datasource :

开源社区有不少优秀的DataSource 我们可以使用, 解锁的正确方式是:

<dataSource type="com.test.mysite.common.MyselfDefineDataSourceFactory"><property name="driverClass" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/site-aliyun"/><property name="username" value="root"/><property name="password" value="123456"/>
</dataSource>
package com.test.mysite.common;import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;import com.alibaba.druid.pool.DruidDataSource;public class MyselfDefineDataSourceFactory extends UnpooledDataSourceFactory {public MyselfDefineDataSourceFactory() {this.dataSource = new DruidDataSource();}
}
2.2 在代码中构建SqlSessionFaction:
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();        // 获取 DataSource
TransactionFactory transactionFactory = new JdbcTransactionFactory();     // jdbc transaction
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

这种方式也是简单快捷.

获取 SqlSession 的方式:

当拿到 SqlSessionFactory 之后,便可以拿到 SqlSession,每次使用完之后必须关闭:

SqlSession session = sqlSessionFactory.openSession();
try {Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {session.close();
}

每次都要 close , 代码看上去不美观,作者也很烦呀, 看到在mybatis-spring中有一个使用代理实现自动close的 SqlSession 子类SqlSessionTemplate解决了这一问题,但是在纯种mybatis中,还是没有较好的解决办法,继续烦恼中(mybatis拿到的session实体为:DefaultSqlSession)

3. 实例

在文章最后贴出作者封装的 SqlSessionFactory 构造类:

配置信息:

# 数据库连接池
datasource {driver : "org.h2.Driver",url : "jdbc:h2:mem:testDB",userName : "test",passWord : "test",connect-init-size : 5,connect-min-size : 2,connect-max-size : 10
}

封装类:

package com.mobvista.dataplatform.cluster.common;import com.mobvista.dataplatform.cluster.dao.UserDefineActionMapper;
import com.mobvista.dataplatform.cluster.dao.cluster.ClusterMessageMapper;
import com.mobvista.dataplatform.cluster.dao.cluster.InstanceMessageMapper;
import com.mobvista.dataplatform.cluster.dao.cluster.InstanceStrategyMapper;
import com.mobvista.dataplatform.cluster.dao.security.SecurityMessageMapper;
import com.typesafe.config.Config;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;import javax.sql.DataSource;/**** <pre>*     数据库查询工具* </pre>* @user : saligia* @date : 2018-08-23*/
public class QueryManager {private static final String DATASOURCE_DRIVER = "driver";private static final String DATASOURCE_URL = "url";private static final String DATASOURCE_USER = "userName";private static final String DATASOURCE_PASSWD = "passWord";private static final String DATASOURCE_INIT_SIZE = "connect-init-size";private static final String DATASOURCE_MIN_SIZE = "connect-min-size";private static final String DATASOURCE_MAX_SIZE = "connect-max-size";private static final String DEVELOPMENT = "development";private DataSource dataSource = null;private SqlSessionFactory sqlSessionFactory = null;private static QueryManager queryManager = null;private QueryManager(){throw new IllegalArgumentException("invalid data config error");}private QueryManager(Config dataConfig) {initDataSource(dataConfig);initSQLSessionFaction();}/*** <pre>*   初始化数据库连接池* </pre>** @param dataConfig 数据库配置信息*/private void initDataSource(Config dataConfig){BasicDataSource dataSource = new BasicDataSource();if (!dataConfig.hasPath(DATASOURCE_DRIVER)){throw new IllegalArgumentException("Init datasource error : driver invalid");}dataSource.setDriverClassName(dataConfig.getString(DATASOURCE_DRIVER));if(!dataConfig.hasPath(DATASOURCE_URL)){throw new IllegalArgumentException("Init datasource error : url invalid");}dataSource.setUrl(dataConfig.getString(DATASOURCE_URL));if(!dataConfig.hasPath(DATASOURCE_USER)){throw new IllegalArgumentException("Init datasource error : user invalid");}dataSource.setUsername(dataConfig.getString(DATASOURCE_USER));if(!dataConfig.hasPath(DATASOURCE_PASSWD)){throw new IllegalArgumentException("Init datasource error : passwd invalid");}dataSource.setPassword(dataConfig.getString(DATASOURCE_PASSWD));if(dataConfig.hasPath(DATASOURCE_INIT_SIZE)){dataSource.setInitialSize(dataConfig.getInt(DATASOURCE_INIT_SIZE));}if(dataConfig.hasPath(DATASOURCE_MIN_SIZE)){dataSource.setMinIdle(dataConfig.getInt(DATASOURCE_MIN_SIZE));}if(dataConfig.hasPath(DATASOURCE_MAX_SIZE)){dataSource.setMaxActive(dataConfig.getInt(DATASOURCE_MAX_SIZE));}this.dataSource = dataSource;}/*** <pre>*     初始化 SQLSession* </pre>** @param*/private void initSQLSessionFaction(){TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment(DEVELOPMENT, transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.setMapUnderscoreToCamelCase(true);configuration.addMapper(ClusterMessageMapper.class);configuration.addMapper(InstanceMessageMapper.class);configuration.addMapper(InstanceStrategyMapper.class);configuration.addMapper(SecurityMessageMapper.class);configuration.addMapper(UserDefineActionMapper.class);this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);}/*** <pre>*     构建 QueryManager 过程* </pre>** @param dataSource 数据库连接池配置信息*/public static QueryManager createQueryManager(Config dataSource){if(queryManager == null){queryManager = new QueryManager(dataSource);}return  queryManager;}/*** <pre>*     获取 sql 执行session*     -----------------------*     使用结束后必须 close* </pre>** @param*/public SqlSession getSession(){return sqlSessionFactory.openSession(true);}public DataSource getDataSource(){return this.dataSource;}}

另附 :

数据库连接池:数据库连接池原理详解与自定义连接池实现 - CSDN博客

Mybatis教程之Mybatis配置篇相关推荐

  1. 转:Tkinter教程之Text(2)篇

    '''Tkinter教程之Text(2)篇''' '''6.使用tag来指定文本的属性''' #创建一个指定背景颜色的TAG # -*- coding: cp936 -*- from Tkinter  ...

  2. spring + mybatis + c3p0 整合(配置篇)

    摘要 近期由于项目使用mybatis出现了数据源阻塞,导致应用程序假死,服务超时引发严重后果,故此下定决心重新梳理一下spring+mybatis+c3p0整合问题,主要分为:配置.源码(通过一次数据 ...

  3. 教程之DSD补丁篇 | 7分钟教你优雅定制最关键的OC补丁(clover通用)

    学会定制OC引导文件,从此安装黑苹果不再是难题. 制作DSDT补丁,是OC定制的第一步,也是最为关键的一步,考虑到网上的相关教程几乎没有,所以这期视频我尽量从黑果小白的角度出发,给大家重点讲一下这最关 ...

  4. phpcms mysql debug_phpcms教程之mysql配置优化

    1.页面缓存功能: 页面缓存功能降低MySQL的资源消耗的(系统本身就已经考虑,采用生成HTML页面,大大降低了数据库的压力). 2.mysql服务器的优化 2.1.修改全站搜索 修改my.ini(m ...

  5. WIFI模块开发教程之W600网络篇6:Airkiss配网

    前言 本文研究如何使用微信Airkiss协议对模块进行配网,所谓配网即是说通知模块需要连接的路由器ssid和password的一种机制. 一.理论基础 1.Airkiss原理 设备处于混杂模式监听无线 ...

  6. Mybatis+Tomcat使用JNDI配置数据源入门

    在我们已经有了Mybatis基础的情况下,我们可以使用Tomcat部署web项目 1.创建Maven项目 选择webapp 2.配置pom.xml 在pom.xml中添加依赖 这里的依赖比单纯的Myb ...

  7. ssm注解配置连接mysql_基于注解和配置类的SSM(Spring+SpringMVC+Mybatis)项目详细配置...

    在上一篇文章中介绍了使用注解和xml配置文件对项目进行配置,在这篇文章中将xml配置文件中的配置信息都改成使用注解或者配置类的形式. 第一步.配置pom.xml 在一个ssm项目中,可能需要用到的依赖 ...

  8. DNS域欺骗攻击详细教程之Windows篇

    一.DNS域欺骗攻击原理 DNS欺骗即域名信息欺骗是最常见的DNS安全问题.当一个DNS服务器掉入陷阱,使用了来自一个恶意DNS服务器的错误信息,那么该DNS服务器就被欺骗了.DNS欺骗会使那些易受攻 ...

  9. SAP 教程之 01 如何为 Inbound IDOC 配置 SAP

    在本系列中,我将讨论如何为入站流程配置 SAP. 在我之前的博客中,我概述了IDOC.<SAP 教程之 SAP 中的 IDOC> 在入站处理期间,IDoc 被传输到接口并存储在 R/3 系 ...

最新文章

  1. mysql字段名大写好处_数据库的表名字段名大小写问题
  2. Makefile的写法
  3. Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案
  4. 开两个服务内存溢出_应用服务OkHttpClient创建大量对外连接时内存溢出
  5. magento后台使用POST表单时,要使用必要参数form_key才能正常通讯
  6. 第一步_安装VMware虚拟机和搭载ubuntu系统
  7. centos下的nginx安装工作记录20130701
  8. Hibernate缓存之初探
  9. 创建phpinfo.php
  10. 自定义标签之使用struts的valueStack取值
  11. 阿里巴巴(容器镜像服务)docker+springboot实践
  12. 人民币转换美金的c语言代码大全,人民币和美元大写格式在线工具,美元美金数字金额转换大写,外币大写金额...
  13. 何为民间IP,小游戏竟然还可以这样做?脑洞大开
  14. 事件触发控制 Event-Trigger Control Matlab Code
  15. 计算机空格符号,电脑打印出现空格符号怎么办
  16. h桥控制电机刹车_51单片机H桥电路控制电机正反转和PWM调速
  17. 复杂命令行参数gcc的-Wl的含义,注意是字母l不是数字1
  18. HBuilder 安装 vant
  19. 新智慧记震撼上线,开启进销存管理新时代
  20. 百钱买百鸡问题与百钱兑换问题(C与C++)经典编程算法

热门文章

  1. 微信小程序真机调试,苹果用户记得打开本地网络
  2. 计算机终端机 大型游戏,云电脑让各种终端玩转大型游戏
  3. module.exports 与 exports.xxx 的区别
  4. Linux下查看内存泄露的命令
  5. mysql DateDiff 时间差
  6. maven 树 查看依赖
  7. CRC校验中的“模2”除法运算流程图和图示
  8. webpack 配置文件
  9. C语言基础之输出m到n之间的素数
  10. 基于若依系统进行模块化开发(使用eclipse)