小工具知识网

当前位置: 首页 > 行业知识 > Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存

行业知识

Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存

2026-11-16 00:30:57 来源:互联网转载

Mybatis

入门

1.导入maven依赖

  org.mybatis  mybatis  x.x.x

2.配置核心文件

                                                                                                                                            

3.从 XML 中构建 SqlSessionFactory

���写mybatis工具类

package com.utils;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 java.io.IOException;import java.io.InputStream;/*SqlSessionFactory --> sqlSession */public class MybatisUtils{    //提升作用域    private static SqlSessionFactory sqlSessionFactory;    static{        try {            String resource="mybatis-config.xml";            InputStream inputStream = Resources.getResourceAsStream(resource);             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        } catch (IOException e) {            e.printStackTrace();        }    }    public  static SqlSession getSqlSession(){        return  sqlSessionFactory.openSession();       /* SqlSession sqlSession = sqlSessionFactory.openSession();        return sqlSession;*/    }}

dao接口

public interface Userdao {    List getUserList();}

接口实现类由原来的UserDaolmpl转变为-一个Mapper配置文件.

    select * from  mybatis.users

测试

public class UserdaoTest {    @Test    public  void  test(){        //第一步获得SqlSession对象        SqlSession sqlSession = MybatisUtils.getSqlSession();        //方式一getMapper      /*  Userdao userdao = sqlSession.getMapper(Userdao.class);        List userList = userdao.getUserList();*/        //方式二        List userList = sqlSession.selectList("com.dao.Userdao.getUserList");        for (User user : userList) {            System.out.println(user);        }        sqlSession.close();    }    }

测试二

public class UserdaoTest {    @Test    public  void  test(){        //第一步获得SqlSession对象        SqlSession sqlSession = MybatisUtils.getSqlSession();        try{            //方式一getMapper            Userdao userdao = sqlSession.getMapper(Userdao.class);            List userList = userdao.getUserList();            for (User user : userList) {                System.out.println(user);            }        } catch (Exception e) {            e.printStackTrace();        }finally {            //关闭sqlSession            sqlSession.close();        }

实现步骤

CRUD

select

insert

update

dalete

创建实体类

package com.pojo;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{" +                ", name='" + name + '\'' +                ", pwd='" + pwd + '\'' +                '}';    }}

编写接口

public interface UserMapper {    //查询所有用户    List getUserList();    //根据id查询客户     User getUserById(int id);     //新增     int addUser(User user);     //修改    int update(User user);    //删除    int dalete(int id);}

编写对应sql语句

 //查询所有用户    select *from user    //根据id查询客户            select *from user where  id = #{id};     //新增            insert  into user (id,name,pwd) values (#{id},#{name},#{pwd})      //修改            update user        set  name =#{name},pwd = #{pwd} where id = #{id};         //删除            delete  from user where  id = #{id};    

测试

public class UserdaoTest {    @Test    public  void  test(){        //第一步获得SqlSession对象        SqlSession sqlSession = MybatisUtils.getSqlSession();        try{            //方式一getMapper            UserMapper mapper= sqlSession.getMapper(UserMapper.class);            List userList = mapper.getUserList();            for (User user : userList) {                System.out.println(user);            }        } catch (Exception e) {            e.printStackTrace();        }finally {            //关闭sqlSession            sqlSession.close();        }        //方式二       /* List userList = sqlSession.selectList("com.dao.Userdao.getUserList");*/    }    @Test    public  void getUserById(){        SqlSession sqlSession = MybatisUtils.getSqlSession();        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        User userById = mapper.getUserById(1);        System.out.println(userById);        sqlSession.close();    }    @Test    public  void addUser(){        SqlSession sqlSession = MybatisUtils.getSqlSession();        UserMapper mapper = sqlSession.getMapper(UserMapper.class);         int res= mapper.addUser(new User(4,"王瑞","123"));         if (res>0){             System.out.println("添加成功");         }         sqlSession.commit();        sqlSession.close();    }    @Test    public  void update(){        SqlSession sqlSession = MybatisUtils.getSqlSession();        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        int update = mapper.update(new User(4, "徐龙象", "1999"));        /*if(update>0){v            System.out.println("修改成功");        }*/        sqlSession.commit();        sqlSession.close();    }    @Test    public  void dalete(){        SqlSession sqlSession = MybatisUtils.getSqlSession();        UserMapper mapper = sqlSession.getMapper(UserMapper.class);       mapper.dalete(4);        sqlSession.commit();        sqlSession.close();    }

万能map

Map传递参数,直接在sq|中取出key即可! [parameterType=“map”]

对象传递参数,直接在sq|中取对象的属性即可! [parameterType=“Object”]

只有一个基本类型参数的情况下,可以直接在sq|中取到!

多个参数用Map,或者注解!

新增
接口
 //mapint addUser2(Mapmap);
sql连接
    insert  into user (id,pwd) values (#{userid},#{password})
测试
@Testpublic void  addUser2(){    SqlSession sqlSession = MybatisUtils.getSqlSession();    UserMapper mapper = sqlSession.getMapper(UserMapper.class);    //HashMap    Map map = new HashMap();    map.put("userid",5);    map.put("password","123");  mapper.addUser2(map);  sqlSession.commit();    sqlSession.close();}
查询
sql
    select *from user where  id = #{id} ;
接口
User getUserById2(Mapmap);
测试
@Testpublic  void getUserById2(){    SqlSession sqlSession = MybatisUtils.getSqlSession();    UserMapper mapper = sqlSession.getMapper(UserMapper.class);    HashMap map = new HashMap();    map.put("id",1);    mapper.getUserById2(map);    System.out.println(mapper.getUserById2(map));    sqlSession.close();}

Mybatis模糊查询

Java代码执行的时候,传递通配符% %

List userListLike = mapper.getUserListLike("%xu%");

2.在sq|拼接中使用通配符!

接口
List getUserListLike(String name);
sql

根据name查询

    select  *from user where  name like "%"#{value}"%"
测试
@Testpublic  void getUserListLike(){    SqlSession sqlSession = MybatisUtils.getSqlSession();    UserMapper mapper = sqlSession.getMapper(UserMapper.class);    List userListLike = mapper.getUserListLike("xu");    for (User user : userListLike) {        System.out.println(user);    }    sqlSession.close();}

配置解析

1.核心配置文件

mybaits-config.xml

configuration(配置)    properties(属性)    settings(设置)    typeAliases(类型别名)    typeHandlers(类型处理器)    objectFactory(对象工厂)    plugins(插件)    environments(环境配置)        environment(环境变量)            transactionManager(事务管理器)            dataSource(数据源)    databaseIdProvider(数据库厂商标识)    mappers(映射器)

1.环境配置(environments)

尽管可以配置多个环境,但每个 SqlSessionFactory(创建SqlSession的工厂)实例只能选择一种环境。

Mybatis默认的事务管理器就是JDBC,

连接池:POOLED

                                                                                                                                                                

2.properties(属性)

新建db. properties文件
driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8username=rootpassword=123456
mybatis-config.xml
                                                                                

或者

    

可以直接引入外部文件

可以在其中增加一-些属性配置

如果两个文件有同一个字段,优先使用外部配置文件的!

3.类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

    
2.指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
    

每一个在包 com.pojo 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.pojo` 的别名为 userhello;若有注解,则别名为其注解值。

@Alias("userhello")public class User {

4.设置(settings)

一个配置完整的 settings 元素的示例如下:

    //全局性地开启或关闭所有映射器配置文件中已配置的任何缓存      //延迟加载的全局开关      //是否允许单个语句返回多结果集      //使用列标签代替列名,实际表现依赖于数据库驱动      //允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。      //指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集      /*    指定发现自动映射目标未知列(或未知属性类型)的行为。    NONE: 不做任何反应    WARNING: 输出警告日志( org.apache.ibatis.session.AutoMappingUnknownColumnBehavior 的日志等级必须设置为 WARN)    FAILING: 映射失败 (抛出 SqlSessionException)    */      /*    配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement), BATCH 执行器不仅重用语句还会执行批量更新。    支持 SIMPLE REUSE BATCH    默认 SIMPLE    */      //设置超时时间,它决定数据库驱动等待数据库响应的秒数。      //控制每次从数据库获取数据的行数      //允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false      //是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射      /*    MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。    */      /*    当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。    JdbcType常用值:NULL、VARCHAR 或 OTHER。    默认 OTHER    */     /*     指定对象的哪些方法触发一次延迟加载。    支持 用逗号分隔的方法列表。    默认 equals,clone,hashCode,toString    */          RowBounds rowBounds = new RowBounds(1,2);    SqlSession sqlSession = MybatisUtils.getSqlSession();    List        System.out.println(user);    }    sqlSession.close();}                                         SqlSession sqlSession = MybatisUtils.getSqlSession();        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);        HashMap hashMap = new HashMap();        //hashMap.put("title","Java");        hashMap.put("author","陈平安");        List            System.out.println(blog);        }        sqlSession.close();    }                               and views = #{views}    
```

以下属性是必须的:

**name:**Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。

**maxElementsInMemory:**在内存中缓存的element的最大数目。

**maxElementsOnDisk:**在磁盘上缓存的element的最大数目,默认值为0,表示不限制。

**eternal:**设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。

**overflowToDisk:**如果内存中数据超过内存限制,是否要缓存到磁盘上。

以下属性是可选的:

**timeToIdleSeconds:**对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。

**timeToLiveSeconds:**对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。

**diskPersistent:**是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。

**diskExpiryThreadIntervalSeconds:**对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。

**diskSpoolBufferSizeMB:**DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。

memoryStoreEvictionPolicy:如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。

缓存的3 种清空策略:

FIFO,first in first out (先进先出).

LFU, Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。

LRU,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

结束啦

上一篇:提升百度云下载速度的有效方法

下一篇:怎么拥有谷歌服务器?