栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis

mybatis 一、Mybatis基础

为什么要使用MyBatis?

• MyBatis是一个半自动化的持久化层框架。

• JDBC

​ – SQL夹在Java代码块里,耦合度高导致硬编码内伤

​ – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

• Hibernate和JPA

​ – 长难复杂SQL,对于Hibernate而言处理也不容易

​ – 内部自动生产的SQL,不容易做特殊优化。

​ – 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难,导致数据库性能下降。

• 对开发人员而言,核心sql还是需要自己优化

• mybatis使sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。

整体配置流程:

    写全局配置文件

    记录一些数据源、sql映射文件位置等信息

    写sql映射文件

    在标签里编写sql语句

    将sql映射文件注册在全局配置文件中

    编写代码

      根据全局配置文件获得sqlsessionFactory

      使用sqlsessionFactory获得sqlsession

      一个sqlsession就是代表和数据库的一次会话,用完关闭

      使用sql的唯一标识来告诉sqlsession执行哪个sql

接口式编程:

sql映射文件通过namespace与接口实现绑定,通过id实现对接口方法的绑定。

虽然没有写实现类,但mybatis会根据对应的sql映射文件生成对应的代理对象

接口:

public interface EmployeeDao {

    Employee selectEmployee(int id);
}

sql映射文件:




	

    
    
    
    	select * from employee where id = #{id}
    

返回多条记录的map:

​ resultType为map集合value对应的类型,并且要通过@MapKey注解在对应方法上指定map集合的key

接口:

	//指定实体中哪个属性作为map集合的key
	@MapKey("lastname")
 	Map getEmp();

   
sql映射文件:

 
      select id,last_name,gender,email from employee where last_name=#{lastname}
 
3.4.1.1 场景一

查询Employee的同时查询员工对应的部门:

​ 方法一:多表查询:级联属性封装结果集

​ 方法二:使用association定义单个对象的封装规则

java bean:

为了简洁set/get方法没写

public class Employee {

    private int id;
    private String lastname;
    private char gender;
    private String email;
    private Department dept;

}

public class Department {

    private int id;
    private String deptName;

}


方法一:级联属性封装结果集

sql映射文件:

	
    
        
        
        
        
        
        
        
        
    

    
    
        select e.*,d.dept_name
        from  employee e
        inner join dept d
        on e.dept_id = d.id
        where e.id = #{id}
    

使用association分步查询:

select:表明当前属性是调用select指定的方法查出的结果

column:指定将哪一列的值传给这个方法

整体流程:使用select指定的方法(传入column指定的这列参数的值)查出对象并封装给property指定的属性

分布查询支持延迟加载,即用的时候才加载:

​ 比如分布查询:查只用员工信息的话,那么就不会加载相关部门信息

EmployeeMaper.xml:

	
        
        
        
        
		
    	
        
        
        
    

    
    
        select id,dept_name deptName
        from dept
        where id = #{id}
    
3.4.1.2 场景二

查询每个部门及相应的员工:

​ 使用collection标签

collection:

定义关联集合类型的属性的封装规则

ofType:指集合里面元素的类型

	
        
        

        
        
            
            
            
            
        
    

    
      select * from dept
      where id=#{id}
    

EmployeeMapper.xml:

	
        select * from  employee
        where id = #{id}
    



        
        
        
        

        
        

            
            

                
                
                    
                    
                
            

            
            
                
                
                
                
            
        
    
四、动态sql

动态sql就是在普通sql基础上,通过标签去进行拼接。以达到把普通sql拼接成新的sql的效果

OGNL:

4.1 if

(OGNL)

遇见特殊符号要写转义字符

	
    

        select * from employee
        
    
        
            
              and id = #{id}
            
    
          
          
            
                and last_name like #{lastname}
            
            
              and email = #{email}
            
    
            
            
              and gender = #{gender}
            
        
    
4.3 trim

可以解决where标签的缺点。

prefix:给拼串后的整个字符串加一个前缀

prefixOverrides:去掉整个字符串前面多余的字符

suffix:给拼串后的整个字符串加一个后缀

suffixOverrides:去掉整个字符串后面多余的字符

	
    

        select * from employee
        
    
        
          
              and id = #{id}
          

          
          
            
                and last_name like #{lastname}
            
            
              and email = #{email}
            

            
            
              and gender = #{gender}
            

            
                1=1
            
        
        
    
4.5 set

针对于update语句

    
        update employee
        
            
                last_name = #{lastname},
            
            
                email = #{email},
            
            
                gender=#{gender}
            
        
        
            id=#{id}
        
    

trim代替set:

    
        update employee
        
            
                last_name = #{lastname},
            
            
                email = #{email},
            
            
                gender=#{gender}
            
        
        
            id=#{id}
        
    
4.6 foreach

collection:方法参数的类型,数组用array,list集合用list(参数为list/数组会封装在map中,因此key是list/array)

item:将当前遍历出的元素赋值给指定的变量

separator:每个元素的分隔符

open:遍历出所有结果拼接一个开始的字符

close:遍历出所有结果拼接一个结束的字符

index:

遍历list的时候,index就是索引,item就是当前值

遍历map的时候index表示的就是map的key,item就是map的值

#{变量名}就能取出变量的值也就是当前遍历出的元素

接口:
List getEmpsByConditionForeach(List ids);
    
xml:

	
		select id,last_name lastName,email,gender,empStatus from tbl_employee where id = #{id}
	

枚举类型处理器:

public class MyEnumEmpStatusTypeHandler implements TypeHandler {

	
	@Override
	public void setParameter(PreparedStatement ps, int i, EmpStatus parameter,
			JdbcType jdbcType) throws SQLException {
		// TODO Auto-generated method stub
		System.out.println("要保存的状态码:"+parameter.getCode());
		ps.setString(i, parameter.getCode().toString());
	}

	@Override
	public EmpStatus getResult(ResultSet rs, String columnName)
			throws SQLException {
		// TODO Auto-generated method stub
		//需要根据从数据库中拿到的枚举的状态码返回一个枚举对象
		int code = rs.getInt(columnName);
		System.out.println("从数据库中获取的状态码:"+code);
		EmpStatus status = EmpStatus.getEmpStatusByCode(code);
		return status;
	}

	@Override
	public EmpStatus getResult(ResultSet rs, int columnIndex)
			throws SQLException {
		// TODO Auto-generated method stub
		int code = rs.getInt(columnIndex);
		System.out.println("从数据库中获取的状态码:"+code);
		EmpStatus status = EmpStatus.getEmpStatusByCode(code);
		return status;
	}

	@Override
	public EmpStatus getResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		// TODO Auto-generated method stub
		int code = cs.getInt(columnIndex);
		System.out.println("从数据库中获取的状态码:"+code);
		EmpStatus status = EmpStatus.getEmpStatusByCode(code);
		return status;
	}

}

配置:


		
		
		
	


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/721428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号