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

Mybatis笔记——一共踩了这么多坑

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

Mybatis笔记——一共踩了这么多坑

本篇博客整理了我两天刷完mybatis几乎所有的知识点,和一些折磨过我的错,我相信大家也都一定踩过,下面让我们一起来往下看。

学什么之前一定要搞清楚这东西是什么,可以做什么

1.什么是Mybatis?(官网介绍
  1. MyBatis 是一款优秀的持久层框架
  2. 它支持自定义 SQL、存储过程以及高级映射
  3. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  4. MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.为什么需要Mybatis?
  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护。sql和代码的分离,提高了可维护性。
  • 提供xml标签,支持编写动态sql
  • 提供映射标签,支持对象与数据库的orm字段关系映射
3.第一个Mybatis程序

思路:搭建数据库->导入mybatis->编写代码->测试

1.搭建数据库

2.导入依赖


        
            org.mybatis
            mybatis
            3.5.7
        

        
            mysql
            mysql-connector-java
            8.0.18
        

        
            junit
            junit
            4.13
            test
        
    

3.编写mybatis核心配置文件(myabtis-config.xml)



    
        
            
            
                
                
                
                
            
        
    


4.连接数据库

5.建一个mybatis工具类—MybatisUtils(获取sqlSessionFactory)

public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;//提升SqlSessionFactory作用域
    static {
//获取sqlSessionFactory对象
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //既然有了sqlSessionFactory对象,所以我们要获得sqlSession的实例
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return  sqlSession;
    }
}

6.编写代码
1.实体类

public class user {
 private int id;
 private String name;
 private int age;


 public user() {
 }

 public user(int id, String name, int age) {
     this.id = id;
     this.name = name;
     this.age = age;
 }

 @Override
 public String toString() {
     return "user{" +
             "id=" + id +
             ", name='" + name + ''' +
             ", age=" + age +
             '}';
 }

 public int getId() {
     return id;
 }

 public void setId(int id) {
     this.id = id;
 }

 public String getName() {
     return name;
 }

 public void setName(String name) {
     this.name = name;
 }

 public int getAge() {
     return age;
 }

 public void setAge(int age) {
     this.age = age;
 }
}

2.编写dao ->UserMapper

public interface UserMapper {
    List getUserList();
}

2.1对应的映射UserMapper.xml,这里的映射我不知道说的标准不标准,如有错,麻烦点评,谢谢各位老哥







    
     select * from mybatis.user
 

3.测试

@Test
  public void getUserByRowBounds(){
      SqlSession sqlSession = MyBatisUtils.getSqlSession();

      RowBounds rowBounds = new RowBounds(1, 2);


      //基于java代码层面实现分页
      List userList = sqlSession.selectList("com.zhang.dao.UserMapper.getUserByRowBounds",null,rowBounds);

      for (User user : userList) {
          System.out.println(user);
      }
      sqlSession.close();
  }
使用注解开发

1.接口

public interface UserMapper {
@Select("select * from mybatis.user ")
List getUser();
}

2.mybatis核心配置—mappers(使用注解接口对应的配置就可以省略,mybatis绑定的就是我们的接口而不是接口对应的配置)

3.测试
key看到实体类字段和数据库字段不一致的情况下,使用mybatis注解的方式,实体类userAge属性输出出现问题,所以mybatis使用注解简单的可以处理,较为复杂的情况官方还是推荐使用配置的方式来实现。

注解增删改查

我们可以在工具类创建的时候设置为自动提交事务,为true即可

 public static SqlSession getSqlSession(){
      return   sqlSessionFactory.openSession(true);

    }

基本类型,多个参数的情况下,必须使用@Param注解,作用是给参数命名,也变得更加规范#{}这里所引用的就是@Param里面设置的命名

这里提一下#{}和${}问题

  1. 一般我们使用#{},不使用 , 因 为 {},因为 ,因为{}会引起sql注入的问题
  2. 我们不使用@param注解时候,必须使用#{},使用${}会报错

1.接口

public interface UserMapper {
@Select("select * from mybatis.user ")
List getUser();

@Select("select * from mybatis.user where id = #{id}")
User getUserById(@Param("id") int id);

@Insert("insert into mybatis.user(id,name,age) value(#{id},#{name},#{userAge})")
int addUser(User user);


@Update("update mybatis.user set name=#{name},age=#{userAge} where id =#{id}")
int updateUser(User user);


@Delete("delete  from mybatis.user where id = #{uid}")
int deleteUser(@Param("uid") int id);


}

2.实现(中间步骤和之前一样,没有变动

public class MyTest {
    @Test
    public void test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        List userList = mapper.getUser();
//        for (User user : userList) {
//            System.out.println(user);
//        }
//        User userById = mapper.getUserById(2);
//        System.out.println(userById);
//        mapper.addUser(new User(7,"hello",12));
//        mapper.updateUser(new User(7,"wowo",4));
        mapper.deleteUser(7);
    }
}

Lombok

lombok使用:

  1. 安装lombok插件
  2. 导入lombok依赖
  3. 实体类上加注解

lombok生成了无参,get,set,toString,hashcode,equals

多对一处理

第一步:搭建多对一环境

数据库:


2.编写代码
3.测试

环境搭建成功

按照查询嵌套处理

接口

   //查询所有学生的信息以及老师的信息
    public List getStudent();

接口对应的mapper






        select * from mybatis.teacher where id =#{id};
    


最后测试即可
我对多对一的理解:

​ 按照查询嵌套处理:多对一这个一的属性在这代码里是老师,Student的实体类属性把老师这个对象引入进来替代student属性里tid这个属性,在运用mapper.xml文件里面对student进行结果集映射resultMap,之后就可以对应的补充实体类属性和数据库属性的对应添加,老师这个引用过来的对象也可以顺利成章的放进来了,从而完成真正的多对一查询。

按照结果嵌套处理

一对多

场景:一个老师对应多个学生

@Data
public class Student {
    private int id;
    private String name;
    private int  tid;
}

@Data
public class Teacher {
    private int id;
    private String name;
    //一个老师拥有多个学生
    private List students;
}

个人分析:一个老师对应多个学生,就在老师的代码操作,因为是多个学生,所以这里都用集合存储list

接口

public interface TeacherMapper {

   //获取指定老师下的所有学生
    Teacher getTeacher(@Param("tid") int id);
}

xml