说道的JavaWeb,很多人都知道SSH,这里的^ h代表了冬眠,这是一个数据库访问框架,休眠在的Java开发中的地位也是相当高,众所周知的JPA标准就是由休眠主导完成的。然而,数据库访问框架除了休眠之外,还有另外一个大名鼎鼎的数据库框架,那就是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的中非常基础的四个组件,我们后面的代码都将围绕这四个类来展开。
创建项目并搭建环境
这里我们先不创建网络工程,就以普通的Java的工程为例,首先在的IntelliJ中创建一个Java的工程,然后在工程的根目录下创建的lib文件夹。由于现在的MyBatis托管在GitHub上上,所以我们可以直接在GitHub上下载mybatis(点我下载),下载好之后,解压,如图:
mybatis-3.4.2.jar这个是mybatis的包,lib文件夹中是mybatis的依赖包,将这些jar包全部拷贝到我们的项目的lib文件夹中。另外,由于我这里使用的是mysql数据库,所以还要要mysql的驱动jar包(点我下载),同时我使用了单元测试,所以还需要两个单元测试相关的罐包(点我下载).OK,搞完这些之后,我们的MyBatis的环境就算搭建好了,刚开始写这样搞吧,下篇博客我再来介绍通过Maven的快速导入依赖。将所有的罐包都加进来之后,我们的项目是这个样子:
创建数据库并预设数据
涉及到数据库的操作,我先创建一个名为的MyBatis的数据库,然后在数据库中创建名为用户的数据表,再向表中添加四条数据,结果如下:
创建数据库:
创建用户表:
插入数据之后结果如下:
创建配置类并获取了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();
}
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
OK,关于这个工具类我说如下几点:
1.首先该类一共两个工具方法,一个用于获取SqlSessionFactory,另一个用于获取SqlSession
2.获取SqlSessionFactory的使用我们采用了单例模式,这是常见的单例写法,不用多说
3.在获取SqlSessionFactory的方法中,我们通过PooledDataSource对象的实例来设置数据库驱动,数据库连接地址,数据库用户名和密码等
。4 . 第15行的代码我们创建了数据库的运行环境,并将这个环境命名为开发
5第17行代码添加了一个映射器,这个映射器就是我们前文说的Mapper,用来执行一个SQL语句
。6 . 有了SqlSessionFactory之后接下来在27行我们就可以通过SqlSessionFactory来构造一个SqlSession了。
构建映射器
映射器可以通过Java的接口+ XML文件来构成,也可以通过Java的接口+注解来构成,我这里先以Java的接口+注解为例来说明,代码如下:
public interface UserMapper {
@Select(value = "select * from user where id=#{id}")
public User getUser(Long id);
}
- 1
- 2
- 3
- 4
当我调用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
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
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();
}
}
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 三十
- 31
- 32
- 33
- 34
- 35
- 36
在test2的方法中,我们先获取一个SqlSession的,然后通过SqlSession的获取我们刚刚创建的映射对象,调用映射器中的方法就可以执行查询操作,test2的执行结果如下:
在MyBatis的的中我们也可以不去获取映射对象,直接去调用方法,这个就如TEST3的写法。如果在映射器中就只有这一个方法叫的的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();
}
}
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
执行结果如下:
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的技术原理与实战”第二章
二
上面我们介绍通过的的Java代码来创建的的MyBatis的配置文件,港真,这种方式看起来有意思实际在开发中用的并不多,MyBatis的的的配置还是以XML配置为主,本文我们就来看看如何通过XML文件来配置MyBatis的。关于MyBatis的一些的知识基础小伙伴们可以参考 这篇博客初识MyBatis的。另外,上篇博客中,小伙伴们也看到了通过添加JAR包的方式来搭建MyBatis的环境太过于麻烦,因此,本文我们还是回归到Maven的的上吧.OK,废话不多说,开始今天的编码之旅吧。
创建项目并添加的Maven的支持
我这里以IntelliJ为例来说明如何创建,先创建一个普通的java工程,创建成功之后,选中工程右键单击,选择Add Framework Support,然后选择Maven,点击OK就可以了。添加Maven支持src目录下多了几个文件夹,同时也多了一个pom.xml中的文件,如下:
然后在pom.xml中的文件中添加相关依赖,我们这里一共添加三个,一个MyBatis的的,单元测试中,MySQL的驱动,如下:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
</dependencies>
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
OK,如此我的MyBatis的的环境就搭建好了。接下来我们还是按照上文的顺序来看看要怎么做。
通过XML创建的MyBatis的配置
在创建XML配置文件的时候,对于数据库的配置信息我们可以直接创建一个db.properties文件,然后将数据库的配置信息放入其中,如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=sang
- 1
- 2
- 3
- 4
注意,所有的配置文件我们都放在资源文件夹下(小伙伴如果放错了会出现文件找不到的情况,这个时候仔细检查下都很好解决的),如下图:
有了数据库配置信息,接下来我们就可以创建的的MyBatis的配置文件了,我这里配置文件取名为的MyBatis的-conf.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="db.properties"/>
<typeAliases>
<typeAlias type="org.sang.bean.User" alias="user"/>
</typeAliases>
<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="userMapper.xml"/>
</mappers>
</configuration>
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
关于这个配置文件我说如下几点:
1.第6行我们引入刚刚创建的db.properties文件,方便我们在配置数据库的时候通过$ {XXX}来直接引用其中的值。
2.第7-9行给我们的用户实体类取一个别名,这样在映射器的配置文件中我们就可以直接使用这里的别名了。
3.从第10行开始配置我们的mybatis运行环境,我们可以在environments节点中配置多个environment,比如开发环境下的environment,生产环境下的environment,然后在environments中通过default属性来选择你要使用哪一种环境。
4.14-17行配置数据库相关属性,通过${XXX}来直接引用db.properties中的值。
5.第21行到23行配置映射器Mapper,下面我们来说说如何创建Mapper
有了这个XML文件,接下来我们就可以通过这个xml文件来获取一个SqlSession了,当然,如上篇博客所述,我们需要把SqlSessionFactory搞成单例模式,所以创建方式如下:
public class DBUtils {
private static SqlSessionFactory sqlSessionFactory = null;
private static final Class CLASS_LOCK = DBUtils.class;
public static SqlSessionFactory initSqlSessionFactory() {
InputStream is = null;
try {
is = Resources.getResourceAsStream("mybatis-conf.xml");
} catch (IOException e) {
e.printStackTrace();
}
synchronized (CLASS_LOCK) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
}
return sqlSessionFactory;
}
public static SqlSession openSqlSession() {
if(sqlSessionFactory==null)
initSqlSessionFactory();
return sqlSessionFactory.openSession();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
关于这个类我这里就不做过多说明了,小伙伴们有疑问可以参考上篇博客。
创建Mapper
上篇博客我们说过Mapper由两部分组成,Java接口+注解或者Java接口+XML配置,我们在上篇博客中使用Java接口+注解的方式来创建了Mapper,那么本文我们就来看看一种更常用的方式Java接口+XML配置的方式。
创建Java接口:
public interface UserMapper {
public User getUser(Long id);
public int insertUser(User user);
public int deleteUser(Long id);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
小伙伴们注意,这里我并没有给getUser方法添加@Select注解,我们将在xml配置文件中通过xml来解决这个问题,同时我们还添加了两个方法,一个向数据库中添加数据,一个删除数据。
创建配置文件
在resources中创建userMapper.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="org.sang.db.UserMapper">
<select id="getUser" resultType="user" parameterType="Long">
select * from user where id = #{id}
</select>
<insert id="insertUser" parameterType="user">
INSERT INTO user(username,password,address) VALUES (#{username},#{password},#{address})
</insert>
<delete id="deleteUser" parameterType="Long">
DELETE FROM user where id=#{id}
</delete>
</mapper>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
关于这个配置文件我说两点:
1.mapper节点的命名空间属性就是UserMapper的接口全路径
2.选择节点的ID属性就是UserMapper中的方法名称,与与resultType属性的值是我们在的MyBatis的-conf.xml中中定义给用户类定义的别名,参数类型是指定的getUser方法参数的类型
3.插入节点用来执行数据的插入操作
4.delete节点用来执行数据的删除操作
OK,最后再给小伙伴们看看我们的实体类,如下:
public class User {
private Long id;
private String username;
private String password;
private String address;
//省略getter/setter
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
OK,如此之后,我们就可以来测试代码啦。
测试
查询
@Test
public void test1() {
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser(1l);
System.out.println(user);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
查询结果如下:
添加
@Test
public void test2() {
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for (int i = 0; i < 3; i++) {
userMapper.insertUser(new User(null, "u-" + i, "p-" + i, "a-" + i));
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
添加结果:
删除
@Test
public void test3() {
SqlSession sqlSession = null;
try {
sqlSession = DBUtils.openSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int i = userMapper.deleteUser(5l);
System.out.println(i);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
删除结果:
OK,以上就是我们通过XML配置文件来使用的MyBatis的。
本文案例下载:
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis3。
以上。
参考资料:
1. http://www.mybatis.org/mybatis-3/zh/index.html
2.“深入浅出MyBatis技术原理与实战”第二章