Mybatis简单入门

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

Maven配置

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
26
27
28
29
30
31
32
33
34
35
36
37
<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序列化和反序列化的工具包,同样推荐使用。

数据库设置

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

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10

<?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

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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));
}
}

结果

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

1
[{"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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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

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
26
27
28
29
30
31
32
33
34
35
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。