mybatis笔记

MyBatis框架

1.ORM框架介绍

1.1 什么是ORM?

对象关系映射(Object Relational Mapping,简称ORM),对象关系映射即数据库数据与对象的关系的映射

ORM阐述

[图片上传失败...(image-bb9e03-1565855698548)]

1.2 ORM框架有哪些?

Hibernate : 全自动的ORM框架,不用书写SQL语句,就可以对数据库进行增删改查. 跨平台 .Hibernate的代码可以适用于多种数据库.但是,配置比较复杂,第二点查询效率相对而言较低,且不灵活.

Mybatis : 半自动的ORM框架,需要书写SQL语句,就可以对数据库进行增删查改.

Spring Data : 类似于Hibernate,更多基于注解.

1.3 mybatis相对而言的优势以及不足?

优势: 轻便,依赖的jar很少,数据库操作灵活,程序员可操作空间相对较大.

不足 : 基本查询还需手写,开发效率较低

2.MyBatis概述

2.1 官网:https://blog.mybatis.org/

2.2 中文官网:http://www.mybatis.org/mybatis-3/zh/index.html

mybatis起源:

ibatis是mybatis早期的名字,在spring 3.0之前还可以使用,spring 3.0 之后不再支持ibatis,是apach早期的一个开源项目,后更名mybatis,是一个Java持久层的框架,持久化:将数据进行永久化的保存,一般指保存数据到文件中

3.MyBatis入门配置

3.1 Mybtias入门

3.1.1 导入相关jar包

mybatis-3.5.2.jar   mybatis核心jar包
mysql-connector-java-5.1.47.jar    数据库连接驱动包

3.1.2 mybatis核心配置文件




  
    
      
      
        
        
        
        
      
    
  
  
    
  

3.1.3 mybatis数据库映射文件

映射配置文件



  

  
  

相关实体类

package com.sxt.bean;

public class User {
    
    private int id;
    
    private String name;
    
    private String sex;

    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 String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", sex=" + sex + "]";
    }
}

3.1.4 加载配置文件,创建数据库操作对象

package com.sxt.test;


import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.sxt.bean.User;

public class Test {
    
    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        //创建一个SqlSessionFactory构造对象
        SqlSessionFactoryBuilder  sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //sqlSession工厂
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Test.class.getClassLoader().getResourceAsStream(resource));
        //数据库SQL会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //增删查改
        System.out.println(sqlSession);
        // sqlSession 在使用时,必须传一个sql语句,传SQL语句的唯一标识
        List users = sqlSession.selectList("com.sxt.bean.User111111.selectList");
        for (User user : users) {
            System.out.println(user);
        }
        //关闭session
        sqlSession.close();
    }

}

4.MyBatis基本CRUD(增删查改)

方式一

4.1 SqlSession工具类

package com.sxt.util;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
   *   创建 SqlSession   
 * @author mrt
 *
 */
public class MybatisUtil {
    static SqlSessionFactory sqlSessionFactory  = null;
    
    static {
        String source = "mybatis.cfg.xml";
        //创建 SqlSessionFactory
        SqlSessionFactoryBuilder  sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        sqlSessionFactory = sqlSessionFactoryBuilder.build(MybatisUtil.class.getClassLoader().getResourceAsStream(source));
        
    }
    
    /**
       *     获取SqlSession 对象
     * @return
     */
    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }

}

4.2 核心配置文件




  
    
      
      
        
        
        
        
      
    
  
  
    
  

4.3 数据库映射文件



  

  
  
  
  
  
  
    insert into  user value(0,#{name},#{sex})
  
  
  
        delete from user where id = #{id}
  
  
  
    update user set  name = #{name},sex = #{sex} where id = #{id}
  

4.4 dao层

package com.sxt.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.sxt.bean.User;
import com.sxt.util.MybatisUtil;

public class UserDao {
    
    public User  selectUser(int  id) {
        SqlSession session = MybatisUtil.getSession();
        User u = session.selectOne("com.sxt.bean.User.selectUser", id);
        session.close();
        return u;
    }
    
    public List  selectList() {
        SqlSession session = MybatisUtil.getSession();
        List users = session.selectList("com.sxt.bean.User.selectList");
        session.close();
        return users;
    }
    
    /**
       *    新增用户
     * @param u
     */
    public void  insertUser(User u) {
        SqlSession session = MybatisUtil.getSession();
        session.insert("com.sxt.bean.User.insertUser", u);
        session.commit();
        session.close();
    }
    
    public void  deleteUser(int  id) {
        SqlSession session = MybatisUtil.getSession();
        session.delete("com.sxt.bean.User.deleteUser", id);
        session.commit();
        session.close();
    }
    
    public void updateUser(User u) {
        SqlSession session = MybatisUtil.getSession();
        session.update("com.sxt.bean.User.updateUser",u);
        session.commit();
        session.close();
    }  

}

4.5 log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

注意:

​ 1.在mybatis中,涉及到数据库更新操作,需要手动提交

​ 2.namespace+id产生的字符串必须唯一

方式二:

注意点:

1.maper.xml文件中namespace的值,必须与接口的全路径一致

2.mapper.xml文件中,sql标签的id值,必须与接口的方法名一致

接口代码:

package com.sxt.dao;

import java.util.List;

import com.sxt.bean.User;

public interface IUserDao {
    /**
     * 根据ID 查询用户
     * @param id
     * @return
     */
    public User  selectUser(int id);
    
    /**
     * 查询所有
     * @return
     */
    public List selectList();
    
    /**
     * 新增用户
     * @param u
     */
    public  void insertUser(User u);
    /**
     * 删除用户
     * @param id
     */
    public void deleteUser(int id);
    /**
     * 修改用户
     * @param u
     */
    public void updateUser(User u);
    
}

mapper.xml文件



  


  
  
  
  
  
  
    insert into  user value(0,#{name},#{sex})
  
  
  
        delete from user where id = #{id}
  
  
  
    update user set  name = #{name},sex = #{sex} where id = #{id}
  

核心配置文件





    
    
    
        
        
    
    
    
  
    
    
    
    
  
  
    
    
    
        
            
            
                
                
                
                
            
        
        
        
            
            
                
                
                
                
            
        
    
    
  
    
    
    
    
   
    

测试类

package com.sxt.test;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.sxt.bean.User;
import com.sxt.dao.IUserDao;

public class Test {
    
    public static void main(String[] args) {
        String source = "mybatis.cfg.xml";
        SqlSessionFactoryBuilder  builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory = builder.build(Test.class.getClassLoader().getResourceAsStream(source));
        //获取SqlSession
        SqlSession session = sessionFactory.openSession();
        // 使用Mapper 接口的形式
        /**
         * 使用接口的形式,和代理,使用mybatis操作数据库时:
         * 1. maper.xml文件中的namespace值,必须与操作数据库数据的dao层接口名称全路径一致
         * 2. 接口的中抽象方法名称必须与mapper.xml文件 sql语句标签的id值一致
         */
        IUserDao userDao = session.getMapper(IUserDao.class);
        User user = userDao.selectUser(2);
        System.out.println(user);
        
        User u = new User();
        u.setName("Lucy");
        u.setSex("女");
        userDao.insertUser(u);
        session.commit();
        session.close();
    }

}

5.核心配置文件

mybatis.cfg.xml





    
    
    
        
        
    
    
    
  
    
    
    
    
  
  
    
    
    
        
            
            
                
                
                
                
            
        
        
        
            
            
                
                
                
                
            
        
    
    
  
    
    
    
    
   
  
  
  

6.Mapper.xml配置文件

6.1 mapper.xml的基础配置



  


    
        
        
        
        
    

  
    
    
     
  
   
        insert into user value (0,#{name},#{sex})
   
   

6.2 占位符 # 与 $

在Mybatis中,可以使用是字符串拼接

#号则使用PreparedStatement进行了SQL预编译,可以更好的防止SQL注入攻击

7.模糊查询

7.1重点:方式一: concat 字符串拼接函数

concat(str1,str2,str3,....) : 将多个字符串进行拼接

concat("%",关键字,"%")

7.2(知道):方式二: $符字符串拼接

7.3(掌握): 方式三:bind



  

    
    
    
    
    
    
    

8.原生分页查询

​ 当存在多个基本类型的参数时,在sql中获取值,无法直接根据参数名称获取值.

8.1 关于参数的值的获取

8.1.1 方式一: @Param("别名")

在sql语句中,可以通过 #{别名}获取值

public List page(@Param("page")int page,@Param("limit")int limit);

    
    

8.1.2 方式二:arg0-------argn

8.1.3 方式三: param1----paramn

    
    

    

分页方式二:RowBounds(offset,limit)

    RowBounds rowBounds = new RowBounds((3-1)*2, 2);
    user = userDao.page2(rowBounds);

9.分页插件

9.1分页插件:pageHelper

PageHelper使用步骤:

1.下载相关jar : pagehelper-x.x.x.jar 和 jsqlparser-0.9.5.jar,导入项目中

2.心配置文件中,配置

     
     
        
     

3.在要进行分页查询的sql语句执行前,开启分页:

Page page = PageHelper.startPage(页码, 每页数据条数);
System.out.println(page.getPageNum()); //页码
System.out.println(page.getPageSize());  //每页数据条数
System.out.println(page.getTotal()); // 总数据条数
System.out.println(page.getResult());  // 所有数据

10.属性名和字段名不一致

10.1方案一:

使用as 别名


10.2方案二: resultMap

    
        
        
        
        
    

     

11.SQL片段

在mybatis中,会出现部分sql内容重复出现,此时可以使用sql标签,将这部分抽离出来,然后在具体的sql标签中,使用includ 包裹,这样组装成新的sql语句


        id,name,sex


作业: 单表增删查改,分页(PageHelper)(代理的形式)

12.DTD文件配置

https://blog.csdn.net/a15920804969/article/details/79107852

13.动态SQL

13.1 什么是动态sql?

根据传递的参数不同,产生的sql语句也不同,即根据传递的参数,动态的产生相应的sql语句

13.2 mybatis中对动态sql支持的语法:

13.2.1 if



  

    
        id as id,
        name as name,
        age as age,
        sex as sex,
        phone as phone,
        c_id as cId
    
    
    
    

13.2.2choose(when otherwise)


13.2.3where

当where标签中if语句成立, sql语句 后面会自动添加where ,且会去掉 紧跟的and

    

13.2.4 set

set标签自动新增set ,且去掉了最后的逗号

13.2.5 foreach

foreach一般用于批量操作.

    
    

13.2.6 trim

    

        insert into     student
        
            
                name,
            
            
                age,
            
            
                sex,
            
            
                phone,
            
            
                c_id,
            
        
        
            
                #{name},
            
            
                #{age},
            
            
                #{sex},
            
            
                #{phone},
            
            
                #{cId},
            
        
    

14.关联表的处理

多对一

方式一:使用连接查询



    
    

方式二: 使用mybatis中resultMap,进行结果封装处理


        
        
        
        
        
        
        
        
        
            
            
        
    

    
    

方式三: 遍历查询

StudentMapper.xml

    
        
        
        
        
        
        
        
    

    

ClassesMapper.xml





    

一对多

方式一:根据resultMap将查询结果进行封装处理

注意点: 每个实体类必须要有默认构造方法(无参构造方法)

     
        
        
        
            
            
            
        
     

Student.java

package com.sxt.bean;

import java.io.Serializable;

public class Student implements Serializable {
    private static final long serialVersionUID = 1543743204388328403L;
    
    private int id;
    private String name;
    private int age;
    private String phone;
    private int cId;
    
    public Student() {}
    
    public Student(int id, String name, int age, String sex, String phone, int cId) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.cId = cId;
    }
    
    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;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public int getcId() {
        return cId;
    }
    public void setcId(int cId) {
        this.cId = cId;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", phone=" + phone + ", cId=" + cId + "]";
    }

}

Classes.java

package com.sxt.bean;

import java.util.List;

/**
   * 班级
 * @author mrt
 *
 */
public class Classes {
    
    private int id;
    
    
    private String name;
    
    
    private List students ;


    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 List getStudents() {
        return students;
    }


    public void setStudents(List students) {
        this.students = students;
    }


    @Override
    public String toString() {
        return "Classes [id=" + id + ", name=" + name + ", students=" + students + "]";
    }

}

方式二: 遍历查询

ClassMapper.xml


        
        
        
        
        
     
    

StudentMapper.xml

    

15.使用注解实现MyBatis

单表增删查改

public interface IUserDao {
    
    @Select("select * from user")
    public List selectAll();
    
    @Insert("insert into user value(0,#{name},#{sex})")
    public void insert(@Param("name")String name,@Param("sex")String sex);
    
    @Delete("delete from user where id=#{id}")
    public void delete(int id);
    
    @Update("update  user set name=#{name} ,sex=#{sex} where id=#{id}")
    public void update(@Param("id")int id,@Param("name")String name,@Param("sex")String sex);
    /**
     * 动态sql
     * @param map
     * @return
     */
    @Select("")
    public List selectList(Map map);
    
}

16.缓存

在mybatis中,缓存分为2种,一级缓存和二级缓存.一级是默认开启的缓存, 作用范围是指同一个session.

一级缓存: 默认缓存

在同一个SqlSession, 若在不关闭SqlSession的情况下,此时若执行一样的sql语句,只会执行一次.会执行缓存,这种就是一级缓存.

二级缓存:SqlSessionFactory 使用同一个SqlSessionFactory时,若执行一样的sql,则会走二级缓存.

虽然二级缓存默认是开启的,但是需要配置.

1.在核心配置文件中:

    
    

2.在相关mapper文件中



17.MyBatis逆向工程

需要下载:mybatis-generator-core-1.3.2.jar

Generator.java

package com.generator;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

public class Generator {

    public static void main(String[] args) throws Exception {
        List warnings = new ArrayList();
        boolean overwrite = true;

        // 指定 逆向工程配置文件

        File configFile = new File("config.xml");

        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback, warnings);
        myBatisGenerator.generate(null);

    }

}

config.xml

  
  
  
    
      
    
      
          
              
            
              
          
          
          
          
        
          
              
        
        
        
          
              
              
          
        
          
              
          
        
          
              
          
         
        

你可能感兴趣的:(mybatis笔记)