MyBatis Java API

本文介绍了MyBatis的基本使用方法,包括配置全局配置文件、编写SQL映射配置文件、创建Mapper接口等步骤,并详细讲解了SqlSession、SqlSessionFactory等核心组件的作用及使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis的maven依赖
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>
使用 MyBatis 的主要 Java 接口就是 SqlSession。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的所有方法 。 而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。典型的方式如下,mybatis-config.xml即为MyBatis的全局配置文件:
String resource = "conf/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory
SqlSessionFactory 有六个方法可以用来创建 SqlSession 实例。默认的 openSession()方法没有参数,它会创建有如下特性的 SqlSession:
会开启一个事务(也就是不自动提交)
连接对象会从由活动环境配置的数据源实例中得到。
事务隔离级别将会使用驱动或数据源的默认设置。
预处理语句不会被复用,也不会批量处理更新。

SqlSession
SqlSession 实例在 MyBatis 中是非常强大的一个类。所有执行语句的方法,提交或回滚事务,还有获取映射器实例。语句执行方法被用来执行定义在 SQL 映射的 XML 文件中的 SELECT,INSERT,UPDA E T 和 DELETE 语句。它们都会自行解释,每一句都使用语句的 ID 属性和参数对象,参数可以 是原生类型(自动装箱或包装类),JavaBean,POJO 或 Map。
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
selectOne 和 selectList 的不同仅仅是 selectOne 必须返回一个对象。 如果多余一个, 或者 没有返回 (或返回了 null) 那么就会抛出异常。 , 如果你不知道需要多少对象, 使用 selectList。

上面是直接调用SqlSession的select/delete/update/insert方法,原始的开发方法需要程序员自己写接口实现,即在接口实现类中调用上面的方法,下面介绍自动生成Mapper代理对象的方法,不需要编写接口实现类。上述的各个 insert,update,delete 和 select 方法都很强大,但也有些繁琐,没有类型安全,对于你的 IDE也没有帮助,还有可能的单元测试。因此, 一个更通用的方式来执行映射语句是使用映射器类。一个映射器类就是一个简单的接口,其中的方法定义匹配于SqlSession方法。下面的示例展示了一些方法签名和它们是 如何映射到 SqlSession 的。

public interface AuthorMapper {
  // (Author) selectOne("selectAuthor",5);
  Author selectAuthor(int id); 
  // (List<Author>) selectList(“selectAuthors”)
  List<Author> selectAuthors();
  // (Map<Integer,Author>) selectMap("selectAuthors", "id")
  @MapKey("id")
  Map<Integer, Author> selectAuthors();
  // insert("insertAuthor", author)
  int insertAuthor(Author author);
  // updateAuthor("updateAuthor", author)
  int updateAuthor(Author author);
  // delete("deleteAuthor",5)
  int deleteAuthor(int id);
}
规范:
1、在mapper.xml中namespace等于Mapper接口地址
2、Mapper.java接口中的方法名和mapper.xml中statement的id一致
3、Mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

4、Mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。


MyBatis自动生成mapper代理对象
SqlSession session = sessionFactory.openSession();
try {
    ArticleDAO articleMapper = session.getMapper(ArticleDAO.class);
    Article article = articleMapper.getArticleById(6);
    System.out.println(article);
}
finally {
    session.close();
}

范围(Scope)和生命周期
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是局部方法变量)。
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次,最简单的就是使用单例模式
SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和HTTP请求对象相似的范围中。换句话说,每次收到的HTTP请求,就可以打开一个SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到finally块中以确保每次都能执行关闭。

关于Mybatis的日志相关内容详见:http://mybatis.org/mybatis-3/zh/logging.html


典型的开发流程总结:

1.配置全局配置文件mybatis-config.xml
2.建立要操作的表(或对应POJO类)的SQL映射配置文件XXmapper.xml,并放入全局配置文件的<mappers>标签中
3.在XXmapper.xml中编写select/insert/delete/update映射语句
4.建立XXMapper.java接口类,接口方法和XXmapper.xml中的statement id一致,参数、返回类型也一致
5.在方法中通过SqlSessionFactory的openSession方法获取SqlSession,调用getMapper方法得到XXMapper代理对象,即可调用XXMapper.java接口中的相应方法


如果使用注解方式,即把SQL语句作为注解放在XXMapper.java接口类对应的方法上则可以不需要XXmapper.xml



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值