Mybatis是目前javaweb开发中最流行的orm框架,网上的教程多是springmvc+mybatis的整合过程。在这里我们来简单了解一下mybatis是怎么运行的。

Maven配置

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.1.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
        <!--google tools-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
        </dependency>

        <!--阿里巴巴json处理工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.16</version>
        </dependency>

以上,mybatis,mysql是必须的,guava是谷歌的一个工具包推荐使用,fastjson是阿里巴巴推出的一款json序列化和反序列化的工具包,同样推荐使用。

数据库设置

我们需要创建一个表,进行入门操作。

CREATE TABLE test.my_info
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_name VARCHAR(64),
    user_age INT,
    column_4 INT
);

code形式使用

平常,我们都是用xml配置的方式使用mybatis,但是这样常常不知道底层是怎么运作的。

代码

使用最久远的方式就是创建一个xml,里面写上你要执行的sql内容。这里,我们举一个例子。

/src/main/resources/xxx/mybatis_test.xml


<?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.gavinzh.mybatis.MyInfoMapper">
    <select id="selectTest" resultType="java.util.Map">
        SELECT id ,user_name as userName,user_age as userAge,column_4 as column4 FROM test.my_info
    </select>
</mapper>

接下来,在/src/main/java/目录下创建类MybatisMain.java

import com.alibaba.fastjson.JSON;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author gavin
 * @version V1.0
 */
public class MybatisMain {
    public static void main(String[] args) throws IOException {
        codeResourceTest();
    }

    public static void codeResourceTest() throws IOException {
        //线程池
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setDriver("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;allowMultiQueries=true");
        dataSource.setUsername("root");
        dataSource.setPassword("root");

        //数据库运行环境
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("dev",transactionFactory,dataSource);

        //配置生成
        Configuration configuration = new Configuration();
        configuration.setEnvironment(environment);
        InputStream inputStream = Resources.getResourceAsStream("xxx/mybatis_test.xml");
        XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, "xxx/mybatis_test.xml", configuration.getSqlFragments());
        mapperParser.parse();

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List list = sqlSession.selectList("com.gavinzh.mybatis.MyInfoMapper.selectTest");
        System.out.println(JSON.toJSONString(list));
    }
}

结果

以上,就已经可以运行。结果如下:

[{"id":1,"userName":"gavin","userAge":22}]

小结

最简单的mybatis的使用方式已经展示了。看代码,我们可以看到。

  • mybatis自己实现了一个数据库连接池PooledDataSource,实现了druid,dbcp,c3p0差不多的功能。
  • 一个数据库连接池需要设置运行环境Environment
  • mybatis从配置Configuration中获取用户的配置,所以运行环境被设置到了配置中,
  • mybatis中最关键的sql是通过XMLMapperBuilder,设置到配置中,具体怎么设置上的这里不表。
  • mybatis默认情况一个数据库对应一个SqlSessionFactory,工厂的生成当然要依靠配置了。
  • 工厂生成后,以上的实例均可销毁,只保留工厂即可。

XML形式使用

上一节,我们使用了code形式配置的mybatis,其实xml配置就是mybatis解析xml生成Configuration。具体可以对比一下代码和xml的节点是怎么对应的。

代码

非常简单,之前我们写过了mapper的xml,这次只用写配置xml就可以了。

/src/main/resources/mybatis.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>
    <!-- 对事务的管理和连接池的配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;allowMultiQueries=true" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <!-- mapping 文件路径配置 -->
    <mappers>
        <mapper resource="xxx/mybatis_test.xml" />
    </mappers>
</configuration>

/src/main/java/目录下类MybatisMain.java

import com.alibaba.fastjson.JSON;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author gavin
 * @version V1.0
 */
public class MybatisMain {
    public static void main(String[] args) throws IOException {
        xmlTest();
    }

    public static void xmlTest() throws IOException {
        String resource = "mybatis.xml";

        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List list = sqlSession.selectList("com.gavinzh.mybatis.MyInfoMapper.selectTest");
        System.out.println(JSON.toJSONString(list));
    }
}

结果

和code方式运行的结果一致。可见,mybatis解析配置文件同样是生成的Configuration。

总结

如果想在简单的java程序中使用mybatis,就足够了,这里不牵扯spring,springmvc。

标签: java, Mybatis

添加新评论