MyBatis是一个Java持久化框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。
MyBatis是在Apache许可证 2.0下分发的自由软件,是iBATIS 3.0的分支版本。其维护团队也包含iBATIS的初创成员。
与其他的对象关系映射框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作,或者要完全控制SQL的执行,MyBatis是一个不错的选择。
与JDBC相比,MyBatis简化了相关代码:SQL语句在一行代码中就能执行。MyBatis提供了一个映射引擎,声明式的把SQL语句执行结果与对象树映射起来。通过使用一种内建的类XML表达式语言,或者使用Apache Velocity集成的插件,SQL语句可以被动态的生成。
MyBatis与Spring Framework和Google Guice集成,这使开发者免于依赖性问题。
MyBatis支持声明式数据缓存(declarative data caching)。当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在一段高速缓存中,今后执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。MyBatis提供了默认下基于Java HashMap的缓存实现,以及用于与OSCache、Ehcache、Hazelcast和Memcached连接的默认连接器。MyBatis还提供API供其他缓存实现使用。
要点
这段时间学习下来,其实对Mybatis来说主要的过程无法是以下几步
1. 从XML配置文件中获取SessionFactory,然后由SessionFactory产生相应的Session。
2. 是用Session对象对业务数据完成相应的CRUD操作(增删改查)和相应的事务控制。
3. 使用完毕后关闭相应的Session,以免过度占用资源
4. 使用配置相应的Mapper xml文件进行业务实体的JavaBean与数据库表之间做相应的Map操作
战前准备:
1. 开发环境Eclipse JavaEE IDE,JDK 1.6,数据库mysql 5.5
2. 下载相应Jar包,以备后用
mybatis-3.2.3.zip 解压后拿出 mybatis-3.2.3.jar,=> 下载地址: http://code.google.com/p/mybatis/ (Mybatis核心包)
mybatis-generator-core-1.3.1.jar => 下载地址: http://code.google.com/p/mybatis/wiki/Generator (Mybatis自动生成配置文件包)
mysql-connector-java-5.1.26-bin.jar => 下载地址:http://dev.mysql.com/downloads/connector/j/ (Mysql 的jdbc驱动包)
搭建步骤
接下来大家可以再Eclipse下面建一个名为MybatisDemo的Java Project项目,按照如下图中所示新建相应的包结构和文件夹结构,其中config与mapper分别为文件夹,
包david.mybatis.demo与包david.mybatis.model下分别存放相应的demo运行程序与Javabean对象,lib文件夹下存放刚刚下载的那几个第三方jar包。
建完下面的目录,我们可以添加相应的Jar包,如下图
完成后,执行下面SQL,建立DEMO所需的表结构,分别有3张表,Visitor(访问者表),Website(网站表),Channel(频道表)
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
|
/*创建Visitor*/ CREATE TABLE Visitor ( Id INT (11) NOT NULL AUTO_INCREMENT, Name VARCHAR (1000) NOT NULL , Email VARCHAR (1000) NOT NULL , Status INT NOT NULL DEFAULT 1, CreateTime DateTime, PRIMARY KEY (Id) ) /*创建网站表*/ CREATE TABLE Website ( Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Name VARCHAR (1000) NOT NULL , VisitorId INT REFERENCES Visitor(Id), Status INT NOT NULL DEFAULT 1, CreateTime DateTime ) /*创建频道表*/ CREATE TABLE Channel ( Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Name VARCHAR (1000) NOT NULL , WebsiteId INT REFERENCES Website(Id), Status INT NOT NULL DEFAULT 1, CreateTime DateTime ) |
所有这些都完成后,我们就要开始动手啦~
就像开头说的,Mybatis的所有配置都源于一份XML配置文件,我们需要在config文件夹下,新建名为mybatis_demo_config.xml的配置文件,这一份东西就是我们后面所需要操作的核心之一。
在配置这个文件千万要注意<configuration>节点内的元素都是有层级顺序的要求的,不能够随意更换次序,否则在加载xml配置文件的时候会出现异常而导致后续操作不成功。
具体的节点说明大家可以查看http://mybatis.github.io/mybatis-3/zh/configuration.html#,这里只说比较常用的节点,typeAliases,environments,mappers。
1. typeAliases => 别名节点,可以通过设置这个节点的属性,这样配置文件中其他需要实体名字的地方都可以使用此别名而不是完全限定名
例如 <typeAlias type="david.mybatis.model.Visitor" alias="Visitor" />
2. environments => 环境节点,配置数据连接相关的信息
3. mappers => 配置SQL映射语句。
最简单的配置如下:
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
|
<? 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 > < typeAliases > < typeAlias type = "david.mybatis.model.Visitor" alias = "Visitor" /> </ typeAliases > < environments default = "development" > < environment id = "development" > < transactionManager type = "JDBC" ></ transactionManager > < dataSource type = "POOLED" > < property name = "driver" value = "com.mysql.jdbc.Driver" /> <!-- ?useUnicode=true&characterEncoding=utf8为了支持中文插入 --> < property name = "url" value = "jdbc:mysql://127.0.0.1:3306/mybatis_db?useUnicode=true&characterEncoding=utf8" /> < property name = "username" value = "root" /> < property name = "password" value = "123456" /> </ dataSource > </ environment > </ environments > < mappers > < mapper resource = "mapper/VisitorMapper.xml" /> </ mappers > </ configuration > |
在包david.mybatis.demo下面新建一个名为MyBatisUtils类,里面存放获取SqlSession与关闭SqlSession的方法,提炼出来方便多次复用。
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package david.mybatis.demo; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import david.mybatis.model.CRUD_Enum; public class MybatisUtils { private static final String CONFIG_PATH = "config/mybatis_demo_config.xml" ; /* * 获取数据库访问链接 */ public static SqlSession getSqlSession() { SqlSession session = null; try { InputStream stream = Resources.getResourceAsStream(CONFIG_PATH); //可以根据配置的相应环境读取相应的数据库环境 // SqlSessionFactory factory = new SqlSessionFactoryBuilder().build( // stream, "development"); SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(stream); session = factory.openSession(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return session; } /* * 获取数据库访问链接 */ public static void closeSession(SqlSession session) { session.close(); } /* * 返回操作记录消息 */ public static void showMessages(CRUD_Enum type, int count) { switch (type) { case Add: System.out.println( "添加了" + count + "条记录。" ); break ; case Delete: System.out.println( "删除了" + count + "条记录。" ); break ; case Update: System.out.println( "更新了" + count + "条记录。" ); break ; case Query: System.out.println( "匹配了" + count + "条记录。" ); break ; case List: System.out.println( "共有" + count + "条记录。" ); break ; default : break ; } } } |
在包david.mybatis.model下面新建一个名为Visitor的类,用来作相应的OR Mapping。
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
51
52
53
54
55
|
package david.mybatis.model; import java.text.SimpleDateFormat; import java.util.Date; public class Visitor { private int id; private String name; private String email; private int status; private Date createTime; public Visitor() { // TODO Auto-generated constructor stub createTime = new Date(); } public Visitor(String name, String email) { this .name = name; this .email = email; this .status = 1 ; this .createTime = new Date(); } public int getId() { return id; } public void setName(String name) { this .name = name; } public String getName() { return name; } public void setEmail(String email) { this .email = email; } public String getEmail() { return email; } public Date getCreateTime() { return createTime; } @Override public String toString() { // TODO Auto-generated method stub return String.format( "{Id: %d, Name: %s, CreateTime: %s}" , id, name, new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format(createTime)); } } |
在包david.mybatis.demo下面新建一个VisitorMapper.xml,用来映射相应SQL语句。
这里要注意namespace=>david.mybatis.demo.IVisitorOperation一定要与对应这个包下面的实际文件名,IVisitorOperation否则无法成功加载相应的映射文件
1
2
3
4
5
6
|
< mapper namespace = "david.mybatis.demo.IVisitorOperation" > < select id = "basicQuery" parameterType = "int" resultType = "Visitor" > select * from visitor where id=#{id} and Status>0 order by Id </ select > </ mapper > |
接下来运行下面的程序
1
2
3
4
5
6
7
8
9
10
|
public static void testBasicQuery( int id) { SqlSession session = MybatisUtils.getSqlSession(); try { Visitor visitor = (Visitor) session.selectOne( "david.mybatis.demo.IVisitorOperation.basicQuery" , id); MybatisUtils.closeSession(session); System.out.println(visitor); } catch (Exception e) { // TODO: handle exception } } |
一个最简单的执行结果就出来啦
这算是Mybatis系列的HelloWord~