美文网首页
MyBatis 单独使用步骤(不结合Spring)

MyBatis 单独使用步骤(不结合Spring)

作者: 拧发条鸟xds | 来源:发表于2018-11-12 18:02 被阅读0次

    参考

    mybatis 入门官方中文文档


    使用 Myeclipse+maven 构建项目

    1. 导包

    要使用 MyBatis,只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。

    如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>x.x.x</version>
    </dependency>
    

    2. XML 配置文件

    创建一个 XML 配置文件,XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含:

    • 数据库连接实例的数据源(DataSource)
    • 决定事务作用域和控制方式的事务管理器(TransactionManager)

    当然,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>
        
        <!-- 外部属性配置文件 -->
        <properties resource="jdbc.properties" />
    
        <!-- 为SQL映射配置文件的parameterType和resultType来设置别名。别名默认为首字母小写。 -->
        <typeAliases>
            <package name="com.itiis.client.entity"/>
        </typeAliases>
        
        <!-- environment 元素体中包含了事务管理和连接池的配置 -->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <!-- DBCP数据源 -->
                <dataSource type="com.itiis.client.dataSource.DBCPDataSourceFactory">
                    <property name="driverClassName" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                    <property name="minIdle" value="5"/>
                    <property name="maxIdle" value="10"/><!-- maxIdle,最大空闲数 -->
                    <property name="maxActive" value="10"/>
                    <property name="validationQuery" value="SELECT 1"/>
                </dataSource>
            </environment>
        </environments>
        
        <!-- mappers 元素包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息) -->
        <mappers>
            <mapper resource="mappersClient/TrafficSourceMapper.xml"/>
        </mappers>
        
    </configuration>
    
    

    注意点1:使用自定义数据源

    MyBatis的数据源并不是很强大,所以它也可以不使用其本身自带的数据源,而配置成其它的数据源如DBCP/C3P0等等。

    官方文档 XML 数据源配置

    官方也给出了C3P0的数据源配置方法。

    DBCP的配置方法

    (1) 创建一个java类,代码如下,将MyBatis的数据源设置为DBCP数据源。

    package com.itiis.client.dataSource;
    
    import org.apache.commons.dbcp.BasicDataSource;
    import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
    
    public class DBCPDataSourceFactory extends UnpooledDataSourceFactory {
    
        public DBCPDataSourceFactory() {
            this.dataSource = new BasicDataSource();
        }
        
    }
    

    (2) 在 XML 配置文件中配置数据源

        <!-- DBCP数据源 -->
        <dataSource type="com.itiis.client.dataSource.DBCPDataSourceFactory">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
            <property name="minIdle" value="5"/> 
            <property name="maxIdle" value="10"/><!-- maxIdle,最大空闲数 -->
            <property name="maxActive" value="10"/>
            <property name="validationQuery" value="SELECT 1"/>
        </dataSource>
    

    注意点2:MyBatis的 xml 配置严格讲究顺序,比如 properties 不能配置到 typeAliases 后面,否则就会出错而不能加载 xml

    3. Mapper映射器

    Mapper XML 文件

    (1) 创建一个接口类 ***Mapper.java

    package com.itiis.client.dao;
    
    import java.util.Map;
    
    import com.itiis.client.entity.EarthMagneticModel;
    
    public interface TrafficSourceMapper {
        
        public Map<String, String> getLinkAndLaneById(String id);
        
        public String getById(String id);
        
        public void insertEarthMagnetic(EarthMagneticModel model);
        
    }
    

    (2) 创建一个 ***Mapper.xml ,包含了 SQL 代码和映射定义信息

    <?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">
    
    <mapper namespace="com.itiis.client.dao.TrafficSourceMapper">
       
        <!--获得资源的link和lane -->
        <select id="getLinkAndLaneById" parameterType="String" resultType="Map">
            SELECT 
                ID_Link , ID_Lane
            FROM 
                t_trafficsource  
            WHERE
                ID_TrafficSource LIKE CONCAT('%',#{id},'%')
        </select>
        <!--获得资源的link和lane -->
        <select id="getById" parameterType="String" resultType="String">
            SELECT 
                ID_Link
            FROM 
                t_trafficsource  
            WHERE
                ID_TrafficSource = #{id}
        </select>
        
        <insert id="insertEarthMagnetic" parameterType="earthMagneticModel">
          INSERT INTO
                t_earthmagnetic 
                (ID_EMPosition,stationSerial,ID_Link,ID_Lane,vehicleCount,speed,createTime,Note)
          VALUES 
                (#{ID_EMPosition},#{stationSerial},#{ID_Link},#{ID_Lane},#{vehicleCount},#{speed},#{createTime},#{Note})
        </insert>
    </mapper>
    

    注意点1:mapper的命名空间namespace="com.itiis.client.dao.TrafficSourceMapper" 关联到(1)创建的接口文件。

    注意点2:parameterType和resultType对于自定义的java实体类默认使用全路径,可以在 MyBatis 的配置文件中配置使用别名,上面 xml 已经配置。

    (3) 在 MyBatis 的 xml 配置文件中配置 Mapper 映射文件,上面的 xml 中已经配置

    <mappers>
        <mapper resource="mappersClient/TrafficSourceMapper.xml"/>
    </mappers>
    

    4. 使用

    (1) SqlSessionFactory 使用单例,全局唯一

    SqlSessionFactoryUtil类,使用静态代码块创建单例

    package com.itiis.client.utils;
    
    import java.io.IOException;
    import java.io.InputStream;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    /**
     * MyBatis下,全局唯一SqlSessionFactory,使用单例模式获取
     */
    public class SqlSessionFactoryUtil {
    
        //首先创建静态成员变量sqlSessionFactory,静态变量被所有的对象所共享。
        public static SqlSessionFactory sqlSessionFactory = null;
        
        private SqlSessionFactoryUtil() {}
        
        //使用静态代码块保证线程安全问题
        static{
            
            String resource = "mybatisConfig.xml";
            
            try {
                
                InputStream inputStream = Resources.getResourceAsStream(resource);
    
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                
            } catch (IOException e) {
    
                e.printStackTrace();
            }
            
        }
    
    }
    
    

    (2) 使用

        SqlSessionFactory factory = SqlSessionFactoryUtil.sqlSessionFactory;
        
        //true 不开启事务,自动提交
        SqlSession s = factory.openSession(true);
          
        try {
        
            TrafficSourceMapper mapper = s.getMapper(TrafficSourceMapper.class);
            
            Map<String, String> linkAndLane = mapper.getLinkAndLaneById(ID_TrafficSource);
            
        } finally {
                    
            s.close();
            //s.commit(); 如果开启事务的话,要使用此代码执行任务
        }
          
    

    注意点1:确保 SqlSession 的关闭

    最好使用如下代码块

    SqlSession session = sqlSessionFactory.openSession();
    try {
      // do work
    } finally {
      session.close();
    }
    

    注意点2:映射器实例(Mapper Instances)

    映射器是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域(request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作用域(method scope)内。下面的示例就展示了这个实践:

    SqlSession session = sqlSessionFactory.openSession();
    try {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      // do work
    } finally {
      session.close();
    }
    

    注意点3:事务的开启

    Java API

    默认的 sqlSessionFactory.openSession(); 方法没有参数,它会开启一个事务,必须使用 commit 方法进行提交。

    sqlSessionFactory.openSession(true); 会自动进行提交

    相关文章

      网友评论

          本文标题:MyBatis 单独使用步骤(不结合Spring)

          本文链接:https://www.haomeiwen.com/subject/dawcfqtx.html