项目管理与SSM框架 MyBatis(二)

简介: 项目管理与SSM框架 MyBatis(二)

三、MyBatis增删改查

3.1 新增

1、持久层接口添加方法

void addUser(User user);

2、映射文件添加标签

<insert id="addUser" parameterType="com.zj.pojo.User">
        INSERT INTO user VALUES (default ,#{username},#{sex},#{address})
    </insert>

3、编写测试方法

@Test
    public void TestAddUser() throws IOException {
        /*建造者*/
        SqlSessionFactoryBuilder SQLSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        /*建造者根据配置文件建造工厂*/
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = SQLSessionFactoryBuilder.build(resourceAsStream);
        /*工厂生产SqlSession*/
        SqlSession sqlSession = factory.openSession();
        /*SqlSession获取接口的代理对象*/
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        /*代理对象调用方法*/
        mapper.addUser(new User(0,"ddd","男","上海"));
        /*提交事务*/
        sqlSession.commit();
        /*释放资源*/
        sqlSession.close();
        resourceAsStream.close();
    }

注意:

  1. 当接口方法的参数类型为POJO类型时,SQL语句中绑定参数时使用#{POJO的属性名}即可。
  2. MyBatis事务默认手动提交,所以在执行完增删改方法后,需要手动调用SqlSession对象的事务提交方法,否则数据库将不发生改变。

3.2 修改

优化测试类

import com.zj.mapper.UserMapper;
import com.zj.pojo.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.IOException;
import java.io.InputStream;
import java.util.List;
public class TestUserMapper {
    InputStream resourceAsStream = null;
    SqlSession sqlSession = null;
    UserMapper mapper =null;
    /*优化*/
    @Before
    public void getSqlSession() throws IOException {
         /*配置文件*/
        resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
          /*建造者*/
        SqlSessionFactoryBuilder SQLSessionFactoryBuilder = new SqlSessionFactoryBuilder();
         /*建造者根据配置文件创建工厂*/
        SqlSessionFactory factory = SQLSessionFactoryBuilder.build(resourceAsStream);
        /*工厂生产SqlSession*/
        sqlSession = factory.openSession();
        /*SqlSession获取代理对象*/
        mapper = sqlSession.getMapper(UserMapper.class);
    }
    @Test
    public void TestSelectAllUser() throws IOException {
        List<User> users = mapper.selectAllUser();
        for (User user : users) {
            System.out.println(user);
        }
    }
    @Test
    public void TestAddUser() throws IOException {
        /*代理对象调用方法*/
        mapper.addUser(new User(0,"ddd","男","上海"));
        /*提交事务*/
        sqlSession.commit();
    }
    @After
    public void close() throws IOException {
      sqlSession.close();
      resourceAsStream.close();
    }
}

1、持久层接口添加方法

void updateUser(User user);

2、映射文件添加标签

<update id="updateUser" parameterType="com.zj.pojo.User">
        UPDATE user SET username = #{username}, sex = #{sex},address = #{address}  WHERE id = #{id}
    </update>

3、编写测试方法

@Test
    public void TestUpdateUser(){
        mapper.updateUser(new User(7,"哈哈哈","女","青岛市"));
        /*提交事务*/
        sqlSession.commit();
    }

3.3 根据id删除

1、持久层接口添加方法

/*根据id删除*/
    void removeUser(int id);

2、映射文件添加标签

<delete id="removeUser" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>

注:当方法的参数类型是简单数据类型时,#{}中可以写任意名称

  • 简单数据类型:基本数据类型、字符串等

3、编写测试方法

@Test
    public void TestRemoveUser(){
        mapper.removeUser(7);
        /*提交事务*/
        sqlSession.commit();
    }

3.4 模糊查询

1、持久层接口添加方法

/*模糊查询*/
    List<User> getUserLikeName(String userName);

2、映射文件添加标签

<select id="getUserLikeName" parameterType="string" resultType="com.zj.pojo.User">
        SELECT * FROM user WHERE username like #{username}
    </select>

模糊查询如果不想在调用方法时参数加%,可以使用拼接参数的方式设置Sql:

<select id="getUserLikeName" parameterType="string" resultType="com.zj.pojo.User">
        SELECT * FROM user WHERE username like '%${value}%'
    </select>

如果使用#还不想在调用方法的参数中添加%,可以使用<bind><bind>允许我们在 Sql语句以外创建一个变量,并可以将其绑定到当前的Sql语句中。既能防止sql注入还能在传递参数的时候不需要传递百分号。用法如下:

<select id="getUserLikeName" parameterType="string" resultType="com.zj.pojo.User">
        <bind name="likeName" value="'%'+username+'%'"/>
        SELECT * FROM user WHERE username like #{likeName}
    </select>

#和$的区别:

  1. #表示sql模板的占位符,$表示将字符串拼接到sql模板中。
  2. #可以防止sql注入,一般能用#就不用$。
  3. ${}内部的参数名必须写value。

我们看到在映射文件中,parameterType的值为string而没有写java.lang.String,这是为什么呢?

  • 参数/返回值类型为基本数据类型/包装类/String等类型时,我们可以写全类名,也可以写别名。

3、编写测试方法

/*模糊查询*/
    @Test
    public void TestGetUserLikeName(){
        List<User> users = mapper.getUserLikeName("%三%");
        for (User user : users) {
            System.out.println(user);
        }

如果使用sql拼接、或者是<bind>的话直接写参数就行了:

/*模糊查询*/
    @Test
    public void TestGetUserLikeName(){
        List<User> users = mapper.getUserLikeName("三");
        for (User user : users) {
            System.out.println(user);
        }
    }

3.5 分页查询

分页查询时,Sql语句使用limit关键字,需要传入开始索引和每页条数两个参数。MyBatis的多参数处理有以下方式:

顺序传参

Sql中的参数使用arg0,arg1...或param1,param2...表示参数的顺序。此方法可读性较低,在开发中不建议使用。

@Param传参

在接口方法的参数列表中通过@Param定义参数名称,在Sql语句中通过注解中所定义的参数名称指定参数位置。此方式参数比较直观的,推荐使用。

1、持久层接口方法

/*分页查询*/
    List<User> getUserByPage(@Param("start") int start, @Param("size") int size);

2、映射文件

<!--分页查询-->
    <select id="getUserByPage" resultType="com.zj.pojo.User">
        SELECT * FROM user LIMIT #{start},#{size}
    </select>

3、测试类

/*分页查询*/
    @Test
    public void TestGetUserByPage(){
        List<User> users = mapper.getUserByPage(0, 3);
        for (User user : users) {
            System.out.println(user);
        }
    }

POJO传参

自定义POJO类,该类的属性就是要传递的参数,在SQL语句中绑定参数时使用POJO的属性名作为参数名即可。此方式推荐使用。

1、自定义POJO

public class PageQuery {
  private int startIndex;
  private int pageSize;
    // 省略getter/setter/构造方法
}

2、持久层接口方法

/*分页查询2*/
    List<User> getUserByPage2(PageQuery pageQuery);

3、映射文件

<!--分页查询2-->
    <select id="getUserByPage2" resultType="com.zj.pojo.User">
        SELECT * FROM user LIMIT #{startIndex},#{pageSize}
    </select>

4、测试类

/*分页查询2*/
    @Test
    public void TestGetUserByPage2(){
        List<User> userByPage2 = mapper.getUserByPage2(new PageQuery(0, 3));
        for (User user : userByPage2) {
            System.out.println(user);
        }
    }

Map传参

如果不想自定义POJO,可以使用Map作为传递参数的载体,在SQL语句中绑定参数时使用Map的Key作为参数名即可。此方法推荐使用。

1、持久层接口方法

/*分页查询3*/
    List<User> getUserByPage3(Map<String,Object> params);

2、映射文件

<!--分页查询3-->
    <select id="getUserByPage3" resultType="com.zj.pojo.User" parameterType="map">
        SELECT * FROM user LIMIT #{start},#{size}
    </select>

3、测试类

/*分页查询3*/
    @Test
    public void TestGetUserByPage3(){
        Map<String, Object> map = new HashMap<>();
        map.put("start",0);
        map.put("size",3);
        List<User> userByPage3 = mapper.getUserByPage3(map);
        for (User user : userByPage3) {
            System.out.println(user);
        }
    }

3.6 聚合查询和主键回填

查询用户总数

1、持久层方法

int findCount();

2、映射文件

<!--查询总数-->
    <select id="findCount" resultType="int">
            select count(id) from user;
    </select>

3、测试

/*查询总数*/
    @Test
    public void TestGFindCount(){
        int count = mapper.findCount();
        System.out.println(count);
    }

主键回填

有时我们需要获取新插入数据的主键值。如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。

1、持久层方法

/*主键回填*/
    void addUser2 (User user);

2、映射文件

<!--主键回填-->
    <insert id="addUser2" parameterType="com.zj.pojo.User" >
         /*keyProperty:主键属性名称
           keyColumn:主键列名
           resultType:主键类型
           order:执行时机,插入之后执行*/
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
             SELECT LAST_INSERT_ID();
        </selectKey>
           INSERT INTO user VALUES (default ,#{username},#{sex},#{address})
    </insert>

SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键值,只适用于自增主键,且必须和insert语句一起执行。

3、测试

/*主键回填*/
    @Test
    public void TestAddUser2(){
        User user = new User(0,"啊张","男","海口市");
        mapper.addUser2(user);
        /*提交*/
        sqlSession.commit();
        /*获取回填的id*/
        int id = user.getId();
        System.out.println(id);//9
    }


相关文章
|
5月前
|
Java 数据库连接 Maven
手把手教你如何搭建SSM框架、图书商城系统案例
这篇文章是关于如何搭建SSM框架以及实现一个图书商城系统的详细教程,包括了项目的配置文件整合、依赖管理、项目结构和运行效果展示,并提供了GitHub源码链接。
手把手教你如何搭建SSM框架、图书商城系统案例
|
2月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
61 1
持久层框架MyBatisPlus
|
3月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
126 0
|
5月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
XML Java 数据库连接
如何搭建SSM框架、图书商城系统
这是一份详尽的《Spring + SpringMVC + Mybatis 整合指南》,作者耗时良久整理出约五万字的内容,现已经全部笔记公开。此文档详细地介绍了如何搭建与整合SSM框架,具体步骤包括创建Maven项目、添加web骨架、配置pom文件以及整合Spring、SpringMVC和Mybatis等。无论是对初学者还是有一定基础的开发者来说,都是很好的学习资源。此外,作者还提供了项目源码的GitHub链接,方便读者实践。虽然当前主流推荐学习SpringBoot,但了解SSM框架仍然是不可或缺的基础。
80 0
|
5月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
52 0
|
4月前
|
Java 应用服务中间件 数据库连接
ssm项目整合,简单的用户管理系统
文章介绍了一个使用SSM框架(Spring、SpringMVC、MyBatis)构建的简单用户管理系统的整合过程,包括项目搭建、数据库配置、各层代码实现以及视图展示。
ssm项目整合,简单的用户管理系统
|
7月前
|
前端开发 JavaScript Java
计算机Java项目|SSM智能仓储系统
计算机Java项目|SSM智能仓储系统
|
5月前
|
SQL Java 应用服务中间件
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
这篇文章是关于如何使用SSM框架搭建图书商城管理系统的教程,包括完整过程介绍、常见问题解答和售后服务,提供了项目地址、运行环境配置、效果图展示以及运行代码的步骤。
使用SSM搭建图书商城管理系统(完整过程介绍、售后服务哈哈哈)
|
6月前
|
存储 关系型数据库 测试技术
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)(2)
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)
116 1