目录
mybatis
mybatis与hibernate的区别(-----------面试题!!!-------------)
用实例代码来给大家更深入的了解mybatis
mybatis
mybatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
可以这么认为,mybatis就是一个可以用于替换DBHelper类的半自动持久层框架,因为没有学Mybatis之前,我们以前都是需要写DBHpler类的,每一次都要去创造连接、创造执行对象、创造查询结果集,还有其他一系列操作,有点麻烦,但是mybatis就可以替代了DBHpler了。(以前的DBHpler可以认为是个原始社会)
mybatis作用于dao层,使用mybatis框架我们可以快速的数据访问与数据提交,主要的操作是SQL Maps和Data Access Objects(DAO)。
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。(在没有用到Mybatis之前我们做一个增删改查,必须要使用占位符,而且要按照占位符顺序一个一个的传参,以及结果集的检索,查询遍历都由Mybatis做了)
MyBatis使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录(对于这段我们有个专门的称呼 ORM)。
ORM(Object Relational Mapping):对象关系映射
理解为:Java对象与数据库表的映射管理框架,更简单的说:在我们没有用到Mybatis之前,我们需要数据库里面的字段类型必须与java中的实体对象一一对应,不一样肯定会报错了,再这么说用了Mybatis用了后可以自动完成java对象与数据库表数据的映射关系,这是mybatis一个核心的概念!。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory(Factory是一个工厂类,是来生成前者的,需要拿到SqlSession的会话)实例可以通过SqlSessionFactoryBuilder获得。
SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
mybatis:ORM框架,持久层框架,用于控制数据的访问
mybatis.xml(定义了mybatis的基本配置和连接数据库的配置信息)
SqlSessionFactoryBuilder完成mybatis.xml配置文件的加载操作
SqlSessionFactoryBuilder --> SqlSessionFactory实例
SqlSessionFactory --> SqlSession
SqlSession -> 数据库层面增删改查操作
以上是mybatis的文件加载流程
如何拿到SqlSessionFactory,根据SqlSessionFactoryBuilder来创建SqlSessionFactory,再从SqlSessionFactory拿到SqlSession
mybatis与hibernate的区别(-----------面试题!!!-------------)
两者均为ORM框架,都用于控制数据访问,但也有一些不同
mybatis hibernate
轻量级 重量级
半自动化 全自动化
sql hql,不需要写sql语句也能完成增删改查,最开始研发出来的初衷就··是为了让我们不用写sql语句,但是在很复杂的sql语句中,hql就不行了(但也可以使用sql,但违背了hibernate的初衷)
扩展性、迁移性比较差(可以支持多种数据库但有语法差异) 无缝移植(可以支持多种数据库)
用实例代码来给大家更深入的了解mybatis
使用maven创建项目,并添加web支持
添加相关依赖
junit 4.12
javax.servlet-api 4.0.0
mybatis 3.4.5
mysql-connector-java 5.1.44
配置web3.0,在main/webapp/WEB-INF下面,web.xml有且只有一个根标签
新建java目录和测试目录test
引入一个jdbc.properties文件到main/resources里面
在jdbc.properties里面第二行t272是我的数据库名,写自己数据库,
下面两行是数据库账密
介绍一下mybatis.cfg.xml文件
需要在java目录下导入一个帮助类MybatisSessionFactoryUtils.java.
需要在pom类加入一个自己生成代码依赖
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
${mysql.version}
true
在resources下面添加一个generatorConfig.xml文件,用来自动生成代码
自动生成代码后会出现这些类,请注意生成前与生成后的区别
点击Bookmapper.java的小红鸟就会跳转到Bookmapper.xml
跳转后
由于我的数据库的id字段是自增的所以这里的insert新增方法可以吧id删掉,包括values的id字段;
在BookMapper.java已经给我们生成了很多方法,删除修改新增等等,现在我们加一个查询方法
新增方法的话会报红线,这时候按Alt+Enter回车键就可以跳出方法点击红色的跳转到BookMapper.xml并自动给我们生成一部分代码,剩下的只需要自己写sql语句
在中间加入
selectfrom t_book
refid="Base_Column_List/"其实就是自动给你生成的sql字段名的别名
book_id, book_name, book_name_pinyin, book_price, book_type, book_image
在上面给你生成了
book_id, book_name, book_name_pinyin, book_price, book_type, book_image
在BookMapper.java里写方法名系统是可以识别一般的方法名的,会谈提示框,很智能,还有BookMapper.java里面查询的方法名必须与BookMapper.java里自动生成的查询方法名保持一致,不然会报错
在mybatis目录下增加一个service层,在service里面添加一个IBookServer.java用来定义接口,将BookMapper.java里面的方法复制过去,现在我们这边不需要太多,只加了一个查询方法和新增方法。
public interface IBookServer {
public int insert(Book record);
public List queryBookAll();
}
还要创建接口所对应的实现类
光标移到IBookServer上面,Alt加Enter回车键会跳出提示框,点击第四个Implement interface
跳出
爆红没关系, 按照以上修改即可
跳到
选择这两个方法点击ok
剩下的工作就是用Server调用mapper层的接口
怎么调?
Alt加Inser得到提示框选择Getter and Setter在点击BookMapper的方法ok
得到
在下面的方法上写
ok,以上的Server层代码完毕
现在来做测试
光标移到BookServerImpl上Alt加回车键得到提示框
点击Create Test 创建测试类
根据下图修改
得到
该测试类在test目录下
继续写
package com.zking.mabatis.server.imp;
import com.zking.mabatis.mapper.BookMapper;
import com.zking.mabatis.model.Book;
import com.zking.mabatis.server.IBookServer;
import com.zking.mabatis.util.MybatisSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
public class BookServerImplTest {
private IBookServer bookServer;
private Book book=null;
private SqlSession sqlSession;
@Before
public void setUp() throws Exception {
//初始化book 目的:setUp在每一个方法前执行一次 down在每一个方法结束前执行一次
book=new Book();
//打开会话
sqlSession = MybatisSessionFactoryUtils.openSession();
//拿到mapper层的接口
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
BookServerImpl bookServerImpl=new BookServerImpl();
//给实现类赋值
bookServerImpl.setBookMapper(mapper);
// 将实现类给接口接收使用接口来接收代理对象
bookServer=bookServerImpl;
}
@After
public void tearDown() throws Exception {
//提交
sqlSession.commit();
//关闭链接
MybatisSessionFactoryUtils.closeSession();
}
@Test
public void insert() {
book.setBookName("三毛流浪记");
book.setBookPrice(100f);
book.setBookType("故事");
bookServer.insert(book);
}
@Test
public void queryBookAll() {
List boos=bookServer.queryBookAll();
boos.forEach(System.out::println);
}
}
点击代方法左边的播放按钮单独执行方法
在mybatis.cfg.xml加一个驼峰命名
//驼峰命名 可以自动转换



