MyBatis实现基于Mapper接口代理Dao的CURD

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MyBatis实现基于Mapper接口代理Dao的CURD

1.User类


package com.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

2.SqlMapConfig.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>
    <!--配置环境-->
    <environments default="mysql">
        <environment id="mysql">
            <!--配置事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>
    <!--映射配置文件的位置-->
    <!--注意这里用/-->
    <mappers>
        <mapper resource="com/dao/IUserDao.xml"></mapper>
    </mappers>
</configuration>

3.IUserDao接口

package com.dao;
import com.domain.QueryVo;
import com.domain.User;
import java.util.List;
//用户的持久层接口
public interface IUserDao {
    //查询所有
    List<User> findall();
    //根据id查询
    User findbyid(Integer id);
    /**
     *保存用户
     * @param user
     * @return 影响数据库记录的行数
     */
    int saveuser(User user);
    /**
     * 更新用户
     * @param user
     * @return
     */
    int updateUser(User user);
    /**
     * 根据id删除用户
     * @param id
     * @return
     */
    int deleteUser(Integer id);
    /**
     * 根据名称模糊查询
     * @param username
     * @return
     */
    List<User> finguserbyname(String username);
    /**
     * 查询总记录数
     * @return
     */
    int findtotal();
    /**
     * 根据QueryVo中的条件查询用户
     * @param vo
     * @return
     */
    List<User> findbyvo(QueryVo vo);
}

4.IUserDao.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">
<!--namespace确定该方法在哪个dao接口中-->
<mapper namespace="com.dao.IUserDao">
    <!--id来确定是具体哪个方法-->
    <!--id+namespace确定了一个固定的方法-->
    <!--resulttype表示要封装到那里去-->
    <!--里面写的是sql语句-->
    <select id="findall" resultType="com.domain.User">
        SELECT * FROM user;
    </select>
    <!--select * from user where id = ? ;-->
    <!---->
    <select id="findbyid"  parameterType="INT" resultType="com.domain.User">
         select * from user where id = #{id};
    </select>
    <!--配置保存是获取插入的id-->
    <insert id="saveuser" parameterType="com.domain.User">
          <selectKey keyColumn="id" keyProperty="id" resultType="int">
            select last_insert_id();
          </selectKey>
          insert into user (username,birthday,sex,address)
          values(#{username},#{birthday},#{sex},#{address});
    </insert>
    <update id="updateUser" parameterType="com.domain.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},
        address=#{address} where id=#{id}
    </update>
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{id};
    </delete>
    <!--select * from user where username like #{username};-->
    <select id="finguserbyname" resultType="com.domain.User" parameterType="String">
            select * from user where username like '%${value}%';
    </select>
    <select id="findtotal" resultType="int">
        select count(*) from user;
    </select>
    <select id="findbyvo" resultType="com.domain.User" parameterType="com.domain.QueryVo">
        select * from user where username like #{user.username};
    </select>
</mapper>

5测试类MybatisTest

package com.test;
import com.dao.IUserDao;
import com.domain.QueryVo;
import com.domain.User;
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 java.io.InputStream;
import java.util.Date;
import java.util.List;
//测试mybatis的crud方法
public class MybatisTest {
    private InputStream in ;
    private SqlSessionFactory factory;
    private SqlSession session;
    private IUserDao userDao;
    //    测试查询所有方法
    @Before
    //在测试之前执行
    public void init()throws Exception {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.创建 SqlSession 工厂对象
        factory = builder.build(in);
        //4.创建 SqlSession 对象
        session = factory.openSession();
        //5.创建 Dao 的代理对象
        userDao = session.getMapper(IUserDao.class);
    }
    //根据id来查询
    @Test
    public void testFindOne() {
        //6.执行操作
        User user = userDao.findbyid(41);
        System.out.println(user);
    }
    @Test
    public void saveuser(){
        User user = new User();
        user.setUsername("User property");
        user.setAddress("北京市顺义区");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存操作之前: "+user);
        //5.执行保存方法
        userDao.saveuser(user);
        System.out.println("保存操作之后: "+user);
    }
    @Test
    public void updateuser(){
        User user1 = userDao.findbyid(41);
        //更新操作
        user1.setAddress("河南");
        //更新用户
        int i = userDao.updateUser(user1);
        System.out.println(user1);
        System.out.println(i);
    }
    @Test
    public void deleteuser(){
        //根据id删除用户
    //    User user = userDao.findbyid(50);
        userDao.deleteUser(50);
    }
    @Test
    public void finduserbyname(){
        List<User> list = userDao.finguserbyname("王");
        for (int i = 0; i < list.size(); i++) {
            User user =  list.get(i);
            System.out.println(user);
        }
    }
    @Test
    public void findcount(){
        int findtotal = userDao.findtotal();
        System.out.println(findtotal);
    }
    //测试包装类作为参数,这个肯定远远不止这个简单的
    @Test
    public void testfindbyQueryVo(){
        //创建包装类
        QueryVo vo = new QueryVo();
        User user = new User();
        //封装对象
        user.setUsername("%王%");
        vo.setUser(user);
        List<User> list = userDao.findbyvo(vo);
        for (int i = 0; i < list.size(); i++) {
            User user1 =  list.get(i);
            System.out.println(user1);
        }
    }
    @After//在测试方法执行完成之后执行
    public void destroy() throws Exception{
        //提交事务
        session.commit();
        //7.释放资源
        session.close();
        in.close();
    }
}

6.加一个包装类的情况QueryVo.java

package com.domain;
import java.io.Serializable;
public class QueryVo implements Serializable {
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

总结:主要是IUserDao接口 IUserDao.xml和MybatisTest测试类之间的代码其他的变动不大

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
3月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
XML Java 数据库连接
Mybatis 模块拆份带来的 Mapper 扫描问题
Mybatis 模块拆份带来的 Mapper 扫描问题
43 0
|
28天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
84 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
28天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
47 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
240 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
28天前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
15 0
mybatis使用二:springboot 整合 mybatis,创建开发环境
|
28天前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)