博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis
阅读量:6177 次
发布时间:2019-06-21

本文共 16613 字,大约阅读时间需要 55 分钟。

一、什么是mybatis

  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。

二、开发实例基本步骤:

1. 官网下载mybatis的jar包及源码包。

  

2. Eclispe创建maven工程。

_HUK_E9QRP_6SZ3_CXB4YCT

3. 在pom文件引入一些相关的jar包。

4.0.0
com.mybatis
mybatisdemo
1.0
jar
mybatisdemo
http://maven.apache.org
UTF-8
junit
junit
4.12
test
mysql
mysql-connector-java
5.1.38
org.mybatis
mybatis
3.4.5
log4j
log4j
1.2.17
com.github.pagehelper
pagehelper
4.1.4
org.apache.maven.plugins
maven-compiler-plugin
3.6.1
1.8
1.8

4. 新建resources资源文件夹,引入log4j配置文件。

log4j.properties:

#在开发环境下日志级别要设置成debug,生产环境设置成info或errorlog4j.rootLogger=debug, stdout log4j.logger.com.mybatis.myb.dao =TRACElog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%nlog4j.appender.stdout.encoding=utf-8

5. 编写mybatis配置文件 参考资料:

db.properties:

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/yccz?characterEncoding=utf8jdbc.username=rootjdbc.password=mysql

mybatis-config.xml:

6. 编写数据库中对应的JavaBean类

package com.mybatis.myb.model;import java.util.Date;public class ClassBean{        private Integer classId;    private String className;        private Date classTime;    private String classRoom;        private TeacherBean teacher;        public Integer getClassId() {        return classId;    }    public void setClassId(Integer classId) {        this.classId = classId;    }    public String getClassName() {        return className;    }    public void setClassName(String className) {        this.className = className;    }    public Date getClassTime() {        return classTime;    }    public void setClassTime(Date classTime) {        this.classTime = classTime;    }    public String getClassRoom() {        return classRoom;    }    public void setClassRoom(String classRoom) {        this.classRoom = classRoom;    }    public TeacherBean getTeacher() {        return teacher;    }    public void setTeacher(TeacherBean teacher) {        this.teacher = teacher;    }}
package com.mybatis.myb.model;public class TeacherBean {        private Integer tId;        private String cTeacher;        private Integer type;        public Integer gettId() {            return tId;        }        public void settId(Integer tId) {            this.tId = tId;        }        public String getcTeacher() {            return cTeacher;        }        public void setcTeacher(String cTeacher) {            this.cTeacher = cTeacher;        }        public Integer getType() {            return type;        }        public void setType(Integer type) {            this.type = type;        }}

7. 编写Mapper接口

package com.mybatis.myb.dao;import java.util.List;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import com.mybatis.myb.model.ClassBean;public interface ClassDao {    public List
queryClass(ClassBean vo); public int insertclass(ClassBean vo); //数据库语句写在注解里面,就不用再在xml文件里面配置了,不推荐这种方式 @Select("select * from t_class where classid=#{a} and classname=#{b}") public List
queryClassByVo(@Param("a")int classid,@Param("b")String classname); public List
queryInfoByIds(@Param("list")List
list); public List
queryInfoByIdsaa(@Param("ids")String ids); public List
selectAll(); public List
selectByClass(); }

8. 编写MapperXML文件

SELECT * FROM t_class
update t_class
classname=#{className},
class_teacher=#{classTeacher},
insert into t_class(classname,class_teacher,class_time,class_room) values(#{className},#{classTeacher},now(),#{classRoom})
delete from t_class where classid in(${ids})

9. 在mybatis配置文件中注册MapperXML文件

在配置文件中加上:

添加后的mybatis-config.xml

10. 编写一个SqlSessionFactory及SqlSession获取工具类

11. 编写一个测试类

package com.mybatis.myb.dao;import java.io.Reader;import java.util.ArrayList;import java.util.List;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.junit.After;import org.junit.Before;import org.junit.Test;import com.mybatis.myb.model.ClassBean;public class ClassDaoTest {    SqlSession session = null;//sql会话    Reader reader  = null;//文件输入字符流    //测试类运行之前执行    //初始化    @Before    public void setUp() throws Exception {        String resourse = "mybatis-config.xml";        //加载配置文件,创建会话工厂        reader = Resources.getResourceAsReader(resourse);        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);        //创建会话对象,相当于JDBC获取连接对象        session = ssf.openSession(false);    }    //测试类运行之后执行    @After    public void tearDown() throws Exception {        session.close();        reader.close();    }    @Test    public void testQueryClass() {        //创建会话对象后获取接口对象        ClassDao dao = session.getMapper(ClassDao.class);        ClassBean model = new ClassBean();        //model.setClassTeacher("刘老师");        model.setClassName("UI");        //经过上面的工作后,直接调用接口方法即可实现响应的查询。        //需要传参的可以根据需要直接传基本数据类型,也可以传一个对象,mybatis会获取有值的对象属性作为参数传给MySQL        List
list = dao.queryClass(model); for(ClassBean vo : list){ //System.out.println(vo.getClassTeacher()); } } @Test public void testInsertClass() { try{ ClassDao dao = session.getMapper(ClassDao.class); ClassBean model = new ClassBean(); //model.setClassTeacher("xxx"); model.setClassName("javaee"); model.setClassRoom("1hao"); dao.insertclass(model); System.out.println(model.getClassId()); session.commit(); }catch(Exception e){ e.printStackTrace(); session.rollback(); } } @Test public void testqueryClassByVo(){ ClassDao dao = session.getMapper(ClassDao.class); dao.queryClassByVo(8, "javaee"); } @Test public void test(){ ClassDao dao = session.getMapper(ClassDao.class); List
list = new ArrayList
(); ClassBean model = new ClassBean(); model.setClassId(1); list.add(model); model = new ClassBean(); model.setClassId(2); list.add(model); List
s = dao.queryInfoByIds(list); } @Test public void tst(){ ClassDao dao = session.getMapper(ClassDao.class); String ids = "1,2,3,4"; List
s = dao.queryInfoByIdsaa(ids); } @Test public void testQueryAll(){ ClassDao dao = session.getMapper(ClassDao.class); List
s = dao.selectByClass(); for(ClassBean vo : s){ System.out.println(vo.getTeacher().getcTeacher()); } } @Test public void findUserById() throws Exception { //可以根据查询结果直接调用session的方法,第一个参数是mapper文件的namespace加“.”加方法id,如果需要给数据库传参数则加在第二个参数里。 List
cb = session.selectList("com.mybatis.myb.dao.ClassDao.selectByClass"); for (ClassBean classBean : cb) { System.out.println(classBean.getTeacher().getcTeacher()); } }}

补充:mybatis的xml文件实际上就是用来封装MySQL语句和传参的,为了某些需求,一般会把查询条件和一些循环等等用标签做处理。

虽然mybatis没有else标签,但是有另外一种方式可以用于逻辑选择,那就是choose标签。

xml配置:说明:    flag==1:不等于room;flag==2:等于room;否则模糊查询room

一对多补充

编写MapperXML文件

在mybatis配置文件中注册MapperXML文件

测试类

package com.mybatis.myb.dao;import java.io.Reader;import java.util.ArrayList;import java.util.List;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.junit.After;import org.junit.Before;import org.junit.Test;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import com.mybatis.myb.model.Category;public class CatgoryDaoTest {    SqlSession session = null;//sql会话    Reader reader  = null;//文件输入字符流    //测试类运行之前执行    //初始化    @Before    public void setUp() throws Exception {        String resourse = "mybatis-config.xml";        //加载配置文件,创建会话工厂        reader = Resources.getResourceAsReader(resourse);        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);        //创建会话对象,相当于JDBC获取连接对象        session = ssf.openSession(false);    }    //测试类运行之后执行    @After    public void tearDown() throws Exception {        session.close();        reader.close();    }    @Test    public void test() {        //获取接口对象        CatgoryDao dao = session.getMapper(CatgoryDao.class);        List
list = dao.selectAll(); System.out.println(list.size()); } @Test public void test1() { //获取接口对象 CatgoryDao dao = session.getMapper(CatgoryDao.class); List
list = dao.select(); System.out.println(list.size()); } //selectByID @Test public void testselectByID() { //获取接口对象 CatgoryDao dao = session.getMapper(CatgoryDao.class); List
list = dao.selectByID(); System.out.println(list.size()); } @Test public void testPageInfo() { //获取接口对象 CatgoryDao dao = session.getMapper(CatgoryDao.class); //传参 Category cat = new Category(); cat.setCurrentPage(4); cat.setPageSize(5); int count = dao.getCount(cat); List
list = new ArrayList
(); if(count>0){ list = dao.selectByLimit(cat); } for(Category c:list) { System.out.println("name:"+c.getCatName()); } //com.mybatis.myb.model.PageInfo
pageinfo = new PageInfo
(); //pageinfo.setTotal(count); //pageinfo.setList(list); } @Test public void testPageInfoPlugin() { //获取接口对象 CatgoryDao dao = session.getMapper(CatgoryDao.class); PageHelper.startPage(1, 4); List
list = dao.selectAll1(); PageInfo
info = new PageInfo
(list); System.out.println(info.getList().size()); } }

resultMap总结

resultType:

作用:

  将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:
  常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap:

  使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

association:

作用:

  将关联查询信息映射到一个pojo对象中。
场合:
  为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
  使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

collection:

作用:

  将关联查询信息映射到一个list集合中。
场合:
  为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。
  如果使用resultType无法将查询结果映射到list集合中。

延迟加载

resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

需求:
如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。

要开启延迟加载需要在配置文件中加入如下配置:

说明:时间有限,没有把知识点整理得有条理些,但是已经尽量包含了mybatis的大部分用法了,请将就着看。

转载地址:http://dmzda.baihongyu.com/

你可能感兴趣的文章
计算机网络基础
查看>>
一步步打造漂亮的新闻列表(无刷新分页、内容预览)(2)
查看>>
cron任务计划
查看>>
我也参加了唐骏一手推动的【2015年微创中国运动会】
查看>>
认证模式之SSL模式
查看>>
如何在 Linux 中统计一个进程的线程数
查看>>
NVIDIA新作解读:用GAN生成前所未有的高清图像(附PyTorch复现) | PaperDaily #15
查看>>
CString、CTime和COleDateTime转换
查看>>
在linux虚机中装vmtools
查看>>
WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
查看>>
linux设备驱动程序--类class的实现
查看>>
中国云计算应用进入集中爆发期
查看>>
算法精解---计数排序
查看>>
DockOne微信分享(一二八):容器如何监控?
查看>>
谈谈分布式事务(Distributed Transaction)[共5篇]
查看>>
如何确保快递“最后一公里” ,亚马逊打算送到你的汽车后备箱
查看>>
Gartner:财务应用迁移到云 速度超出预期
查看>>
阿里云向物流业渗透 货运司机受益
查看>>
灾难恢复的人为因素:经理们应该做的10件事情
查看>>
中国教育行业可能到了最不平凡的10年:要么创新,要么死亡
查看>>