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

MyBatis学习笔记

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

MyBatis学习笔记

本文基于狂神说Java学习和自己所需记录的学习笔记。如果对你没有帮助请不要喷谢谢。

MyBatis项目环境搭建

1.创建mybatis核心配置文件:






    
        
            
            
                
                
                
                
            
        
    

    
    
        
    

注意,此处设useSSL=false。因为useSSL=true这个需要证书,要向MySQL交钱的。我们自己学习练习不需要这个东西。

2.编写MyBatis工具类

//SqlSessionFactory -->SqlSession
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;
    static {

        try {
            //使用Mybaties第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    public static SqlSession getSqlSession(){
//        SqlSession sqlSession =  sqlSessionFactory.openSession();
//        return sqlSession;

        return sqlSessionFactory.openSession();
    }

}

3.实体类

//实体类
public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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 getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

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

4.Dao接口

public interface UserDao {
    List getUserList();
}

5.配置sql






    
    
        select * from mybatis.user
    


6.核心文件中注册mapper。形式如1中最下面的注册形式。

7.测试

	@Test
    public void test(){
        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List userList = userDao.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }

        //一定要记得提交事务
        sqlSession.commit();
        //关闭SqlSession
        sqlSession.close(); 
    }
模糊查询

建议在业务中拼接完成

List userList = mapper.getUserLike("%李%");

或者这样:

select * from mybatis.user where name like "%"#{value}"%"

这样容易出现sql注入

select * from mybatis.user where name like "%${value}%"
核心文件配置解析
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

配置文件一共这么多内容

关于environments
可以配置多个环境,但是一个SqlSessionFactory实例只能有一个环境。

mybatis的驱动
一般有jdbc、manage。连接池用POOLED,还有其它的比如druid、c3p0等。

属性(properties)
1.通过外部properties配置文件引入:
db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

核心配置文件:

	
    
        
        
    

可以直接引入外部文件
可以在其中增加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的!

类型别名
	
    
        
    

可以直接用User
也可以指定一个包名,扫描包下所有的Bean

	
    
        
    

第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解

@Alias("user")
//实体类
public class User {}
设置

三个重要的设置:


全部设置:


  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

映射器

方式一:【推荐使用】

    
    
        
    

方式二:


    

注意点:

接口和它的Mapper配置文件必须同名!
接口和它的Mapper配置文件必须在同一个包下!

方式三:

    
    
        
    

注意点:

接口和它的Mapper配置文件必须同名!
接口和它的Mapper配置文件必须在同一个包下!

生命周期

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder:
一旦创建了 SqlSessionFactory,就不再需要它了。
局部变量

SqlSessionFactory:
说白就是可以想象为:数据库连接池。
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
SqlSessionFactory 的最佳作用域是应用作用域。
最简单的就是使用单例模式或者静态单例模式。

SqlSession:
连接到连接池的一个请求!
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
用完后需要赶紧关闭,否则资源被占用!

结果集映射
    
    
        
        
        
        
    

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

select中resultMap属性对应其resultMap标签的id,而resultMap中的type对应其需要映射的实体类,resultMap中所有的result标签,只需要映射数据库中和实体类中字段名不同的即可。

Lombok

有几个常用的注解
@Data 自动生成get、set方法还有equals方法。
@AllArgConstruct 自动生成有参构造
@NoArgConstruct 自动生成无参构造
@ToString 生成toString方法
@EqualsAndHashCode 生成equals和hashcode方法。

复杂查询环境搭建


查询嵌套处理:




    select * from teacher where id = #{id}

按照结果嵌套


        select s.id sid, s.name sname, t.name tname,t.id tid
        from student s,teacher t
        where s.tid = t.id and t.id = #{tid}
    

    
        
        
        
        
            
            
            
        
    

查询嵌套


    select * from mybatis.student where tid = #{tid}

此处备注一下:
column是给下一个子查询传递参数的。
注意:在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。

慢SQL 1s 1000s

面试高频

Mysql引擎
InnoDB底层原理
索引
索引优化!
MyBatis条件查询

关于这个条件查询,最好是在所有查询后面添加where 1=1这个条件,能先保证查询出所有的东西出来,也方便后面动态sql语句的编写。

所用实体类:

@Data
public class Blog {
    private int id;
    private String title;
    private String author;
    private Date createTime;
    private int views;
}

动态语句if:


  SELECT * FROM BLOG
  
    
         state = #{state}
    
    
        AND title like #{title}
    
    
        AND author_name like #{author.name}
    
  

动态语句choose
choose标签有when和otherwise标签,这个类似于Java中的switch语句。

    
        select * from mybatis.blog
        
            
        
    

但是最好不要把包含where的语句包含在sql标签中。

动态语句foreach:

    
    
        select * from mybatis.blog
        
            
                id = #{id}
            
        
    

建议:先在mybatis中写好sql,再改成动态sql。

缓存

可以使用缓存的数据:经常查询但是不经常改变的数据。

一级缓存:
一级缓存是针对Sqlsession的缓存。
一般是查询先走缓存,然后无数据再查询数据库。修改、删除、添加操作时候,会重新更新缓存。

二级缓存:
一个命名空间,也就是一个xml文件对应一个二级缓存。
开启全局缓存:

        
        

这个是不基于会话的,就是SqlSession关闭后,会自动把内容保存到二级缓存中。我们可以利用它来提高查询效率。

    
    

也可以在查询标签中,显式开启或者关闭某个方法是否走二级缓存。

我们需要在用缓存的时候,实现实体类的序列化功能,否则会报错。

总结:
只要开启了二级缓存,在同一个Mapper下就有效;
所有的数据都会先放在一级缓存中;
只有当会话提交或者关闭的时候,才会提交到二级缓存中!

缓存原理:

自定义缓存:
ehcache
要在程序中使用ehcache,先要导包!
在mapper中指定使用我们的ehcache缓存实现!
目前现在用的多的缓存,是redis。

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

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

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