本文共 16613 字,大约阅读时间需要 55 分钟。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。
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
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
db.properties:
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/yccz?characterEncoding=utf8jdbc.username=rootjdbc.password=mysql
mybatis-config.xml:
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; }}
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 ListqueryClass(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(); }
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})
在配置文件中加上:
添加后的mybatis-config.xml
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 Listlist = 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
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); Listlist = 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()); } }
作用:
将查询结果按照sql列名pojo属性名一致性映射到pojo中。场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。
作用:
将关联查询信息映射到一个pojo对象中。场合: 为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。 使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。作用:
将关联查询信息映射到一个list集合中。场合: 为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。 如果使用resultType无法将查询结果映射到list集合中。resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
需求:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。
要开启延迟加载需要在配置文件中加入如下配置:说明:时间有限,没有把知识点整理得有条理些,但是已经尽量包含了mybatis的大部分用法了,请将就着看。
转载地址:http://dmzda.baihongyu.com/