Mybatis的缓存、druid、注解代替mapper.xml、嵌套代替对一、对多、分页

这篇博客介绍了如何在MyBatis中启用和配置二级缓存,通过在mapper.xml中添加cache标签,并展示了在Druid数据源下的配置方法。此外,还讲解了如何在Java代码中使用DruidDataSource,并提供了分页查询的配置和PageHelper插件的使用。同时,提到了在没有DAO实现类时,如何直接通过mapper接口调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心配置中默认有二级缓存
在mapper.xml中加入<cache></cache>即可 里面的属性默认即可
二级缓存需要关闭sqlSession或者事务提交
cache标签是namespace作用域下的即com.lee.mapper.IUserMapper下的,需要在类中序列化接口
注解代替mapper.xml,注解写在接口处,注解里面写sql语句
druid

druid

<!--pom配置文件加入配置-->
			<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
            </dependency>
<dataSource type="com.lee.MyBatisDruid">
                <!--用于连接数据库-->
                <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://10.36.144.46:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8&amp;useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>

                <!--使用配置文件的方式读取-->
                <!--<property name="driver" value="${driverClass}"/>-->
                <!--<property name="url" value="${url}"/>-->
                <!--<property name="username" value="${user}"/>-->
                <!--<property name="password" value="${password}"/>-->
</dataSource>
public class MyBatisDruid  extends PooledDataSourceFactory {

    public MyBatisDruid(){
       this.dataSource=new DruidDataSource();
    }

}

嵌套对一、对多

<!--resultMap解决属性和字段名称不一致情况 type就是返回值类型-->
    <!--<resultMap id="resultUserMap" type="manager">-->
        <!--<id column="id" property="id"></id>-->
        <!--<result column="name" property="mname"></result>-->
        <!--<result column="password" property="password"></result>-->
        <!--<result column="age" property="age"></result>-->
        <!--<result column="uid" property="uid"></result>-->
        <!--&lt;!&ndash;一对一、多对一 用association &ndash;&gt;-->
        <!--<association property="user" javaType="User">-->
            <!--<id column="uid" property="id"></id>-->
            <!--<result column="uname" property="name"></result>-->
            <!--<result column="upwd" property="password"></result>-->
            <!--<result column="uage" property="age"></result>-->

        <!--</association>-->
    <!--</resultMap>-->

    <!--<select id="selectManager" resultMap="resultUserMap">-->
<!--SELECT-->
	<!--m.*,u.id uid,u.name uname,u.password upwd,u.age uage-->
<!--FROM-->
	<!--manager m-->
	<!--INNER JOIN t_user u ON (-->
	<!--m.uid = u.id)-->
    <!--</select>-->
<resultMap id="resultUserMap" type="user">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="password" property="password"></result>
        <result column="age" property="age"></result>
        <result column="email" property="email"></result>
        <result column="salary" property="salary"></result>
        <result column="opendate" property="opendate"></result>
        <result column="png" property="png"></result>
        <result column="role" property="role"></result>
//select里面是另一个方法,语句,column的id是第一个查询语句查出来的id,作为方法的参数
        <!--多对多、一对多 collection -->
        <collection property="managerList"  select="com.lee.mapper.IUserMapper.selectManager1" column="id">
            <!--<id column="mid" property="id"></id>-->
            <result column="mname" property="mname"></result>
            <!--<result column="mpwd" property="password"></result>-->
            <!--<result column="mage" property="age"></result>-->
        </collection>
    </resultMap>
<select id="selectManager" resultMap="resultUserMap">
<!--起别名是因为两个表的字段名称重复了-->
SELECT
	u.*
FROM
	t_user u

    </select>
//这个方法selectManager1有参数#{uid},映射到上面的collection去调用
<select id="selectManager1" resultType="Manager">
        <!--起别名是因为两个表的字段名称重复了-->
        SELECT
        id id,name mname,age age,password password ,uid uid
        FROM
        manager
        where uid=#{uid}
    </select>

没有dao层的实现类的时候,使用mapper.xml作为实现类 service层返回一个mapper对象去调用dao层的相对的方法

public class UserServiceImpl extends BaseServiceImpl<Manager> implements IUserService {

    private IUserMapper mapper=null;
     {      SqlSession sqlSession=MybatisUtils.getSqlSession();
          mapper = sqlSession.getMapper(IUserMapper.class);
     }
    @Override
    protected IBaseDao<Manager> baseDao() {
        return mapper;
    }
}

分页需要加入配置

pom.xml中加入
<dependency>
		<groupId>com.github.pagehelper</groupId>
		<artifactId>pagehelper</artifactId>
		<version>5.1.10</version>
</dependency>

核心配置文件中

-<plugins>
<!-- 配置分页分页插件-->
加入分页插件
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

测试分页

@Test
    public void selectAll() {

        IUserService iUserService=new UserServiceImpl();
        //先设置显示的行数
        PageHelper.startPage(1,5);
        //调用方法
        ArrayList<Manager> managers = iUserService.selectAll();
        //managers实际是个page对象 通常使用PageInfo,所以再转
        Page page=(Page) managers;
        PageInfo pageInfo=new PageInfo(page);
        //page和pageInfo里面都有页数 条数 总页数总条数 数据
        List<Manager> list = pageInfo.getList();
        for (Manager manager : list) {
            System.out.println(manager);
        }
    }

maven项目中如果得不到传进来的参数,需要在pom.xml中配置告诉maven

<plugin>
      <artifactId>maven-compiler-plugin</artifactId>
     <version>3.8.0</version>
    <configuration>
        <compilerArgument>-parameters</compilerArgument>
   </configuration>
</plugin>
1. MyBatis是什么?有什么优点? MyBatis款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。MyBatis可以通过XML注解方式进行配置。 MyBatis的优点包括: - 简单易学:MyBatis的API非常简单,易于上手。 - 灵活性高:MyBatis可以灵活定制SQL,支持存储过程和高级映射。 - SQL和Java代码分离:MyBatis使用XML注解方式进行SQL配置,使得Java代码和SQL代码分离,易于维护。 - 缓存机制:MyBatis支持缓存和二级缓存,提高了查询效率。 - 映射灵活:MyBatis支持种映射方式,包括自动映射和手动映射。 2. MyBatis的工作流程是什么? MyBatis的工作流程如下: - 首先,应用程序通过MyBatis API请求Mapper接口中的方法。 - 然后,MyBatis根据Mapper接口中的方法名和参数信息生成对应的SQL语句。 - 接着,MyBatis通过JDBC执行SQL语句,并将结果集转换为Java对象。 - 最后,MyBatis返回查询结果给应用程序。 3. MyBatis缓存和二级缓存是什么? MyBatis缓存机制分为缓存和二级缓存。 - 缓存MyBatis缓存是在SqlSession对象中的缓存。当SqlSession对象被关闭之前,所有查询的结果都会被存储在这个缓存中。缓存的作用域是SqlSession级别的,同个SqlSession中相同的查询语句只会执行次,并且将结果缓存缓存中,下次执行相同的查询语句时就可以直接从缓存中获取结果。 - 二级缓存MyBatis的二级缓存是在Mapper命名空间级别的缓存。当SqlSession关闭时,SqlSession中的缓存将被清空,但是Mapper命名空间级别的缓存会被存储在个全局的缓存中,个SqlSession可以共享这个缓存。如果开启了二级缓存,当查询同条SQL语句时,MyBatis会先从二级缓存中查找,如果缓存中存在,则直接返回结果,否则才会去查询数据库。 4. MyBatis中的动态SQL是什么?有哪些动态SQL标签? MyBatis中的动态SQL是指在SQL语句中根据不同的条件动态拼接SQL语句的技术。MyBatis中有以下几种动态SQL标签: - if:判断条件为true时执行。 - choose:类似于Java中的switch语句,根据条件匹配执行。 - when:choose标签下的子标签,表示匹配的条件。 - otherwise:choose标签下的子标签,表示没有匹配的条件。 - trim:去掉SQL语句中的部分。 - where:添加WHERE子句。 - set:添加SET子句。 - foreach:遍历集合并执行SQL语句。 5. MyBatis中的ResultMap是什么? ResultMap是MyBatis中用来映射查询结果集的标签。ResultMap标签定义了如何将结果集映射到Java对象中。MyBatis中的ResultMap可以通过XML注解方式进行配置。ResultMap标签包含以下元素: - id:ResultMap的唯标识。 - type:映射结果集的Java类型。 - result:定义Java对象的属性和查询结果集的列之间的映射关系。 - association:定义Java对象的属性和另个Java对象之间的映射关系。 - collection:定义Java对象的属性和另个Java对象集合之间的映射关系。 - discriminator:定义映射结果集的条件。 6. MyBatis中如何进行分页查询? MyBatis中可以使用插件或者手动编写SQL语句来进行分页查询。 - 使用插件:MyBatis提供了分页插件PageHelper,可以非常方便地进行分页查询。在Mapper接口中定义方法时,只需传入页码和每页的记录数,PageHelper插件会自动进行分页。 - 手动编写SQL语句:手动编写SQL语句时,可以使用MySQL中的LIMIT关键字进行分页查询。例如:SELECT * FROM table LIMIT (page-1)*pageSize,pageSize。 7. MyBatis中如何实现表关联查询? MyBatis中实现表关联查询的方式有以下几种: - 嵌套查询:在SQL语句中使用嵌套查询,将查询结果作为子查询的条件进行查询。例如:SELECT * FROM table1 WHERE id IN (SELECT table1_id FROM table2 WHERE condition)。 - 连接查询:使用SQL语句中的JOIN关键字进行连接查询。例如:SELECT * FROM table1 JOIN table2 ON table1.id=table2.table1_id WHERE condition。 - 使用ResultMap:在ResultMap中使用association和collection标签进行表关联映射。 8. MyBatis中有哪些执行器(Executor)? MyBatis中有三种执行器: - SimpleExecutor:每次执行SQL语句时,都会创建个新的Statement对象。 - ReuseExecutor:在执行SQL语句之前会检查Statement是否已经存在,如果存在则复用Statement对象,否则创建新的Statement对象。 - BatchExecutor:在执行大量SQL语句时,使用批处理方式进行执行。 9. MyBatis中如何进行事务管理? MyBatis中的事务管理使用JDBC的事务管理方式。在MyBatis中,可以使用SqlSession对象的commit()和rollback()方法来提交和回滚事务。同时,MyBatis也支持Spring框架的事务管理,可以通过配置Spring的事务管理器来实现事务管理。 10. MyBatis中如何进行数据源配置? MyBatis中实现数据源配置的方式有以下几种: - 使用个SqlSessionFactory:每个SqlSessionFactory配置不同的数据源,通过SqlSessionFactory的openSession()方法获取SqlSession对象。 - 使用第三方数据源管理框架:例如Druid、C3P0等,可以通过这些框架来管理个数据源。 - 自定义数据源:自定义数据源时,需要实现javax.sql.DataSource接口,并配置DataSourceTransactionManager来管理事务。MyBatis提供了个AbstractRoutingDataSource抽象类,可以实现动态切换数据源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值