Mybatis入门

集成

要使用Mybatis,你需要引入mybatis-x.x.x.jar到你项目的classpath。

如果你的项目使用maven来管理,添加如下依赖到你的项目pom.xml。

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


从XML中构建SqlSessionFactory

每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。

SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder来获得。

SqlSessionFactoryBuilder对象可以从XML配置文件,或从Configuration类的实例中构建SqlSessionFactory对象。

 

从XML文件中构建SqlSessionFactory的实例非常简单。这里建议你使用classpath路径下的资源文件来配置。MyBatis包含了一些工具类,这些工具类使得从classpath或其他位置加载资源文件更加简单。

    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


XML配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。这里给出一个简单的示例:

    <?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="${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>


当然,XML配置文件中还有很多可以配置的,在上面的示例指出的则是最关键的部分。environment元素体中包含对事务管理和连接池的环境配置。mappers元素是包含所有mapper映射的列表,这些mapper的XML文件包含SQL代码和映射定义信息。

使用Java代码构建SqlSessionFactory

如果你喜欢使用Java代码而不是XML文件直接创建配置实例,MyBatis也提供完整的配置类,提供所有从XML文件中加载配置信息的选项。

    DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment("development", transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
    configuration.addMapper(BlogMapper.class);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);


注意这种情况下配置是添加的是Java的映射类,这些类包含SQL语句的注解从而避免了XML文件的依赖,但XML映射仍然在大多数高级映射(比如:嵌套Join映射)时需要。出于这样的原因,如果存在XML配置文件的话,MyBatis将会自动查找和加载一个和类名相同的XML文件(上面的示例,存在BlogMapper.class类,那么BlogMapper.xml将会被加载)。

从SqlSessionFactory中获取SqlSession

现在,我们已经知道如何获取SqlSessionFactory对象了,基于同样的方式,我们就可以获得SqlSession的实例了。SqlSession对象包含所有执行SQL操作的方法。你可以用SqlSession实例来直接执行已映射的SQL语句。例如:

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


这种使用方式和之前的MyBatis版本是一样的,现在提供了一种更简洁的方法,使用Mapper的接口(比如BlogMapper.class),这样的方式更简单也更安全,不会发生写错字符串找不到类的错误。例如:

    SqlSession session = sqlSessionFactory.openSession();
    try {
    BlogMapper mapper = session.getMapper(BlogMapper.class);
    Blog blog = mapper.selectBlog(101);
    } finally {
    session.close();
    }


映射的SQL语句

你也许想知道通过SqlSession和Mapper对象到底执行了什么操作。这是Mybatis最主要的一个主题,这里先给出一个宏观的概念,上面的示例,语句是通过XML或注解定义的。我们先来看看XML。如果你以前用过iBatis,这个应该很熟悉了,但是XML映射文件也有很多的改进,后面会详细来说。这里给出一个基于XML映射语句的示例,这些语句应该可以满足上述示例中SqlSession对象的调用。

    <?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="org.mybatis.example.BlogMapper">
    <select id="selectBlog" parameterType="int" resultType="Blog">
    select * from Blog where id = #{id}
    </select>
    </mapper>


你可以在一个单独的XML映射文件中定义很多的SQL映射语句,在命名空间"com.mybatis.example.BlogMapper"中,它定义了一个名为"selectBlog"的映射语句,这样你可以使用完全限定名"org.mybatis.example.BlogMapper.selectBlog"来调用映射语句。

  
  
  1.     Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);


你也可以用如下方式来调用:

    BlogMapper mapper = session.getMapper(BlogMapper.class);
    Blog blog = mapper.selectBlog(101);


这里推荐第二种方式,优点是不言而喻的。

命名空间在之前版本的MyBatis中是可选的,而在新版本中是必须的,它的目的是使用更长的完全限定名来隔离语句。

命名解析:为了减少输入量,MyBatis对所有的命名配置元素使用如下的命名解析规则,包括语句,结果映射,缓存等。

直接查找完全限定名(比如"com.mypackage.MyMapper.selectAllThing")发现就使用。短名称(比如"selectAllThings")可以用来引用任意含糊的对象。而如果有两个或两个以上的(比如"com.foo.selectAllThings"和"com.bar.selectAllThings"),那么就会出现短名称不明确的错误,此时就必须使用完全限定名。

使用注解

你还可以用注解来映射SQL语句,比如上面的XML示例可以用如下注解来替换:

    public interface BlogMapper {
    @Select("SELECT * FROM blog WHERE id = #{id}")
    Blog selectBlog(int id);
    }


对于简单的SQL语句来说,使用注解代码会显得比较清晰,但是对于复杂语句来说就会显得很混乱。因此,建议你最好使用XML来映射语句。当然最终取决于你自己的决定。

范围和生命周期

理解不同范围不同对象的生命周期是很重要的,不正确的使用可能会导致严重的并发问题。

SqlSessionFactoryBuilder

一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但最好的方式是不要一直保持它来解析所有的XML资源。

SqlSessionFactory

一旦被创建,SqlSessionFactory应该在你的应用程序运行期间都存在。使用SqlSessionFactory的最佳实践是在应用运行期间只创建一次。因此SqlSessionFactory的最佳范围是应用范围,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有自己的SqlSession实例,SqlSession的实例不能被共享,它是线程不安全的。因此最佳的范围是请求或方法范围。不要将SqlSession的实例引用放在一个类的静态字段甚至是实例字段中,也不要将SqlSession的实例引用放在任何类型的管理范围中,比如Serlvet中的HttpSession。如果你现在正在使用Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。

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


在你的代码中使用这种模式, 将保证所有数据库资源都正确地关闭。

Mapper实例

Mapper是你创建绑定映射语句的接口,Mapper接口的实例可以从SqlSession中获得。也就是说,任意Mapper实例的最大范围和SqlSession是相同的。但是,Mapper实例的最佳范围是方法范围,它们应该在使用它们的方法中被请求,然后就抛弃掉,它们不需要显式地关闭。

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


对象生命周期和依赖注入框架

使用注入框架可以创建线程安全的包含事务的sqlSession和Mapper,并将它们注入到你的Bean,这样你就可以不用去关心它们的生命周期。具体可参考Mybatis和Spring的整合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
入门 安装 要使用 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>从 XML 中构建 SqlSessionFactory 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。 从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。 String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);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> <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>当然,还有很多可以在XML 文件中进行配置,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息)。 不使用 XML 构建 SqlSessionFactory 如果你更愿意直接从 Java 程序而不是 XML 文件中创建 configuration,或者创建你自己的 configuration 构建器,MyBatis 也提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。 .....................................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值