关于mybatis的简介就不重复累赘了,百度一下会出来很多。这里贴上官方简介:http://www.mybatis.org/mybatis-3/zh/index.html
参考资料也来源于以上链接。
简单聊一聊,自己对mybatis相比较hibernate和基于hibernate的ORM类型框架的优势:
1、系统所需的部分或全部数据来自已有的数据库,出于安全考虑,只对开发团队提供查询语句或存储过程来获取所需数据,具体的表结构不予公开。那么这个时候就需要类似select * from (select * from xxx..)的复合语句来获取数据,hibernate相较于mybatis就没有这么灵活了;
2、对于银行等对开发规范要求严格的企业,大部分会强制要求对数据库的操作都以存储形式的过程进行,mybatis也是具有优势的;
3、系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须使用高度优化的SQL或存储过程才能达到性能指标,也得益于mybatis对SQL的高度可定制的优势;
4、最重要的一点就是可以锻炼数据库能力啦(^_^)。
1、搭建环境(任选其一,当前demo选择的是maven项目)
a.从https://github.com/mybatis/mybatis-3/releases(mybatis官方的git)下载mybatis的压缩包,解压后在lib文件夹下有mybatis需要的jar包,将其配置进项目就可以使用mybatis框架的功能了。
提示:由于mybatis是基于JDBC的,因此还需要将JDBC的驱动包加进去,使用哪个数据库就加相应的驱动。
b.新建一个mavan项目,加入下面的依赖
org.mybatis
mybatis
3.4.6
mysql
mysql-connector-java
8.0.11
2、mybatis的数据库操作
a.首先在数据库中执行下面sql创建一个数据库和表
#创建一个名称为mybatis的数据库;
CREATE DATABASE mybatis;
#使用这个数据库
USE mybatis;
#创建一个tb_user表,有id、name、gender、age字段
CREATE TABLE `tb_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_gender` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_age` int(11) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
b.接下来,在所有ORM框架中都有一个重要的媒介,PO(持久化对象)。
简单说明:ORM(Obeject/Relation Mapping即对象/关系映射),提倡的是用面向对象的方式进行持久化操作。
注意:mybatis中PO设计要遵循低侵入式设计。即一个字段对应一个持久化对象(PO)属性,不要求持久化类继承任何父类、或者实现任何接口(实现序列化接口除外),保证代码不被污染。另外一点就是,所有的属性不要使用基本数据类型,要使用包装类型(并不是说用基本数据类型不能运行之类的,但是在实际项目开发中,使用基本数据类型有可能会导致在整合其他框架的过程中反序列化失败)。
public class User {
private Integer userId;
private String userName;
private String userGender;
private Integer userAge;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserGender() {
return userGender;
}
public void setUserGender(String userGender) {
this.userGender = userGender;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public User() {
super();
}
public User(Integer userId, String userName, String userGender, Integer userAge) {
super();
this.userId = userId;
this.userName = userName;
this.userGender = userGender;
this.userAge = userAge;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userGender=" + userGender + ", userAge="
+ userAge + "]";
}
}
c.创建mapper映射文件和mybatis配置文件
mapper映射文件
INSERT INTO tb_user (user_name, user_gender, user_age)
VALUES
(#{userName}, #{userGender}, #{userAge});
mapper文件说明:
#和$的区别(mapper文件没有体现):底层实现方式就是JDBC中PreparedStatement和Statement的区别,一个是预编译进行,一个是直接发送SQL语句到数据库。直接发送sql语句到数据容易被sql注入。
在
使用parameterType属性值名插入时使用的参数类型
使用useGeneratedKeys=true表示使用数据库自增长策略,这需要底层数据库的支持(比如oracle不支持自增长)。
mybatis配置文件(后续博客会详解配置文件):
log4j配置文件及maven依赖(后续博客会详解log4j):
#全局的日志配置
log4j.rootLogger=ERROR, stdout
#mybatis的日志配置
log4j.logger.com.zepal.study.dao.UserDao=DEBUG
#控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
log4j
log4j
1.2.17
commons-logging
commons-logging
1.2
d.测试类(这里遇到了一个问题无法解决:从类路径下加载mybatis-config.xml配置文件的时候,必须要在配置文件前面加一个文件夹,否则一直报错SqlSessionFactory空指针,官方文档没有给出说明,就暂时跳过了)
public class Test {
public static void main(String[] args) throws IOException {
//从类路径下读取配置文件,不在此路径下请从其他路径加载
InputStream is = Test.class.getResourceAsStream("/mybatis/mybatis-config.xml");
//初始化mybatis,创建SqlSessionFactory的实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建sqlsession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建User对象,因为前面mapper文件使用了自增长策略,这里就不添加userId属性
User user = new User();
user.setUserName("zepal");
user.setUserGender("男");
user.setUserAge(18);//当然是希望看到这篇博文的朋友永远18岁,哈哈
//指明调用mapper文件中的哪个方法(注意是全路径),插入数据,返回受影响的行数
int result = sqlSession.insert("com.zepal.study.dao.UserDao.saveUser", user);
System.out.println("insert受影响的行数 :" + result);
//提交事务
sqlSession.commit();
//关闭sqlSession,应该保证在finally中关闭,这里就不演示了
sqlSession.close();
}
}
e.完整的项目结构
f.运行测试类(很明显的在控制台看到程序运行执行的SQL语句,以及受影响的行数)
g.总结
执行上述过程,不难发现,PO(持久化对象)只有在SqlSession的管理下才可完成对数据库的访问。
使用mybatis进行持久化操作,通常有如下步骤:
1、开发持久化类PO和编写mapper.xml文件,并在mapper文件中定义要执行的sql语句;
2、获取SqlSessionFactory
3、获取SqlSession
4、用面向对象的方式(即通过SqlSession调用其方法,SqlSession的常用方法会在后续博文中讲解)操作数据库
5、提交事务,关闭SqlSession连接
通过上面的介绍可以知道,mybatis的持久化解决方案是将用户从原始的JDBC操作中解放出来,用户只需要关系sql语句的编写,无需关心底层的JDBC操作,就可以以面向对象的方式进行持久化操作。
在mybatis的所有操作中,都离不开Mybatis的核心对象SqlSessionFactory。所以在使用mybatis之前,不管三七二十一先创建一个SqlSessionFactory总是没错的(当然,在实际开发中需要关心的重点就是怎么去创建SqlSessionFactory,比如在整合Spring中就应该将SqlSessionFactory交给Spring的IOC容器去管理)。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuilder则可以从XML配置文件(本博文的方式)或一个预先定制的Configuration的实例(http://www.mybatis.org/mybatis-3/zh/getting-started.html这里已经给出了说明)构建出SqlSessionFactory。
通过预先定制的Configuration构建SqlSessionFactory实例
SqlSessionFactory的常用方法就是openSession(),以此创建出SqlSession对象,利用SqlSession对象就可以愉快的操作CRUD了。
SqlSession的常用方法如下(SqlSession是持久化对象,里面几乎包含了所有CRUD操作,初学者请尝依次调用下面所列的所有方法,并分析结果):
int insert(String statement) |
插入方法。参数statement是mapper映射文件中定义的 |
int insert(String statement, Object parameter) |
插入方法。参数statement是mapper映射文件中定义的 |
int update(String statement) |
更新方法。参数statement是mapper映射文件中定义的 |
int update(String statement, Object parameter) |
更新方法。参数statement是mapper映射文件中定义的 |
int delete(String statement) |
删除方法。参数statement是mapper映射文件中定义的 |
int delete(String statement, Object parameter) |
删除方法。参数statement是mapper映射文件中定义的 |
|
查询方法。参数statement是mapper映射文件中定义的 |
|
查询方法。参数statement是mapper映射文件中定义的 |
|
查询方法。参数statement是mapper映射文件中定义的 |
|
查询方法。参数statement是mapper映射文件中定义的 |
|
查询方法。参数statement是mapper映射文件中定义的 |
|
查询方法。参数statement是mapper映射文件中定义的 |
查询方法。参数statement是mapper映射文件中定义的 | |
查询方法。参数statement是mapper映射文件中定义的 | |
void select(String statement, ResultHandler handler) | 查询方法。参数statement是mapper映射文件中定义的 |
void select(String statement, Object parameter, ResultHandler handler) | 查询方法。参数statement是mapper映射文件中定义的 |
void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) | 查询方法。参数statement是mapper映射文件中定义的 |
void commit() | 提交事务 |
void rollback() | 回滚事务 |
void close() | 关闭SqlSession对象 |
Connection getConnection() | 获取JDBC的数据库连接对象 |
返回mapper接口的代理对象,该对象关联了SqlSession对象,开发者可以通过该对象直接调用方法操作数据库,参数type是Mapper的接口类型。Mybatis官方手册建议通过mapper对象访问Mybatis。 |
下面贴出官方的介绍及注意事项,原文地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html: