Mybatis总结

Mybatis

1环境搭建,单独mybatis使用,没有整合spring框架

  1. 导入相关jar包

Mybatis总结_第1张图片

  1. 在src下新建xml配置文件,Mybatis.xml

在xml导入以下的约束,可以在mybatis文档中找到

3.根据提示完成以下配置


        
	
		
		
		
                
		
			
			
			
			
		
		
	
	
	

4 按照规范来建包,mvc模式,创建以mapper为结尾的包,建立一个实体类名+Mapper.xml,这里为了方便直接把实体类Flower放入了mapper里,正常来说是放在com.liuyi.pojo里

Mybatis总结_第2张图片

FlowerMapper.xml导入mybatis约束,文档内可找到

要在Mybatis.xml中加入一句话导入

Mybatis总结_第3张图片

5 FlowerMapper.xml中是写上需要的方法

resultType写上具体返回值类型,没有给实体类起别名的话就要写全路径,com.liyi.mapper.Flower





        
        
        
	
	
	

6 测试方法,只在单独使用mybatis时使用

package com.liuyi.mapper;

import java.io.*;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class test {
	public static void main(String[] args) throws IOException {
		//先通过流读取文件
		InputStream is=Resources.getResourceAsStream("Mybatis.xml");
		//通过工厂创建对象
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
		//打开session
		SqlSession session=factory.openSession();
		
		//查询多行selectList,根据xml里面写的 id=a.b,方法名是selAll
		List list=session.selectList("a.b.selAll");
		
		for (Flower flower : list) {
			System.out.println("这是多行的查询");
			System.out.println(flower.toString());
		}
                //在xml文件里面,按之前方式定义还可以这样来查
                //查询单个数单个结果的selectOne
		int i=session.selectOne("a.b.selById");
		System.out.println("这是单个的查询"+i);
		
		//查询map
		Map map=session.selectMap("a.b.sel","fname");
		System.out.println("这是map查询");
		System.out.println(map);
        }
}

7 多参数查询在 XXXMapper.xml中,如果方法中有参数则用到parameterType属性

使用#{}在sql语句中获取参数,多个参数时就是#{0},#{1},#{2}这样

或者#{param1},#{param2}

如果参数是对象可这样#{属性名}

如果是map,写成这样#{key}

因为现在还没有整合 Spring框架,传入多参数会很麻烦,可以使用map

int pageSize = 2;
int pageNumber = 2;

Map map = new HashMap<>();
map.put("pageSize", pageSize);
map.put("pageStart", pageSize*(pageNumber-1));
List p =session.selectList("a.b.page",map);

8 给类起别名,一般是在com.liuyi.pojo实体类起别名,直接在mybatis.xml下加入这个就行了,给类起的别名就是类名,可以减少XXXMapper.xml复杂,



以下两个相等



9 使用mybatis实现增删改,这三种方式都没有resultType属性,默认返回值都是int

在mybatis中默认是不提交事务的,所以要自己来提交 session.commit();提交,也可以设置自动提交事务

session.AutoCommit(true);出现异常时用session.rollback();回滚事务

新增


insert into people values(default,#{name},#{age})
People people =new People();
people.setName("666");
people.setAge(16);
int index=session.Insert("a.b.ins",people);
if(index>0)
{
    System.out.println("成功");
}else{
    session.rollback();
}
session.commit();

 

删除


delete from people where id = #{0}
int del = session.delete("a.b
if(del>0){
    System.out.println("成功")

}else{
    System.out.println("失败");
} 
session.commit();

修改


    update people set name = #{name} where id = #{id}
People peo = new People();
peo.setId(3);
peo.setName("王五");
int index = session.update("a
if(index>0){
    System.out.println("成功")
}else{
    System.out.println("失败")
} 

session.commit();

10 Mybatis使用接口方案,整合spring时使用

  1. 1 简单的来说就是创建一个与 实体类+Mapper.xml,相同名字的接口,
  2. 2在配置文件内的namespace就是这个接口的全路径,
  3. 3并且在Mybatis.xml有mapper的扫描标签
  4. 4实体类xml文件的方法id,要与实体接口的方法名一样

    

以下是例子

Mybatis总结_第4张图片

Mybatis总结_第5张图片

10.1 接口绑定环境下的多参数传送,出现多参数时,xml中可以不写parameterType

普通方式

接口下定义方法

List selByAccInAccout(String id,String name);

xml中这样写


    select * from log where id=#{id} and name=#{name}

11 动态sql语句(不熟悉)

就是动态的sql语句,可以加上逻辑判断之类的,可以减少xml代码量

的使用

以下的写法表示按条件查询,如果没有参数id或者name的话就直接查询所有,有id和name的判断,有其中一个值就查

的使用

1 使用where时,内容最前面是and的话,把and删除

2 where中有内容才会生成where关键字,没有where就不会

的使用

1这三个要配合一起用,意思是选择,这几个标签只会有一个生效,以下为例子,如果id不为null或''的话,执行的就只有select * from people where id=?,只执行一个

修改用法

标签会去掉最后一个逗号( , ),标签内有内容才生成标签,和where一样


    update people 
    
        
            id=#{id},
        
         
            name=#{name},
        
    

    where id=#{id}

标签用法

prefix在前面加点东西

prefixOverrides去掉前面一点东西

suffix在后面加点东西

suffixOverrides后面删除一点东西

下面的例子中前面加了set后面去掉了逗号就是一个完整的修改了


    update people
    
    a=a,
    
    where id=#{id}

可以给参数重新赋值,可以在前面加点东西,后面加点东西,通常用在模糊查询中

例子中接收了参数name,用bind重新赋值为%name%,就可以进行模糊查询

通常使用在select * from table where id in();

传入了一个集合,就会在里面遍历,open遍历前加东西,close遍历后加东西,separator每次循环加一个东西

形成这样的语句select * from people where id in(?,?,?,?)

对于某些需要重复使用的代码块

形成以下句子select id,name from people

12 Mybatis实现多表查询

                                     3种方式实现多表查询(起码会其中一种)

     1 业务装配,对两个表写好查询语句,在service层手动业务装配

学生表实体类,学生的tid是一个外键,对应教师表的id,学生实体类内放一个老师对象

Mybatis总结_第6张图片Mybatis总结_第7张图片

教师mapper.xml内写一个根据id来查的方法

Mybatis总结_第8张图片

学生xml内写查询所有就行了

Mybatis总结_第9张图片

(接口绑定后还没整合spring这样来使用mapper接口方法)反射机制,MyBatisUtil封装了获取Session的方法吗,代码和之前一样

Service层手动遍历封装,较麻烦

StudentMapper smapper=session.getMapper(StudentMapper.class);
List list=smapper.selAll();
	TeacherMapper tmapper=session.getMapper(TeacherMapper.class);
	for (Student student : list) {
		student.setTeacher(tmapper.selById(student.getTid()));
	}

2 使用AutoMapping属性,两表联合查询通过别名完成映射

只能是多表联合查询,查出的列要与属性名相同

 

3 Mybatis的标签

类的格式什么的与手动装配一样,这是学生内存放单个老师对象的n+1方式

使用resultMap标签,tid就是外键,这时候查询学生所有就会顺带有老师,内写的是关联表的实体类mapper

Mybatis总结_第10张图片

老师内存放多个学生

Mybatis总结_第11张图片

 

Mybatis总结_第12张图片

Mybatis总结_第13张图片

 

13 Mybatis注解

  可以直接在Mapper接口方法上方写注解@select("")这样格式,mapper.xml可以不用写,可以简化xml文件,当方法很少的时候就不必去写Mapper.xml

Mybatis总结_第14张图片

7实现修改

Mybatis总结_第15张图片

14 关于mybatis延迟加载

 

延迟加载还要在xml配置文件内这样设置

Mybatis总结_第16张图片

通过以下这种方式才能实现延迟加载,也就是比如查询user就在accountMapper接口下定义selById的方法,user再调用,如果是使用resultmap方式,一个表外连接另一个表的就会一股脑全部查出来






 

你可能感兴趣的:(Mybatis,java框架)