Mybatis动态sql和缓存

1.动态sql【重点】

1.右键点击File–>New–>Module,如图所示:在这里插入图片描述
2.选择Java,并点击Next。如图所示:
在这里插入图片描述
3.填写项目名称,点击Finish。如图所示:
在这里插入图片描述
4.在sec目录下创建jdbc.properties的代码如下:

driver=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&uesSSL=false&serverTimezone=Asia/Shanghai

如图所示:在这里插入图片描述
5.在sec目录下创建mybatis-config.xml的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--读取小配置文件信息 resource:路径 相当于src-->
    <properties resource="jdbc.properties" />
    <!--实体类别名  name:java实体类全限定名 别名:默认实体类名(大小均可)-->
    <typeAliases>
        <package name="com.txw.entity"/>
    </typeAliases>
    <!--连接环境 default写的是要使用连接环境的id值-->
    <environments default="mysql">
        <!--连接环境 mysql id:当前环境的名字-->
        <environment id="mysql">
            <!--事务控制的方式 JDBC:使用原始JDBC事务控制。 JAT:分布式事务管理。-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池配置 Mybatis默认为PUBLIC 第三方连接池:dbcp c3p0 druid-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册mapper文件-->
    <mappers>
    </mappers>
</configuration>

如图所示:在这里插入图片描述
6.编写MybatisUtils的代码如下:

package com.txw.util;

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.InputStream;
/**
 * Mybatis工具类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class MybatisUtils {
    private static SqlSessionFactory ssf = null;
    private static ThreadLocal<SqlSession> t1 = new ThreadLocal<SqlSession>();

    static {
        try {
            // 1.加载mybatis-config.xml
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 2.创建SQLSessionFactory工厂对象
            ssf = new SqlSessionFactoryBuilder().build(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     */
    public static SqlSession openSession(){
        // 3.通过工厂对象获取SQLSession对象(连接)
        SqlSession ss = t1.get();
        if (ss == null){
            ss = ssf.openSession();
            t1.set(ss);
        }
        return ss;
    }

    /**
     * 获取DAO的实现类
     * @param clazz
     * @return
     */
    public static Object getMapper(Class clazz){
        return openSession().getMapper(clazz);
    }

    /**
     * 关闭资源
     */
    public static void close(){
        openSession().close();
        t1.remove();
    }

    /**
     * 事务提交
     */
    public static void commit(){
        openSession().commit();
        close();
    }

    /**
     * 事务回滚
     */
    public static void rollback(){
        openSession().rollback();
        close();
    }
}

如图所示:在这里插入图片描述
7.编写User的代码如下:

package com.txw.entity;

import java.io.Serializable;
import java.util.Date;
/**
 * 用户实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")    // 注解警告信息
public class User implements Serializable {
    private int id;
    private String name;     // 姓名
    private String password;  // 密码
    private Date birthday;   // 生日

    public User() {
    }

    public User(int id, String name, String password, Date birthday) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.birthday = birthday;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

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

如图所示:
在这里插入图片描述
8.在mybatis-config.xml添加代码如图所示:在这里插入图片描述

1.1 sql片段

将Sql语句中冗余的部分抽取出来,定义为一个Sql片段,后续可以反复使用。
1.编写UserDao的代码如下:

package com.txw.dao;

import com.txw.entity.User;
import org.apache.ibatis.annotations.Param;
/**
 * 用户持久层
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")    // 注解警告信息
public interface UserDao {

    /**
     * 根据id查询User信息
     * @param id
     * @return
     */
    public User selectUserById(int id);

    /**
     * 根据用户名和密码查询User信息
     * @param name
     * @param password
     * @return
     */
    public User selectUaserByNameAndPassword(@Param("name")String name,@Param("password")String password);
}

如图所示:在这里插入图片描述
2.UserDaoMapper.xml的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.txw.dao.UserDao">
    <!--结果映射-->
    <resultMap id="UserResultMap" type="User">
        <id property="id" column="t_id"/>
        <result property="name" column="t_name"/>
        <result property="password" column="t_password"/>
        <result property="birthday" column="t_birthday"/>
    </resultMap>
    <!--sql片段 id:片段的名字-->
    <sql id="SELECT_USER">
         select t_id,t_name,t_password,t_birthday from t_user
    </sql>
     <!--根据id查询User信息-->
    <select id="selectUserById" resultMap="UserResultMap">
       <include refid="SELECT_USER"/> where t_id = #{id}
    </select>
    
     <!--根据用户名和密码查询User信息-->
    <select id="selectUaserByNameAndPassword" resultMap="UserResultMap">
        <include refid="SELECT_USER"/> where t_name = #{name} and t_password = #{password}
    </select>
    
</mapper>

如图所示:在这里插入图片描述
3.编写UserDaoTest的代码如下:

package com.txw.test;

import com.txw.dao.UserDao;
import com.txw.entity.User;
import com.txw.util.MybatisUtils;
import org.junit.Test;
/**
 * 测试
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")    // 注解警告信息
public class UserDaoTest {

    /**
     * 根据id查询User信息
     */
    @Test
    public void testSelectUserById()  throws Exception{
       UserDao userDao = (UserDao)MybatisUtils.getMapper(UserDao.class);
       User user = userDao.selectUserById(3);
        System.out.println(user);
    }
	 /**
     * 根据用户名和密码查询User信息
     */
    @Test
    public void testSelectUaserByNameAndPassword(){
        UserDao userDao = (UserDao)MybatisUtils.getMapper(UserDao.class);
        User user = userDao.selectUaserByNameAndPassword("txw","123456");
        System.out.println(user);
    }
}

如图所示:在这里插入图片描述

1.2 where相关处理

通过判断 动态筛选查询条件。
1.编写UserDao的代码如下:

/**
     * 通过各种条件查询用户信息
     * @param user
     * @return
     */
    public List<User> selectUserAll(User user);

如图所示:在这里插入图片描述
2.在UserDaoMapper.xml添加的代码如下:

  <!--通过各种条件查询用户信息-->
    <select id="selectUserAll" resultMap="UserResultMap">
        <include refid="SELECT_USER"/>
        <where>
            <if test="id != null">
                t_id = #{id}
            </if>
            <if test="name != null">
                and t_name = #{name}
            </if>
            <if test="password != null">
                and t_password = #{password}
            </if>
            <if test="birthday != null">
                and t_birthday = #{birthday}
            </if>
        </where>
    </select>

如图所示:在这里插入图片描述
注意:where动态判断会自动忽略 标签后的第一个and 或者 or。
3.编写UserDaoTest的代码如下:

 /**
     * 通过各种条件查询用户信息
     */
    @Test
    public void testSelectUserAll(){
        UserDao userDao = (UserDao)MybatisUtils.getMapper(UserDao.class);
        User u = new User(1,null,null,null);
       List<User> list = userDao.selectUserAll(u);
        for (User user : list) {
            System.out.println(user);
        }
    }

如图所示:在这里插入图片描述

1.3 update相关处理

通过判断 动态设置要修改的列。
在这里插入图片描述

1.4 批量操作 批量删除在这里插入图片描述## 2 缓存(cache)

在这里插入图片描述
Mybatis全局缓存的使用
1.告知Mybatis框架开启全局缓存的代码如下:

 <!--开启全局缓存-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

如图所示:在这里插入图片描述
2.在需要进行缓存操作的Mapper文件中声明 使用缓存。如图所示:
在这里插入图片描述
3.实体实现序列化接口Serializable,如图所示:在这里插入图片描述
4.在MybatisUtils添加如图所示的代码:
在这里插入图片描述
5.测试的代码如下:

package com.txw.test;

import com.txw.dao.UserDao;
import com.txw.entity.User;
import com.txw.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
 * 测试缓存
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")    // 注解警告信息
public class TestCache {
    @Test
    public void testCache() throws Exception{
        System.out.println("--------Client 1-----------");
        SqlSession ss = MybatisUtils.getSqlSession();
        UserDao userDao1 = ss.getMapper(UserDao.class);
        List<User> list1 = userDao1.selectUserAll(new User());
        for (User user : list1) {
            System.out.println(user);
        }
        System.out.println("--------Client 2-----------");
        SqlSession ss2 = MybatisUtils.getSqlSession();
        UserDao userDao2 = ss.getMapper(UserDao.class);
        List<User> list = userDao2.selectUserAll(new User());
        for (User user : list) {
            System.out.println(user);
        }
    }
}

如图所示:在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值