第一章、认识MyBATIS
1.1、mybatis的运行框架图:
1、 首先我们需要配置MyBATIS的配置信息,它可以有两种方法进行提供。里面可以配置数据源,Mapper加载信息,缓存,类的别名还有其他资源的配置。
2、有了配置信息,我们将通过配置信息生成我们需要的SqlSessionFactory这个工厂类,然后我们就可以通过它生成我们MyBATIS的核心接口SqlSession对象。
3、 在SqlSession对象里,我们既可以获取Mapper通过Mapper去执行接口方法,也可以直接在SqlSession里面直接通过字符串去调度Mapper注册的SQL。
上面论述的可能对于初学者不是很明白,但是这个不重要,我们只需要有初步的概念即可,下面我们会详细逐个论述。当然这里只是一个简单的图,我们并没有讨论MyBATIS后台的现实。
1.2、实例:
1.2.1 使用文件简介
我们先看看文件分布图:
介绍一下文件的作用,如下表:
文件 |
作用 |
备注 |
configuration-chapter1.xml |
MyBATIS的配置文件 |
配置基本信息。 |
log4j.properties |
配置log4j日志文件输出 |
配置MyBATIS采用log4j日志输出。 |
userMaper.xml |
使用xml文件配置映射器 |
|
UserPO.java |
POJO对象类文件 |
符合Java Bean规范 |
MainCh1.java |
测试类文件。 |
程序入口 |
UserMapper.java |
映射器接口(使用xml方式) |
|
好了,这里只是简单的介绍了MyBATIS的基本构成文件,大家有个概念即可。
所需jar包:关于mybatis相关的包可以到 http://mybatis.github.io/ 下载,这里我使用了log4j作为日志,所以使用了log4j相关的包。
这里我使用的是MySQL数据库,简易启动也快,不怎么耗资源,所以推荐使用。我们只需要建一张表即可,在mysql中执行下面sql即可。
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`ID` int(11) NOT NULL,
`USERNAME` varchar(60) NOT NULL,
`PASSWORD` varchar(60) NOT NULL,
`BIRTHDAY` date NOT NULL,
`MOBILE` varchar(20) NOT NULL,
`TEL` varchar(20) DEFAULT NULL,
`EMAIL` varchar(100) DEFAULT NULL,
`NOTE` text,
PRIMARY KEY (`ID`)
) ;
INSERT INTO `t_user`(`ID`,`USERNAME`,`PASSWORD`,`BIRTHDAY`,`MOBILE`,`TEL`,`EMAIL`,`NOTE`) VALUES (1,'ykzhen','12345','2015-02-18','13533666666','0756-6666666','[email protected]','数据文件');
commit;
1.2.2 文件详解
我们从程序入口介绍,让我们先看看文件。
MainCh1.java
package com.ykzhen.ch1.test;
import com.ykzhen.ch1.mapper.UserMapper;
import com.ykzhen.ch1.po.UserPO;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
*
* @author ykzhen.
*/
public class MainCh1 {
public static void main(String[] args) {
//定义 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = null;
try {
//使用配置文件创建 SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(
Resources.getResourceAsReader("configuration-chapter1.xml"));
} catch (IOException ex) {
//打印异常.
Logger.getLogger(MainCh1.class.getName()).fatal("创建 SqlSessionFactory失败", ex);
return;
}
//定义 sqlSession
SqlSession sqlSession = null;
try {
//用sqlSessionFactory创建sqlSession
sqlSession = sqlSessionFactory.openSession();
//获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//执行Mapper接口方法.
UserPO user = userMapper.findUser(1);
//打印信息
System.err.println(user.getUsername());
} finally {
//使用完后要记得关闭sqlSession资源
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
它的内容如下:
configuration-chapter1.xml
跟着我们定义了数据源,这些有经验的程序员就很容易理解,好了,让我们先给出UserPO.java的代码。很简单的POJO文件。
UserPO.java
package com.ykzhen.ch1.po;
import java.util.Date;
/**
*
* @author ykzhen.
*/
public class UserPO {
private Integer id = null;
private String username = null;
private String password = null;
private Date birthday = null;
private String mobile = null;
private String tel = null;
private String email = null;
private String note = null;
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the birthday
*/
public Date getBirthday() {
return birthday;
}
/**
* @param birthday the birthday to set
*/
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/**
* @return the mobile
*/
public String getMobile() {
return mobile;
}
/**
* @param mobile the mobile to set
*/
public void setMobile(String mobile) {
this.mobile = mobile;
}
/**
* @return the tel
*/
public String getTel() {
return tel;
}
/**
* @param tel the tel to set
*/
public void setTel(String tel) {
this.tel = tel;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
/**
* @param email the email to set
*/
public void setEmail(String email) {
this.email = email;
}
/**
* @return the note
*/
public String getNote() {
return note;
}
/**
* @param note the note to set
*/
public void setNote(String note) {
this.note = note;
}
}
我们在配置文件中还定义了一个Mapper——UserMapper,它是以文件的形式定义的,那么它来自于配置文件.
userMapper.xml
UserMapper.java
package com.ykzhen.ch1.mapper;
import com.ykzhen.ch1.po.UserPO;
/**
*
* @author ykzhen.
*/
//这里只需要接口,而不需要类
public interface UserMapper {
//方法和userMapper.xml中的保持名称一致.
public UserPO findUser(Integer id);
}
log4j.properties
log4j.rootLogger=DEBUG , stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
DEBUG 2015-03-25 23:35:38,484 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,515 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2015-03-25 23:35:38,640 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 1414521932.
DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]
DEBUG 2015-03-25 23:35:38,953 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select id, username, password, birthday, mobile, tel, email, note from t_user where id = ?
DEBUG 2015-03-25 23:35:39,000 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 1(Integer)
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 1
ykzhen
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@544fe44c]
DEBUG 2015-03-25 23:35:39,046 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 1414521932 to pool.
1.3、总结
笔者通过一个简单的图介绍了最为基本的MyBATIS的运行过程,同时提供了一个简单的例子并运行成功,让读者对MyBATIS有初步的认识,当然这是远远不够的,我们还需要进一步的认识MyBATIS才能更进一步的使用好这个框架,上述的应用还过于简易根本达不到在应用中使用mybatis的程度,不过千里之行始于足下,让我们走进MyBATIS的世界...