说道JavaWeb,很多人都知道SSH,这里的H代表了hibernate,这是一个数据库访问框架,hibernate在Java开发中的地位也是相当高,众所周知的JPA标准就是由hibernate主导完成的。然而,数据库访问框架除了hibernate之外,还有另外一个大名鼎鼎的数据库框架,那就是mybatis,mybatis的前身ibatis早在2001年就发布了,那么这里我不想过多的去比较这两个东西孰优孰劣,因为当你真正了解了这两个框架之后自然就知道在什么情况下该用什么框架。OK,废话不多说,那么今天我们就来看看mybatis的基本使用吧。
mybatis在使用的过程中,我们可以通过XML的方式来构建,也可以通过Java代码来构建,本文我先用Java代码来创建,下一篇博客我们再来介绍如何用XML来构建。
OK,那么在开始写代码之前,我们还是有必要先来了解下mybatis中几个基本的组件:
1.SqlSessionFactoryBuilder:这是一个SqlSessionFactory的构造器,它根据我们的xml配置文件或者Java代码来生成SqlSessionFactory。
2.SqlSessionFactory:这个有点类似于我们在JDBC中使用的Connection,我们到时候要根据SqlSessionFactory来生成是一个会话,也就是SqlSession。
3.SqlSession:它可以发送一条SQL语句去执行,并返回结果,从这个角度来说,它有点类似于PrepareStatement,当然,我们也可以利用SqlSession获取Mapper的接口,这个算是SqlSession的一个核心用法了。
4.Mapper:Mapper也可以发送一条SQL语句并返回执行结果,Mapper由两部分组成,一部分是Java接口,另一部分是XML配置文件或者注解。
OK,以上四点就是mybatis中非常基础的四个组件,我们后面的代码都将围绕这四个类来展开。
创建Project并搭建环境
这里我们先不创建web工程,就以普通的Java工程为例,首先在IntelliJ中创建一个Java工程,然后在工程的根目录下创建lib文件夹。由于现在mybatis托管在GitHub上,所以我们可以直接在GitHub上下载mybatis(点我下载),下载好之后,解压,如图:
mybatis-3.4.2.jar这个是mybatis的包,lib文件夹中是mybatis的依赖包,将这些jar包全部拷贝到我们的项目的lib文件夹中。另外,由于我这里使用的是mysql数据库,所以还要mysql 的驱动jar包(点我下载),同时我使用了单元测试,所以还需要两个单元测试相关的jar包(点我下载)。OK,搞完这些之后,我们的mybatis环境就算搭建好了,刚开始写这样搞吧,下篇博客我再来介绍通过Maven快速导入依赖。将所有的jar包都加进来之后,我们的项目是这个样子:
创建数据库并预设数据
涉及到数据库的操作,我先创建一个名为mybatis的数据库,然后在数据库中创建名为user的数据表,再向表中添加四条数据,结果如下:
创建数据库:
创建user表:
插入数据之后结果如下:
创建配置类并获取SqlSessionFactory
这里我们使用Java代码来创建配置类,一般情况下一个数据库只需要有一个SqlSessionFactory实例,过多的SqlSessionFactory会导致数据库有过多的连接,从而消耗过多的数据库资源,因此SqlSessionFactory需要我们将之做成一个单例模式,如下:
public class DBUtils {
private static SqlSessionFactory sqlSessionFactory = null;
private static final Class CLASS_LOCK = DBUtils.class;
public static SqlSessionFactory initSqlSessionFactory() {
synchronized (CLASS_LOCK) {
if (sqlSessionFactory == null) {
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("sang");
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(UserMapper.class);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
}
}
return sqlSessionFactory;
}
public static SqlSession openSqlSession() {
if(sqlSessionFactory==null)
initSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}
OK,关于这个工具类我说如下几点:
1.首先该类一共两个工具方法,一个用来获取SqlSessionFactory,另一个用来获取SqlSession
2.获取SqlSessionFactory的使用我们采用了单例模式,这是常见的单例写法,不用多说
3.在获取SqlSessionFactory的方法中,我们通过PooledDataSource对象的实例来设置数据库驱动、数据库连接地址、数据库用户名和密码等。
4.第15行的代码我们创建了数据库的运行环境,并将这个环境命名为development
5.第17行代码添加了一个映射器,这个映射器就是我们前文说的Mapper,用来执行一个SQL 语句。
6.有了SqlSessionFactory之后接下来在27行我们就可以通过SqlSessionFactory来构建一个SqlSession了。
构建Mapper
Mapper可以通过Java接口+xml文件来构成,也可以通过Java接口+注解来构成,我这里先以Java接口+注解为例来说明,代码如下:
public interface UserMapper {
@Select(value = "select * from user where id=#{id}")
public User getUser(Long id);
}
当我调用getUser方法时实际上就执行了@Select注解中的SQL语句,在执行SQL语句的时候会将getUser方法的参数id传入SQL 语句中。当然这里还需要一个User对象,如下:
public class User {
private Long id;
private String username;
private String password;
private String address;
//省略getter/setter
}
OK,做完这些之后我们就可以来测试了。
测试
创建两个测试方法,如下:
@org.junit.Test
public void test2() {
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser(3l);
System.out.println(user.toString());
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
@org.junit.Test
public void test3() {
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
User user = (User) sqlSession.selectOne("org.sang.db.UserMapper.getUser", 1l);
System.out.println(user.toString());
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
在test2方法中,我们先获取一个SqlSession,然后通过SqlSession获取我们刚刚创建的Mapper对象,调用Mapper中的方法就可以执行查询操作,test2执行结果如下:
在mybatis中我们也可以不去获取Mapper对象,直接去调用方法,这个就如test3的写法。如果在Mapper中就只有这一个方法叫getUser,我们也可以不用写的这么冗长,可以像下面这样简写:
@org.junit.Test
public void test4() {
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
User user = (User) sqlSession.selectOne("getUser", 1l);
System.out.println(user.toString());
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
执行结果如下:
OK,以上就是mybatis的一个简单应用,这里我们主要说了使用Java代码和注解来代替XML配置文件,下篇博客和小伙伴们聊聊一种更常用的方法就是XML配置。
本文案例下载:
本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis2。
以上。
参考资料:
1.http://www.mybatis.org/mybatis-3/zh/index.html
2.《深入浅出MyBatis 技术原理与实战》第二章