2 - Mybatis 常用

2 - Mybatis 常用,第1张

2 - Mybatis 常用 2 MyBatis 常用 2.1 ResultMap

如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中

resultType : 如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中


    
    
    
    
    
    
    
    

2.2 多条件查询 @Param()
List findByIdAndUsername2(@Param("id") int id, @Param("username") String username);

    select * from user where id = #{id} and username = #{username}

使用pojo对象传递参数
List findByIdAndUsername3(User user);

    
    select * from user where username like #{username}

@Test
public void test6() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 当前返回的 其实是基于UserMapper所产生的代理对象:底层:JDK动态代理 实际类型:proxy
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List users = mapper.findByUsername("%子慕%");
    for (User user : users) {
        System.out.println(user);
    }
    sqlSession.commit();
    sqlSession.close();
}
#{} 和 ${}

#{}:表示一个占位符号

  • 通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
  • #{} 可以接收简单类型值或pojo属性值。
  • 如果parameterType传输单个简单类型值, #{} 括号中名称随便写。

${}:表示拼接sql串

  • 通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入
    问题。
  • ${} 可以接收简单类型值或pojo属性值。
  • 如果parameterType传输单个简单类型值, ${} 括号中只能是value。
2.4 返回主键(主键回填)


    insert into user(username, birthday, sex, address)
    values (#{username}, #{birthday}, #{sex}, #{address})





    
    
        SELECT LAST_INSERT_ID();
    
    insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})

2.5 动态sql if

根据id和username查询,但是不确定两个都有值。


    
    
        
        
            #{id}
        
    




sql片段

映射文件中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的


	SELECT * FROM `user`


    
    
    	
            
            #{id}
            
    	

2.6 PageHelper
  1. 导入依赖
  2. 核心配置文件进行配置
  3. 使用

    com.github.pagehelper
    pagehelper
    3.7.5


    com.github.jsqlparser
    jsqlparser
    0.9.1


    
        
        
    

@Test
public void test15() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    // 设置分页参数
    // 参数1: 当前页
    // 参数2: 每页显示的条数
    PageHelper.startPage(1,2);
    List users = mapper.findAllResultMap();
    for (User user : users) {
        System.out.println(user);
    }
    // 获取分页相关的其他参数
    PageInfo pageInfo = new PageInfo(users);
    System.out.println("总条数"+ pageInfo.getTotal());
    System.out.println("总页数"+ pageInfo.getPages());
    System.out.println("是否是第一页"+ pageInfo.isIsFirstPage());
    sqlSession.close();
}
2.7 多表查询 1 对 1 association

一个订单只从属于一个用户 查订单的时候把用户信息查出来

Orders实体类

public class Orders {
    private Integer id;
    private String ordertime;
    private Double total;
    private Integer uid;

    // 表示当前订单属于那个用户 association
    private User user;
}

Mapper.xml



    
    
    
    
    
    
        
        
        
        
        
    



   SELECT u.*,o.id oid,o.ordertime,o.total,o.uid FROM orders o RIGHT JOIN USER u ON o.uid = u.id





    
    
    
    
    
    
    
        
        
        
        
    


多 对 多

一个用户有多个角色,一个角色被多个用户使用

其实是一对多的变种


    
    
    
    
    

    
        
        
        
    



    SELECT *
    FROM orders



    SELECT * FROM USER




    SELECT * FROM USER



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5660339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存