Mybatis

1.Mybtis的快速开发

官网 :https://mybatis.org/mybatis-3/zh/configuration.html

看word

解决SQL映射文件的警告提示:

在入门案例映射配置文件中存在报红的情况。问题如下:
Mybatis_第1张图片

  • 产生的原因:Idea和数据库没有建立连接,不识别表信息。但是大家一定要记住,它并不影响程序的执行。
  • 解决方式:在Idea中配置MySQL数据库连接。

IDEA中配置MySQL数据库连接
1.点击IDEA右边框的 Database ,在展开的界面点击 + 选择 Data Source ,再选择 MySQL
Mybatis_第2张图片
2.在弹出的界面进行基本信息的填写
Mybatis_第3张图片


2.Mapper代理开发

  • 解决原生方式中的硬编码
  • 简化后期执行SQL

使用Mapper代理要求
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:
Mybatis_第4张图片
2.设置SQL映射文件的namespace属性为Mapper接口全限定名
Mybatis_第5张图片
3.在 Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
Mybatis_第6张图片
Mybatis_第7张图片

/**
 * Mybatis 代理开发
 */
public class MyBatisDemo2 {

    public static void main(String[] args) throws IOException {

        //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象,用它来执行sql  -----当为true 时 自动提交 
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3. 执行sql
        //3.1 获取UserMapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List users = userMapper.selectAll();

        System.out.println(users);
        //4. 释放资源
        sqlSession.close();
    }
}

注意: -------别忘了加载sql映射文件
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将核心配置文件的加载映射配置文件的配置修改为
Mybatis_第8张图片

注意:
在这里插入图片描述
一定要有 / 进行建立



3.Mybatis核心配置文件

注意: 习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring
之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下

1.在核心配置文件的 environments 标签中其实是可以配置多个 environment ,使用 id 给每段环境起名,在 environments 中使用 default='环境id' 来指定使用哪儿段配置。我们一般就配置一个 environment 即可。




	
	
	
	
	
	
		
		
		
	
	
	
	
	 
	
		
	
			
				
              
              	 
                 
                 
                 
                 
                 
                 
				
			
			
          
          
             
             
             
             
			
		
	
	
	
	
	
		
	


2.类型别名
在映射配置文件中的 resultType 属性需要配置数据封装的类型(类的全限定名)。而每次这样写是特别麻烦的,Mybatis 提供了 类型别名(typeAliases) 可以简化这部分的书写。
Mybatis_第9张图片
Mybatis_第10张图片
Mybatis_第11张图片

3.创建模板
Mybatis_第12张图片



4.配置文件完成增删改查

   1.Mybitsx安装

Mybatis_第13张图片

   2.查询所有数据

    1.当数据库中的名字和类中的字段不同时,没办法将数据进行封装解决版办法

  • 给字段起别名

1.我们可以在写sql语句时给这两个字段起别名,将别名定义成和属性名一致即可。


2.SQL片段:

将需要复用的SQL片段抽取到 `sql` 标签中

	id, brand_name as brandName, company_name as companyName, ordered, description, status

id属性值是唯一标识,引用时也是通过该值进行引用。
在原sql语句中进行引用

使用 `include` 标签引用上述的 SQL 片段,而 `refid` 指定上述 SQL 片段的id值。

3.使用resultMap定义字段和属性的映射关系
在映射配置文件中使用resultMap定义 字段 和 属性 的映射关系


    
    
    

注意:在上面只需要定义 字段名 和 属性名 不一样的映射,而一样的则不需要专门定义出来。

SQL语句正常编写


    2.参数占位符

1.#{} :执行SQL时,会将 #{} 占位符替换为?,将来自动设置参数值。从上述例子可以看出使用#{} 底层使用的是 `PreparedStatement

2.${} :拼接SQL。底层使用的是 Statement,会存在SQL注入问题。如下图将 映射配置文件中的 #{} 替换成 ${} 来看效果


    3.parameterType

对于有参数的mapper接口方法,我们在映射配置文件中应该配置 ParameterType 来指定参数类型。只不过该属性都可以省略。如下图:


    4.SQL语句中特殊字段处理

因为映射配置文件是xml类型的问题,而 > < 等这些字符在xml中有特殊含义,所以此时我们需要将这些符号进行转义,可以使用以下两种方式进行转义

  • 转义字符
  • -----输入CD即可



   3.条件查询

    1.多条件查询


多参数传递
1.使用 @Param("参数名称") 标记每一个参数,在映射配置文件中就需要使用 #{参数名称} 进行占位

List selectByCondition(@Param(“status”) int status, @Param(“companyName”) String companyName,@Param(“brandName”) String brandName);
其中这个Param中()为sql语句中的参数

2.将多个参数封装成一个 实体对象 ,将该实体对象作为接口的方法参数。该方式要求在映射配置文件的SQL中使用 #{内容} 时,里面的内容必须和实体类属性名保持一致。

List selectByCondition(Brand brand);
其中这个brand(对象)中对象的名字要跟SQL的参数名应该一样

3.将多个参数封装到map集合中,将map集合作为接口的方法参数。该方式要求在映射配置文件的SQL中使用 #{内容} 时,里面的内容必须和map集合中键的名称一致。

List selectByCondition(Map map);
SQL中的参数名和map集合中的 的名称对应上

    2.动态条件条件查询

SQL语句可以根据我的需求进行变换

  • if 标签和 where
    1.IF
    test 属性:逻辑表达式
  

如上的这种SQL语句就会根据传递的参数值进行动态的拼接。如果此时status和companyName有值那么就会值拼接这两个条件。
在这里插入图片描述

select * from tb_brand where and company_name like ? and brand_name like ?

2.WHERE

  • 替换where关键字
  • 会动态的去掉第一个条件前的 and
  • 如果所有的参数没有值则不加where关键字

    3.单条件动态查询

choose(when,otherwise)标签 实现, 而 choose 标签类似于Java 中的switch语句。
当都没有时会执行otherwise

    select * from  tb_brand
        
            
                
                    status = #{status}
                
                
                    company_name like #{companyName}
                
                
                    brand_name like #{brandName}
                
            
        
    


   4.添加


    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});

主键返回
在 insert 标签上添加如下属性: 添加在sql映射文件的insert标签上

  • useGeneratedKeys:是够获取自动增长的主键值。true表示获取
  • keyProperty :指定将获取到的主键值封装到哪儿个属性里

   5.修改

    1.修改全部字段


    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});

    2.修改动态字段

set 标签可以用于动态包含需要更新的列,忽略其它不更新的列。


    update tb_brand
    
        
            brand_name = #{brandName},
        
        
            company_name = #{companyName},
        
        
            ordered = #{ordered},
        
        
            description = #{description},
        
        
            status = #{status}
        
    
    where id = #{id};


   6.删除

    1.删除一个

    
    
        delete from  tb_brand where  id=#{id};
    

    2.批量删除

编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 foreach 标签供我们使用

foreach 标签

用来迭代任何可迭代的对象(如数组,集合)。

  • collection 属性:
    • mybatis会将数组参数,封装为一个Map集合。
      • 默认:array = 数组
      • 使用@Param注解改变map集合的默认key的名称
        例如:void DeleteList(@Param(“ids”) int[] ids);
  • item 属性:本次迭代获取到的元素。
  • separator 属性:集合项迭代之间的分隔符。foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。
  • open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
  • close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
   
    
        delete  from  tb_brand where id
        in 
        
            #{id}
        
        ;
    

   7.Mybatis参数传递

Mybatis 接口方法中可以接收各种各样的参数,如下:

  • 多个参数
  • 单个参数:单个参数又可以是如下类型
    • POJO 类型
    • Map 集合类型
    • Collection 集合类型
    • List 集合类型
    • Array 类型
    • 其他类型

1.多个参数

User select(@Param("username") String username,@Param("password") String password);


Mybatis 会将这些参数封装成 Map 集合对象,值就是参数值,而键在没有使用 @Param 注解时有以下命名规则:

  • 以 arg 开头 :第一个参数就叫 arg0,第二个参数就叫 arg1,以此类推。如:

    map.put(“arg0”,参数值1);

    map.put(“arg1”,参数值2);

  • 以 param 开头 : 第一个参数就叫 param1,第二个参数就叫 param2,依次类推。如:

    map.put(“param1”,参数值1);

    map.put(“param2”,参数值2);

结论:以后接口参数是多个时,在每个参数上都使用 @Param 注解。这样代码的可读性更高。

2.单个参数

  • POJO 类型

    直接使用。要求 属性名参数占位符名称 一致

  • Map 集合类型

    直接使用。要求 map集合的键名参数占位符名称 一致

  • Collection 集合类型

    Mybatis 会将集合封装到 map 集合中,如下:

    map.put(“arg0”,collection集合);

    map.put(“collection”,collection集合;

    可以使用 @Param 注解替换map集合中默认的 arg 键名。

  • List 集合类型

    Mybatis 会将集合封装到 map 集合中,如下:

    map.put(“arg0”,list集合);

    map.put(“collection”,list集合);

    map.put(“list”,list集合);

    可以使用 @Param 注解替换map集合中默认的 arg 键名。

  • Array 类型

    Mybatis 会将集合封装到 map 集合中,如下:

    map.put(“arg0”,数组);

    map.put(“array”,数组);

    可以使用 @Param 注解替换map集合中默认的 arg 键名。

    例如:void DeleteList(@Param(“ids”) int[] ids);

    
          delete  from  tb_brand where id
          in   
                     collection时循环的数组
              #{id}
          
          ;
      
    
  • 其他类型

    比如int类型,参数占位符名称 叫什么都可以。尽量做到见名知意



5.注解完成增删改查

简单的SQL可以使用注解
难的一般使用配置文件的方式
Mybatis_第14张图片


6.常见问题

1.SqlSessionFactory工具类抽取

  • 重复代码不利于后期的维护
  • SqlSessionFactory工厂类进行重复创建
    • 就相当于每次买手机都需要重新创建一个手机生产工厂来给你制造一个手机一样,资源消耗非常大但性能却非常低。所以这么做是不允许的。

我们一般创建一个工具类

public class SqlSessionFactoryT {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

使用

  SqlSessionFactory sqlSessionFactory = SqlSessionFactoryT.getSqlSessionFactory();
  SqlSession sqlSession = sqlSessionFactory.openSession();

2.Mybatis-config.xml完整代码




    
    
        
    

    
        
            
            
                
                
                
                
            
        
    
    
        
        
    

3.resource的路径填写

Mybatis_第15张图片
Mybatis_第16张图片

4.注解开发注意事项

虽然使用注解开发,不需要mapper.xml了 ,但是mybatis的配置文件中的加载Sql映射文件和起别名一点都不能少。 -------如果使用注解就没有该映射文件
Mybatis_第17张图片
在这里插入图片描述

你可能感兴趣的:(SSM,web,java,java-ee)