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

Mybatis笔记

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

Mybatis笔记

Mybatis笔记

三层对应的处理框架
界面层—servlet—springmvc (框架)

业务逻辑层—service类–spring(框架)

数据访问层—dao类–mybatis(框架)

Mybatis的特性
    MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录MyBatis是—个半自动的ORM (Object Relation Mapping)框架
创建maven工程 1.打包方式:jar包 2.配置mybais-config.xml文件



    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

3.创建mapper接口,对应的实体类。 4.创建映射文件

1、映射文件的命名规则:
表所对应的实体类的类名+Mapper,xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
MyBatis映射文件存放的位置是src/main/resources/mappers目录下

2、MyBatis中可以面向接口操作数据,要保证两个—致:
a>mapper接口的全类名和映射文件的命名空间(namespace)保持─致

b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持─致

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uaFUVZFH-1646900631746)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220307145551332.png)]

//UserMapper
package com.mapper;

public interface UserMapper {
    

    //插入方法
    int insertUser();
}

//Usermapper.xml





    
    
        insert into t_user  values(null,"Jack","3321","163@qq.com")
    

    
   //核心配置文件
    


    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

    
    //Test
    package com.mybatis;

import com.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MybatisTest {
    @Test
    public void test() throws IOException {
        //加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取Sqlsession对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //调用insert抽象方法
        int i = mapper.insertUser();

        //mybatis是需要自己进行事务提交的
        //手动提交
        sqlSession.commit();
        System.out.println("result:" + i);
    }
}

至此,入门结束。

log4j

1,导入依赖


    log4j
    log4j
    1.2.12

2.配置文件.xml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlzA3giI-1646900631747)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220307153645351.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBz0EVsb-1646900631748)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220307153711253.png)]

CRUD测试
//接口  
//插入方法
    int insertUser();

    
    void update();
    
    User queryUser();

    
    List getAllUser();
}

//UserMapper.xml





    
    
        insert into t_user  values(null,"Alan","123455","163@qq.com")
    

    
    
        update t_user set username ="Tom" where id = 7
    

    
    
        select * from t_user
    

    
//Test
       @Test
    public void CRUD() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //mapper.update();

        //查询某一用户的用户信息
        

        List users = mapper.getAllUser();
        users.forEach(user -> System.out.println(user));
    }
///没有删除
核心配置文件 起别名

    

当需要引入多个映射文件时,可以放包里,然后访问


   
    
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnFqmjKK-1646900631748)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220307184031011.png)]

将该核心配置文件设置成为模板 Mybatis获取参数值 的两种方式(重点)

1.一种是${} 一种是#{}

2.${} 的本质是字符串拼接,#{} 的本质是占位符赋值。

传递单个参数(根据用户名来获取用户信息)
//接口
//根据用户名来查询用户信息
User getUserbyUsername(String username);

//Usermapper.xml
  
    
        select * from t_user where username = #{username} and password = #{password}
    
        
//Test
@Test
    public void CRUD() throws IOException {
        SqlSession sqlSession = SqlSessionutils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Map map = new HashMap<>();
        map.put("username","Tom");
        map.put("password",3321);
        User user = mapper.checkloginbyMap(map);
        System.out.println(user);

    }
Mybatis的各种查询功能 查询单个根据id和查询所有的用户信息,返回的是属性,属性值
//接口
public interface SelectMapper {
    
    User getUserById(@Param("id") Integer id);

    
    List getAllUser();
}

//SelectMapper.xml






    
    
        select * from t_user
    



        
//Test
public class SelectTest {

    @Test
    public void testSelectOne(){
        SqlSession sqlSession = SqlSessionutils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
    }

    //查询所有的用户信息
    @Test
    public void getAll(){
        SqlSession sqlSession = SqlSessionutils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List allUser = mapper.getAllUser();
        allUser.forEach(User-> System.out.println(User));
    }
}

查询单行单列的情况
Integer getCount();

//xml
//注意:这里的resultType返回值本来是,java.lang.Integer
//亻是mybatis有自己的别名,如下表,
    
    
        select * from t_user where id = #{id}
    
        
//Test
@Test
    public void testSelectOne(){
        SqlSession sqlSession = SqlSessionutils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map userById = mapper.getUserByIdToMap(1);
        System.out.println(userById);
    }
查询所有的用户信息,返回map集合
//第一种方法
//接口
List >getUserByIdToMap(@Param("id") Integer id);

//第二种方法,用注解MapKey来将id设置成为键,其余作为值
//接口
    @MapKey("id")
    Map getUserByIdToMap();

模糊查询

xml如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMRNXAU3-1646900631748)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220309083829658.png)]

批量删除
    
、//接口
    int removemore(@Param("ids") String ids);

//xml
    
   
    
        delete from t_user where id in (${ids})
    
    
//Test
public class DeleteTest {
    @Test
    public void deleteTest(){
        SqlSession sqlSession = SqlSessionutils.getSqlSession();
        DeleteMapper mapper = sqlSession.getMapper(DeleteMapper.class);
        int removemore = mapper.removemore("1,3");
        System.out.println(removemore);

    }
}
查询指定表的信息

注意:不能使用#{}

List getUserByTablename(@Param("tablename") String tablename);

//xml
 
    
    select eid id,ename name,eage age,email,did from t_emp

第二种方方法:全局配置mybatis-config.xml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3KkWn1zd-1646900631749)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220309130614421.png)]

第三种方式:ResultMap来配置映射关系

注意:Result id 对应的是resultMap,type是实体类类型,result id是对应的主键,result property对应的是属性名,column对应的是字段名。


    
    
    
    
    





    SELECT  * FROM t_emp,t_dept where t_emp.eid = t_dept.did and t_emp.eid=#{id}

    
///Test
 @Test
    public void testgetEmpAndDept(){
        SqlSession sqlSession = SqlSessionutils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp empAndDept = mapper.getEmpAndDept(2);
        System.out.println(empAndDept);
    }
方式二:association:处理多对一的映射关系

​ property:需要处理多对的映射关系的属性名

​ javaType:该属性的类型

 
//如下:只是将方式一的xml小改了一下

        
        
        
        

        
            
            
        

    
    
    
        select * from t_dept where did =#{did}
    
    
 







    
        
        
        
        
        

    

    
    
       select * from t_emp where eid = #{idd}
    
    
 

EmpMapper.xml

延迟加载

分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:

lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载

aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载

此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)/eager(立即加载)”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hA2nqrbC-1646900631750)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220309153644104.png)]

三,一对多映射关系 1,collection
//DeptMapper.xml

        
        

        
            
            
            
            

        
    

    
        select * from  t_dept left join t_emp on t_dept.did = t_emp.eid where t_dept.did = #{did}
    

    
        
        
        
        
    
    
    
        select * from  t_emp where did = #{did}
    
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaGOcQgx-1646900631751)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20220309184726613.png)]

动态sql 1,if:

根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SsQL中

2,where :

当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉当where标签中没有内容时,此时where标签没有任何效果

*注意:where标签不能将其中内容后面多余的and或or去掉

3,trim :

prefix/suffix:将trim标签中内容前面或后面添加指定内容

suffixoverrides|prefixoverrides:将trim标签中内容前面或后面去掉指定内容