MyBatis代理Dao方式的增删改查的实现小结

 更新时间:2025年11月05日 09:28:49   作者:222you  
本文主要介绍了MyBatis代理Dao方式的增删改查的实现小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

首先创建MavenJava项目

1.UserMapper接口代码

package cn.tx.mapper;
​
import java.util.List;
​
import cn.tx.domain.User;
​
public interface UserMapper {
    public List<User> findAll();
    public User findById(Integer userId);
    public void insert(User user);
    public void update(User user);
    public void delete(Integer userId);
    public List<User> findByName(String username);
    public Integer findByCount();
}

2.UserMapper.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.qcbyjy.mapper.UserMapper">
    <select id="findAll" resultType="com.qcbyjy.domain.User">
        select * from user
    </select>
    <!-- 
        通过id查询 
        SQL语句使用#{占位符的名称,名称可以任意},仅限于基本数据类型和String类型
    -->
    <select id="findById" resultType="com.qcbyjy.domain.User" parameterType="int">
        select * from user where id = #{id};
    </select>
    <!--保存操作-->
    <insert id="insert" parameterType="com.qcbyjy.domain.User">
        /*
          keyProperty表示要返回的属性名称
          order取值AFTER表示插入数据后的行为
          resultType表示返回值的类型
        */
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select last_insert_id();
        </selectKey>
        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>
    <!-- 修改 -->
    <update id="update" parameterType="com.qcbyjy.domain.User">
        update user set username = #{username},birthday = #{birthday},sex = #{sex},address=#{address} where id = #{id}
    </update>
    <!-- 删除 -->
    <delete id="delete" parameterType="Integer">
        delete from user where id = #{id}
    </delete>
    <!-- 模糊查询 -->
    <select id="findByName" resultType="com.qcbyjy.domain.User" parameterType="string">
        <!-- 第一种方式的SQL语句 
        select * from user where username  like #{username}
        -->
        <!-- 第二章SQL语句的编写 强调:'%${value}%'不能修改,固定写法(不推荐使用)  -->
        select * from user where username  like '%${value}%'
    </select>
    <!-- 具体函数的查询 -->
    <select id="findByCount" resultType="int">
        select count(*) from user
    </select>
</mapper>

3.UserTest的代码

package cn.tx.test;
​
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
​
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
​
import cn.tx.domain.User;
import cn.tx.mapper.UserMapper;
​
public class UserTest {
    
    private InputStream in;
    private SqlSession session;
    private UserMapper mapper;
    
    @Before
    public void init() throws Exception {
        // 加载配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 创建工厂对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 创建Session对象
        session = factory.openSession();
        // 获取到代理对象
        mapper = session.getMapper(UserMapper.class);
    }
    
    @After
    public void destory() throws IOException {
        in.close();
        session.close();
    }
    
    /**
     * 测试查询所有的方法
     * @throws Exception 
     */
    @Test
    public void testFindAll() throws Exception {
        List<User> list = mapper.findAll();
        // 遍历
        for (User user : list) {
            System.out.println(user);
        }
        in.close();
    }
    
    @Test
    public void testFindById() throws Exception {
        User user = mapper.findById(41);
        System.out.println(user);
        in.close();
    }
​
    @Test
    public void testInsert() throws Exception {
        User user = new User();
        user.setUsername("美美");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("顺义");
        mapper.insert(user);
        session.commit();
         System.out.println(user.getId());
    }
    
    @Test
    public void testUpdate() throws Exception {
        User user = mapper.findById(41);
        user.setUsername("小凤");
        mapper.update(user);
        session.commit();
    }
    
    @Test
    public void testDelete() throws Exception {
        mapper.delete(48);
        session.commit();
    }
    
    // 第一种
    @Test
    public void testFindByName() throws Exception {
        List<User> list = mapper.findByName("%王%");
        for (User user : list) {
            System.out.println(user);
        }
    }
    // 第二种
    @Test
    public void testFindByName() throws Exception {
        List<User> list = mapper.findByName("王");
        for (User user : list) {
            System.out.println(user);
        }
    }
    
    @Test
    public void testFindByCount() throws Exception {
        Integer count = mapper.findByCount();
        System.out.println("总记录数:"+count);
    }
    
}

模糊查询符号使用区别

1.#{}

UserMapper.xml

<select id="findByName" parameterType="string" resultType="com.qcby.pojo.User">
    select * from user where username like #{username};
</select>

测试类

@Test
public void findByNameTest(){
    List<User> list=userMapper.findByName("%熊%");
    for (User user:list){
        System.out.println(user);
    }
}

2.${}

UserMapper.xml

<select id="findByName2" parameterType="string" resultType="com.qcby.pojo.User">
    select * from user where username like '%${value}%';
</select>

测试类

@Test
public void findByNameTest2(){
    List<User> list=userMapper.findByName2("熊");
    for (User user:list){
        System.out.println(user);
    }
}

3.模糊查询符号使用的区别

(1)#{}相当于JDBC的占位符,可以有效防止sql注入

${}相当于字符串拼接,容易引起sql注入问题

(2)#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号里可以是value或其他名称

${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value

(3)#{}like模糊查询,xml配置文件中可以直接写: ... like #{username}

${}like模糊查询,需要加两个%:  ... like '%${value}%'

(4).${}方式一般用于传入数据库对象,例如列表和表名,#{}方式一般用来传递接口传输过来的具体数据。

(5)由于#{}方式具有更高的安全行,所以能用#{}的地方尽量不要使用${}。

(6).Mybatis排序时使用order by动态参数时需要注意,用${}而不是#{}。

到此这篇关于MyBatis代理Dao方式的增删改查的实现小结的文章就介绍到这了,更多相关MyBatis代理Dao增删改查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Centos下SpringBoot项目启动与停止脚本的方法

    Centos下SpringBoot项目启动与停止脚本的方法

    这篇文章主要介绍了Centos下SpringBoot项目启动与停止脚本的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • SpringBoot使用Guava实现日志脱敏的示例代码

    SpringBoot使用Guava实现日志脱敏的示例代码

    本文主要介绍了SpringBoot使用Guava实现日志脱敏的示例代码,使用Guava中的Strings、Maps和CharMatcher类来进行日志脱敏,保护敏感数据的安全,感兴趣的可以了解一下
    2024-01-01
  • Java8处理List的双层循环问题

    Java8处理List的双层循环问题

    这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • SpringCloud 服务注册中的nacos实现过程

    SpringCloud 服务注册中的nacos实现过程

    这篇文章主要介绍了SpringCloud 服务注册之nacos实现过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 深入理解Java中1是true0是false

    深入理解Java中1是true0是false

    Java中,1可以被看作是true,0可以被看作是false,本文就来进行详细的讲解,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 使用Java读取本地文件并转换为MultipartFile对象的方法

    使用Java读取本地文件并转换为MultipartFile对象的方法

    在许多Java Web应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非常常用,用来表示HTTP请求中的文件,在本文中,我将演示如何编写代码来读取本地文件并将其转换为自定义的MultipartFile对象,需要的朋友可以参考下
    2025-08-08
  • Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    这篇文章主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 详解Java正则表达式中Pattern类和Matcher类

    详解Java正则表达式中Pattern类和Matcher类

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。包括两个类Pattern和Matcher Pattern,Pattern是一个正则表达式经编译后的表现模式。Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。
    2016-12-12
  • SpringBoot实现Md5对数据库数据加密的示例

    SpringBoot实现Md5对数据库数据加密的示例

    本文主要介绍了SpringBoot实现Md5对数据库数据加密的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • SpringBoot拦截器执行后,Controller层不执行的问题及解决

    SpringBoot拦截器执行后,Controller层不执行的问题及解决

    请求拦截器中若调用getInputStream()读取流,会导致Controller层无法获取请求体,引发400错误,解决方案:避免在拦截器中读取流,或使用缓存(如将流转为字符串)确保数据可重复使用
    2025-07-07

最新评论