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

Mybatis随记

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

Mybatis随记

文章目录

1.准备工作

1.依赖:2.mybatis核心配置文件:3.配置maven 资源过滤(加在pom.xml中):4.编写Mybatis工具类 2.简单实例

1.CRUD2.使用Map传参3.模糊查询: 3.配置文件解析4.关于数据库字段名和对象属性名不一致的问题5.日志6.分页7.使用注解8. 多对一 & 一对多

1. 多对一2.一对多 9.动态sql10.缓存

1. 一级缓存2.二级缓存

1.准备工作

文档:
Mybatis文档

1.依赖:

        
        
            mysql
            mysql-connector-java
            5.1.47
        
        
        
            org.mybatis
            mybatis
            3.5.2
        
        
        
            junit
            junit
            4.12
            test
        
    
2.mybatis核心配置文件:



    
        
            
            
                
                
                
                
            
        

    

3.配置maven 资源过滤(加在pom.xml中):

        
            
                src/main/resources
                
                    ***.xml
                
                true
            
            
                src/main/java
                
                    ***.xml
                
                true
            
        
    

否则无法读取配置文件

4.编写Mybatis工具类

每个基于 MyBatis的应用都是以一个SqlSessionFactory 的实例为核心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先配置的 Configuration实例来构建出SqlSessionFactory 实例。

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;
    static{
        //获取sqlSessionFactory对象
        try{
            String resource = "org/mybatis/example/mybatis-config.xml";
            InputStream inputStream = getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (IOException e){
            e.printStackTrace();
        }

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

    SqlSessionFactoryBuilder
    这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(局部变量)。

    SqlSessionFactory
    SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。单例模式。应用作用域(全局)。

    SqlSession
    SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。最好放在finally中关闭。

2.简单实例 1.CRUD





    
        select * from mybatis.user
    

    
        select * from mybatis.user where id = #{id}

测试:

@Test
    public void testaddUserByMap(){
        Map map = new HashMap<>();
        map.put("userid",6);
        map.put("username","yg");
        map.put("userpwd","123");
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.addUserByMap(map);
        sqlSession.commit();
        sqlSession.close();
    }
3.模糊查询:

        select * from mybatis.student
    

    
        select s.id sname,s.name sname,t.name tname
        from student s,teacher t
        where t.id = s.tid



        
        
        
            
        
    

测试:

    @Test
    public void testgetStuTeaInfo2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List stuTeaInfo = mapper.getStuTeaInfo2();
        for (Student student : stuTeaInfo) {
            System.out.println(student);
        }
        sqlSession.close();
    }

结果:

Student(id=0, name=null, teacher=Teacher(id=0, name=yht))
Student(id=0, name=null, teacher=Teacher(id=0, name=yht))
Student(id=0, name=null, teacher=Teacher(id=0, name=yht))
Student(id=0, name=null, teacher=Teacher(id=0, name=yht))
Student(id=0, name=null, teacher=Teacher(id=0, name=yht))

id = 0,是因为查询的结果中没有teacher id字段

2.一对多

环境:

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

public class Teacher {
    private int id;
    private String name;
    private List students;
}

方法一:按照结果嵌套处理


        select * from mybatis.blog
        
            
                title = #{title}
            
            
                and author = #{author}
            
        
    

测试:

@Test
    public void testqueryBlogIf(){
        Map map = new HashMap<>();
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        map.put("title","数据结构");
        map.put("author","yangguang");
        List blogs = mapper.queryBlogIf(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }

其中 title 和 author 为map中的key.
2. where元素

where 元素只会在子元素返回任何内容的情况下才插入 “WHERe” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

    choose元素(类似于switch)
    
        select * from mybatis.blog
        
            
                id = #{id1}
            
        
    

如上,collection为map中的key ids,item只是用来下面传值.
注意 and ( 有空格.

测试:

    @Test
    public void testqueryBlogForEach(){
        HashMap map = new HashMap<>();
        ArrayList arrlist = new ArrayList<>();
        arrlist.add(1);
        arrlist.add(2);
        map.put("ids",arrlist);
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        List blogs = mapper.queryBlogForEach(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }

动态sql还是sql语句,只不过是在sql的层面上去执行逻辑代码.即根据不同的情况生成不同的sql语句.

10.缓存 1. 一级缓存

映射语句文件中的所有 select 语句的结果将会被缓存。
映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
缓存不会定时进行刷新(也就是说,没有刷新间隔)。

实例:

@Test
    public void testgetUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        User user1 = new User();
        user1.setId(2);
        user1.setName("xule");
        user1.setPwd("1123");
        mapper.updateUser(user1);
        User user2 = mapper.getUserById(1);
        if(user == user2){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        sqlSession.close();
    }

结果:

Preparing: select * from mybatis.user where id = ? 
==> Parameters: 1(Integer)
<==    Columns: id, name, pwd
<==        Row: 1, yht, 123
<==      Total: 1
==>  Preparing: update mybatis.user set name = ? ,pwd = ? where id = ? 
==> Parameters: xule(String), 1123(String), 2(Integer)
<==    Updates: 1
==>  Preparing: select * from mybatis.user where id = ? 
==> Parameters: 1(Integer)
<==    Columns: id, name, pwd
<==        Row: 1, yht, 123
<==      Total: 1
false
2.二级缓存

在mybatis中使用二级缓存时候就必须需要将实体类序列化

    @Test
    public void testgetUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        sqlSession.close();
        SqlSession sqlSession1 = MybatisUtils.getSqlSession();
        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        User user1 = mapper1.getUserById(1);
        System.out.println(user == user1);
        sqlSession1.close();
    }

结果:

==>  Preparing: select * from mybatis.user where id = ? 
==> Parameters: 1(Integer)
<==    Columns: id, name, pwd
<==        Row: 1, yht, 123
<==      Total: 1

缓存顺序:
2 -> 1 -> 查数据库表

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号