Mybatis入门-基于注解实现单表、多表的增删改查

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Mybatis入门-基于注解实现单表、多表的增删改查


Mybatis入门-基于xml配置实现单表的增删改查


配置步骤

1.引入Mybatis的jar包


2.编写实体类与DAO接口


3.添加主配置文件(配置mysql环境,事务类型,数据源,连接数据库的基本信息,映射文件的位置)


4.使用mybatis中的注解


5.使用mybatis框架


使用步骤

1.读取配置文件,可使用mybatis封装的Resources类。


2.创建SQLSessionFactory工厂


3.使用工厂生产SQLsession对象


4.使用SQLSession创建DAO接口的代理对象


5.使用代理对象执行方法


6.提交事务,释放资源


实体类

/**
 * @Author: Promsing
 * @Date: 2021/4/5 - 9:08
 * @Description: User类、Account类
 * @version: 1.0
 */
public class User implements Serializable {
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;
    //一对多关系映射 一个用户对应多个账户
    private List<Account> accounts;
    public List<Account> getAccounts() {
        return accounts;
    }
    public void setAccounts(List<Account> account) {
        this.accounts = account;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + 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;
    }
}
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    //多对一 每个账户只能属于一个用户
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    public Double getMoney() {
        return money;
    }
    public void setMoney(Double money) {
        this.money = money;
    }
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

DAO接口+注解

/**
 * @Author: Promsing
 * @Date: 2021/4/5 - 9:10
 * @Description: mybatis:基于注解开发
 * @version: 1.0
 */
public interface IUserDao {
    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from User")
    //当实体类属性与MySQL列名不一致时
    //id属性可被其他方法引用---  @ResultMap("userMap")
    @Results(id="userMap", value = {
            //主键为true    库中列名     类中属性
            @Result(id=true,column = "id",property = "id"),
            @Result(column = "username",property = "username"),
            @Result(column = "birthday",property = "birthday"),
            @Result(column = "sex",property = "sex"),
            @Result(column = "address",property = "address"),
            //关系为一对多 延迟加载
            @Result(column = "id",property = "accounts",
                    many = @Many(
                            select = "com.dynamic_annotation_real.dao.IAccountDao.findAccountByUid",
                            fetchType = FetchType.LAZY))
    })
    List<User> findAll();
    /**
     * 查询一个
     * @param i
     * @return
     */
    @Select("select * from user where id=#{id}")
    User findById(Integer i);
    /**
     * 根据名称模糊查询
     * @param name
     * @return
     */
    @Select("select * from user where username like #{name}")
    List<User> findUserByName(String name);
    /**
     * 保存操作
     * @param user
     */
    @Insert("insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday})")
    void saveUser(User user);
    /**
     * 更新操作
     * @param user
     */
    @Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
    void updateUser(User user);
    /**
     * 删除用户
     * @param userid
     */
    @Delete("delete from User where id=#{id}")
    void deleteUser(Integer userid);
    /**
     * 查询总行数
     * @return
     */
    @Select("select count(id) from user")
    int findTotalUser();
}
public interface IAccountDao {
    /**
     * 查询所有
     * @return
     */
    @Select("select * from Account")
    @Results(id="accountMap",value = {
            @Result(id=true,column = "id",property = "id"),
            @Result(column = "uid",property = "uid"),
            @Result(column = "money",property = "money"),
            //配置立即加载
            @Result(property ="user", column = "uid",
                    one = @One(
                            select = "com.dynamic_annotation_real.dao.IUserDao.findById",
                            fetchType = FetchType.EAGER)),
    })
    List<Account> findAll();
    /**
     * 根据用户id查询账户信息
     * @param userId
     * @return
     */
    @Select("select * from Account where uid=#{userId}")
    List<Account> findAccountByUid(Integer userId);
}

主配置文件

<?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">
<!--myBatis的主配置文件 -->
<configuration>
    <!--配置别名-->
    <typeAliases>
        <package name="com.dynamic_annotation_real.domain"/>
    </typeAliases>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED">
                <!--配置连接数据库的基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--注解开发-->
    <mappers>
       <package name="com.dynamic_annotation_real.dao"></package>
    </mappers>
    <!--映射文件 注解方式(使用注解就要删除源配置文件)-->
   <!-- <mappers>
        <mapper class="com.dynamic_basics.dao.IUserDao"></mapper>
    </mappers>-->
</configuration>

测试类

public class AnnotationTest {
    private SqlSession sqlSession;
    private InputStream in;
    private IUserDao userDao;
    private IAccountDao accountDao;
    @Before
    public void init() throws Exception{
        //1.读取配置文件
        in= Resources.getResourceAsStream("SqlMapConfig_realanno.xml");
        //2.创建SqlSessionFactory工程
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
        //3.通过工厂创建SqlSession
         sqlSession = factory.openSession();
         //4.代理模式增强方法
        userDao = sqlSession.getMapper(IUserDao.class);
        accountDao = sqlSession.getMapper(IAccountDao.class);
    }
    @After
    public void destroy()  throws Exception{
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    @Test
    public void testFindAll(){
        List users = userDao.findAll();
        for (User user : users) {
            System.out.println("---每个用户的账户信息---");
            System.out.println(user);
            System.out.println(user.getAccounts());
        }
    }
    @Test
    public void testSaveUser(){
       User user=new User();
       user.setUsername("alibaba");
       user.setAddress("壹号院");
       user.setSex("女");
       user.setBirthday(new Date());
       userDao.saveUser(user);
    }
    @Test
    public void testUpdateUser(){
        User user=new User();
        user.setUsername("CSDN");
        user.setAddress("北京");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setId(45);
        userDao.updateUser(user);
    }
    @Test
    public void testDelete(){
        userDao.deleteUser(53);
    }
    @Test
    public void testFindOne(){
        User user = userDao.findById(52);
        System.out.println(user);
        //默认开启一级缓存
        User user2 = userDao.findById(52);
        System.out.println(user2);
        System.out.println(user==user2);
    }
    @Test
    public void testFindByName(){
        List users = userDao.findUserByName("%s%");
        for (User user : users) {
            System.out.println(user);
        }
    }
    @Test
    public void testFindTotal(){
        int totalUser = userDao.findTotalUser();
        System.out.println(totalUser);
    }
    /*注解一对一,一对多*/
    @Test
    public void testAccountFindAll(){
        List accounts = accountDao.findAll();
        for (Account account : accounts) {
            System.out.println("---每个账户信息---");
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }
}

总结mybatis注解

@Insert:实现新增


@Update:实现更新


@Delete:实现删除


@Select:实现查询


@Result:实现结果集封装


@Results:可以与@Result一起使用,封装多个结果集


@ResultMap:实现引用@Results定义的封装


@One:实现一对一结果集封装


@Many:实现一对多结果集封装



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
SQL XML Java
Mybatis基础使用知识(注解)
mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。 最后 mybatis 框架执行sql 并将结果映射为java对象并返回。采用ORM(对象关系映射)思想解决了实体和数据库映射问题,对jdbc进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
495 0
|
9月前
|
SQL XML Java
MyBatis注解的运用于条件搜索实践
通过上述的实践,我们可以看出MyBatis注解不仅能够实现条件搜索的需求,还能够提供灵活而强大的SQL构造能力,极大地简化了代码的复杂度,提高了开发效率。在实际的项目开发中,结合实际的业务需求合理选择MyBatis的配置方式(注解或XML),能够让数据持久层代码变得更加清晰和易维护。
174 11
|
11月前
|
SQL XML Java
菜鸟之路Day33一一Mybatis入门
本文是《菜鸟之路Day33——Mybatis入门》的教程,作者blue于2025年5月18日撰写。文章介绍了MyBatis作为一款优秀的持久层框架,如何简化JDBC开发。通过创建SpringBoot工程、数据库表`user`及实体类`User`,引入MyBatis依赖并配置数据库连接信息,使用注解方式编写SQL语句实现查询所有用户数据的功能。此外,还展示了如何通过Lombok优化实体类代码,减少冗余的getter/setter等方法,提高开发效率。最后通过单元测试验证功能的正确性。
387 19
|
11月前
|
存储 Java 数据库连接
Mybatisplus中的主要使用注解
3.有些注解需要配合其他配置使用。例如,@Version需要配合乐观锁插件使用,@EnumValue需要配合对应的TypeHandler使用。
510 11
|
SQL XML Java
MyBatis——选择混合模式还是全注解模式?
在MyBatis开发中,Mapper接口的实现方式有两种:全注解模式和混合模式。全注解模式直接将SQL嵌入代码,适合小规模、简单逻辑项目,优点是直观简洁,但复杂查询时代码臃肿、扩展性差。混合模式采用接口+XML配置分离的方式,适合大规模、复杂查询场景,具备更高灵活性与可维护性,但学习成本较高且调试不便。根据项目需求与团队协作情况选择合适模式至关重要。
255 4
|
人工智能 Java 数据库连接
MyBatis Plus 使用 Service 接口进行增删改查
本文介绍了基于 MyBatis-Plus 的数据库操作流程,包括配置、实体类、Service 层及 Mapper 层的创建。通过在 `application.yml` 中配置 SQL 日志打印,确保调试便利。示例中新建了 `UserTableEntity` 实体类映射 `sys_user` 表,并构建了 `UserService` 和 `UserServiceImpl` 处理业务逻辑,同时定义了 `UserTableMapper` 进行数据交互。测试部分展示了查询、插入、删除和更新的操作方法及输出结果,帮助开发者快速上手 MyBatis-Plus 数据持久化框架。
954 0
|
10月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1561 1
Spring boot 使用mybatis generator 自动生成代码插件
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1002 0
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
723 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
769 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
下一篇
开通oss服务