1. 理解mybatis的概念及优点特性
2. 搭建mybatis开发环境(重点)
3.了解mybatis与jdbc的区别和联系
4. 了解mybatis的优缺点及应用场合
1. MyBatis前身是iBatis,本是Apache的一个开源的项目
2. 官方网站:http://mybatis.org
国内访问不到,需要到GitHub上下载release版本。github.com/mybatis
3. ORM框架
4. 实体类和SQL语句之间建立映射关系
5. 特点:
a) 基于SQL语法,简单易学
b) 能了解底层封装过程
c) SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
d) 方便程序代码调试
1. 下载MyBatis-3.2.2.jar包并导入工程
2. 编写mybatis核心配置文件(configuration.xml)
配置文件名称可以更改。
核心配置文件,mybatis主要是dao层,连接数据库,对数据库的表增删改查,核心配置文件很重要的一件事就是连接数据库。还可以进行一些设置,属性配置,影响mybatis的行为设置。
3. 创建实体类-POJO
因为是ORM对象关系映射,所以要创建一些POJO。
4. DAO层-SQL映射文件(mapper.xml)
SQL映射文件都写在mapper.xml中
5. 创建测试类(模拟service层调用dao层)
1)读取全局配置文件mybatis-config.xml
2)创建SqlSessionFactory对象,读取配置文件
3)创建SQLSession对象
4)调用mapper文件进行数据操作
原因:在mybatis开发的时候,数据库表的字段名和POJO的属性名最好命名方式一致,有效进行自动映射。
1. 首先在github(https://github.com/mybatis/mybatis-3)上下载所需要的mybatis的release版本。其中有一个mybatis的jar包。在lib文件夹下,有编译所依赖的jar包:
asm操作java字节码的类库
cglib动态继承java类或实现接口
commons-logging通用日志处理
javaassist分析编辑创建java字节码类库
log4j日志系统
slf4j日志系统的封装,对外提供统一API接口
sel4j-log4j对log4j的相应驱动
2. 将mybatis,log4j,mysql-connector-java的jar包都引入到新建的web project中。并且add to build path。
3. 引入mybatis的源码。选中referenced libraries文件夹下面的mybatis的jar文件,右键 Properties,java source attachment选项卡,选择location path。如果是zip文件选择external file,如果是folder,选择external folder。
configuration.xml是mybatis的核心配置文件,配置数据库连接及设置。可以放在src目录下,但是为了方便框架集成及管理,新建可编译的source folder为resources。
起一个有标志性的配置文件名字,新建mybatis-config.xml,配置数据库连接及mybatis行为属性。
读取数据库配置文件,这个写到一个属性文件里面,database.properties,写到resources目录下。
因为使用了log4j,所以在resources下,需要log4j.properties属性文件。
在mybatis-config.xml文件中对以上两个属性文件进行引入。
编写mybatis核心配置文件:
1. 首先根据mybatis的官方手册,引入mybatis的头信息。
2. configuration元素是根节点
3. 第一步需要通过configuration子节点properties元素,有一个resource属性,把要跟数据库进行连接的配置文件引入进来,指定属性文件,把属性文件引入进来。
4. 在mybatis中可以配置多套运行环境,通过environments,environments下面可以有多个environment。environments有一个属性是default,指定默认运行环境,即是environment的id。注意,可以配置多套运行环境environment,但是每套运行环境environment的id属性都必须唯一。
5. environment需要配置事务管理,数据源。transactionManager事务使用JDBC。dataSource数据源使用mybatis自带的POOLED,也可以使用Tomcat中的JNDI。此项目我们使用POOLED。在dataSource数据源元素下,取出database.properties文件中key值对应的value值。
6. 配置完environments后,可以配置settings,设置mybatis的运行行为。比如设置mybatis的log日志。设置mybatis的日志实现为log4j。
7. 配置完成后,发现configuration报错,是因为节点顺序不对。mybatis的核心配置文件节点是由顺序的。可以点击design,右键configuration,add child,settings等,会出现在正确的位置上,再进行编辑。
database.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:33306/SMBMS?useUnicode=true&characterEncoding=utf8
username = root
password =root
log4j.properties
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/xie/Documents/log/SSM/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/xie/Documents/log/SSM/logs/error.log ## 异常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
mybatis-config.xml
创建web project SMBMS,创建包cn.smbms.pojo,创建类User。mybatis是POJO和SQL语句的映射,所以要保证POJO类中的属性名与数据库表的字段名一致。
package cn.smbms.pojo;
import java.util.Date;
public class User {
private int id; // id
private String userCode; // 用户编码
private String userName; // 用户名称
private String userPassword; // 用户密码
private int gender; // 性别
private Date birthday; // 出生日期
private String phone; // 电话
private String address; // 地址
private int userRole; // 用户角色
private int createdBy; // 创建者
private Date creationDate; // 创建日期
private int modifyBy; // 修改者
private Date modifyDate; // 修改日期
public User() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getUserRole() {
return userRole;
}
public void setUserRole(int userRole) {
this.userRole = userRole;
}
public int getCreatedBy() {
return createdBy;
}
public void setCreatedBy(int createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public int getModifyBy() {
return modifyBy;
}
public void setModifyBy(int modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
}
新建包cn.smbms.dao.user,创建UserMapper.xm映射文件,引入头部信息:
在这个配置文件中,主要是定义一些SQL语句,根节点是mapper,mapper中只有一个属性是namespace,主要是为了区别其他的mapper,达到全局唯一,其实就是UserMapper的全路径名称。
为了在mapper的xml文件中有提示信息,需要手工引入mybatis-3-mapper.dtd文件和mybatis-3-config.dtd。
将下载下来的mybatis的jar文件,以压缩包的形式打开,在mybatis-3.2.2/org/apache/ibatis/builder/xml路径下,有这两个dtd文件。将这两个dtd文件拷贝出来放在本地/Users/xie/Documents/SSM路径下。
在myeclipse中选择preferences,选择XML catalog,在右侧选择user specified entries。选择add,在弹出的对话框中,选择file system,在key中填入PUBLIC后面的内容-//mybatis.org//DTD Config 3.0//EN。mapper类似。
至此,在xml文件中就有自动联想功能。有提示信息便于开发工作。
查询用select,id属性表示该命名空间下的唯一标识符。resultType返回结果类型。
src下的cn.smbms.dao.user
新建source folder test,建立测试类cn.smbms.user.UserMapperTest。
在测试类的测试方法中,第一步,首先把mybatis-config的测试文件读入进来。
String resource = "mybatis-config.xml";
第二步,需要保存记录数,用count接收
int count = 0;
第三步,还需要一个sql会话,提前声明出来,下面会用到。
SqlSession sqlSession = null;
第四步,获取mybaits-config.xml的输入流
InputStream is = Resources.getResourceAsStream(resource);
第五步,创建SqlSessionFactory,通过会话工厂得到相应的sql会话
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
第六步,创建sqlSession
sqlSession = factory.openSession();
第七部,将mapper配置文件引入到mybatis-config文件中,不然后面找不到
第八步,有了sqlSession就可以通过sqlSession调用mapper文件来对数据进行操作。参数为namespace.count
sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
第九步,打印日志,使用log4j
private Logger logger = Logger.getLogger(UserMapperTest.class);
第十步,打印message
logger.debug("UserMapperTest count--->" + count);
第十一步,打开会话后,一定要有关闭会话,写到finally里面
sqlSession.close();
package cn.smbms.dao.user;
import static org.junit.Assert.*;
import java.io.IOException;
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 org.apache.log4j.Logger;
import org.junit.Test;
public class UserMapperTest {
//9.使用log4j打印日志
private Logger logger = Logger.getLogger(UserMapperTest.class);
@Test
public void test() {
//1. 声明配置文件
String resource = "mybatis-config.xml";
//2.使用一个变量接收返回的值
int count = 0;
//3.声明sqlSession,后续会用
SqlSession sqlSession = null;
try {
//4.通过输入流读取配置文件
InputStream is = Resources.getResourceAsStream(resource);
//5.创建SqlSessionFactory,通过会话工厂得到相应的SQL会话
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//6.创建sqlSession
sqlSession = factory.openSession();
//7.将mapper配置文件引入到
//8.有了sqlSession,就可以通过mapper文件对数据进行操作,参数为namespace.id
count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
//10.打印message
logger.debug("UserMapperTest ---> " + count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
sqlSession.close();
}
}
}