秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行

别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !

下篇更新:

秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。

默认的类型别名


MyBatis的增删改查

  1. 添加

    insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')

  2. 删除

    为什么delete函数的返回值为int从数据库操作的角度来看,大多数数据库管理系统(如MySQL、Oracle、SQL Server等)在执行DELETE语句时,会返回一个表示受影响的行数(即被删除的行数)的整数值。(同理增删改都是返回一个表示受影响的行数)
    delete from t_user where id = 6

  3. 修改

    update t_user set username = '张三' where id = 5

  4. 查询一个实体类对象

    select * from t_user where id = 2

    //如何打印结果

    User user = userMapper.getUserById();

    System.out.println(user);

  5. 查询集合(多行多列)

    select * from t_user

复制代码
    //如何打印结果
    List<user> list = mapper.getAlluer();
    list,foreach(user -> System.out.println(user));
  • 注意:

    1. 查询的标签select【只有select才要!!!】必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系(因为mybatis不知道要用哪个映射关系,所以才会报错
      • resultType:自动映射(类型),用于属性名和表中字段名一致的情况,设置的是默认的映射关系
      • resultMap:设置自定义的映射关系,用于一对多或多对一或字段名和属性名不一致的情况
    2. 当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值,例如 User getUserById()、List getUserList()

idea中如何设置文件的配置模板

1. mybatis-config.xml核心配置文件

这样就可以快速创建mybatis-config.xml核心配置文件了:

然后再设置一下这个模板的代码(不固定的地方则空白即可,如:类型别名所在的包,最后的映射文件等等),具体情况,具体设置。

2. properties文件的模板

我们这里设置一个模板名jdbc.properties的模板:因为核心配置文件我设置了properties,所以也得必须创建该properties,所以就来弄一个模板

3. 映射文件的模板

下面是mapper接口文件(即创建的是interface-java类),根据不同用法创建不同的mapper接口文件,故不设置模板。如下创建了名为UserMapper的接口文件,意为操作User表的接口文件,

接口文件创建后,创建映射文件:

所以设置映射文件模板:全类名为自己设置

这样就方便还可以设置如一种sql方法就用一种(接口+映射)的方式这样,设置多个方式(可选)。

MyBatis获取参数值的两种方式(重点)

  • MyBatis获取参数值的两种方式:${}和#{}
  • ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
  • ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

单个字面量类型的参数

  • 若mapper接口中的方法参数为单个的字面量类型,此时可以使用KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}以_**任意的名称**_(...{}需要手动加单引号

    select * from t_user where username = #{username} select * from t_user where username = '${username}'

多个字面量类型的参数

3.5.9以上的mybatis依赖可以直接用变量(参数)名,而不用arg0,arg1和param1,param2了

  • 若mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数以如下两种方式放在一个map集合中

    1. 以arg0,arg1...为键,以参数为值;
    2. 以param1,param2...为键,以参数为值;
  • 因此只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获...{}需要手动加单引号。

  • 使用arg或者param都行,要注意的是,arg是从arg0开始的,param是从param1开始的

    select * from t_user where username = #{arg0} and password = #{arg1} select * from t_user where username = '{param1}' and password = '{param2}'

map集合类型的参数

  • 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获...{}需要手动加单引号

    select * from t_user where username = #{username} and password = #{password}

    @Test

    public void checkLoginByMap() {

    SqlSession sqlSession = SqlSessionUtils.getSqlSession();

    ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

    Map<String,Object> map = new HashMap<>();

    map.put("usermane","admin");

    map.put("password","123456");

    User user = mapper.checkLoginByMap(map);

    System.out.println(user);

    }

实体类类型的参数

  • 若mapper接口中的方法参数为实体类对象时此时可以使用KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{},通过访问实体类对象中的属...{}需要手动加单引号。实际可能用到这个比较多

    insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})

    @Test

    public void insertUser() {

    SqlSession sqlSession = SqlSessionUtils.getSqlSession();

    ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

    User user = new User(null,"Tom","123456",12,"男","123@321.com");

    mapper.insertUser(user);

    }

使用@Param标识参数

  • 可以通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中,相当于第二和第三种方法的结合。

    1. 以@Param注解的value属性值为键,以参数为值;
    2. 以param1,param2...为键,以参数为值;
  • 只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获...{}需要手动加单引号

    复制代码
    <select id="CheckLoginByParam" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>

    @Test

    public void checkLoginByParam() {

    SqlSession sqlSession = SqlSessionUtils.getSqlSession();

    ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

    mapper.CheckLoginByParam("admin","123456");

    }

总结

  • 建议分成两种情况进行处理

    1. 实体类类型的参数
    2. 使用@Param标识参数

MyBatis的各种查询功能

  1. 如果查询出的数据只有一条,可以通过
    1. 实体类对象接收
    2. List集合接收
    3. Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}
  2. 如果查询出的数据有多条,一定不能用实体类对象接收,会抛异常TooManyResultsException,可以通过
    1. 实体类类型的LIst集合接收
    2. Map类型的LIst集合接收
    3. 在mapper接口的方法上添加@MapKey注解

查询一个实体类对象

复制代码
/**
 * 根据用户id查询用户信息
 * @param id
 * @return
 */
User getUserById(@Param("id") int id);


<!--User getUserById(@Param("id") int id);-->
<select id="getUserById" resultType="User">
	select * from t_user where id = #{id}
</select>

查询一个List集合

复制代码
/**
 * 查询所有用户信息
 * @return
 */
List<User> getUserList();


<!--List<User> getUserList();-->
<select id="getUserList" resultType="User">
	select * from t_user
</select>

查询单个数据

咱们这里的resultType依旧可以用User,因为User数据库表里面有integer,即通过User表识别查询的数据为integer,当然也可以自己如下直接设置,因为"单个数据"的"类型"这两个已知,便自己写为integer

复制代码
/**  
 * 查询用户的总记录数  
 * @return  
 * 在MyBatis中,对于Java中常用的类型都设置了类型别名  
 * 例如:java.lang.Integer-->int|integer  
 * 例如:int-->_int|_integer  
 * 例如:Map-->map,List-->list  
 */  
int getCount();


<!--int getCount();-->
<select id="getCount" resultType="_integer">
	select count(id) from t_user
</select>

查询一条数据为map集合

之后会用的很多,是因为有可能resultType设置为User(我们自己写的数据库表),有可能里面没有查询表结果中某一个或是多个的数据类型的映射(即实体对象),此时就可以直接用map集合,把他们全部存入map。

复制代码
/**  
 * 根据用户id查询用户信息为map集合  
 * @param id  
 * @return  
 */  
Map<String, Object> getUserByIdToMap(@Param("id") int id);


<!--Map<String, Object> getUserByIdToMap(@Param("id") int id);-->
<select id="getUserByIdToMap" resultType="map">
	select * from t_user where id = #{id}
</select>
<!--结果:{password=123456, sex=男, id=1, age=23, username=admin}-->

查询多条数据为map集合

方法一
复制代码
/**  
 * 查询所有用户信息为map集合  
 * @return  
 * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取  
 */  
List<Map<String, Object>> getAllUserToMap();


<!--Map<String, Object> getAllUserToMap();-->  
<select id="getAllUserToMap" resultType="map">  
	select * from t_user  
</select>
<!--
	结果:
	[{password=123456, sex=男, id=1, age=23, username=admin},
	{password=123456, sex=男, id=2, age=23, username=张三},
	{password=123456, sex=男, id=3, age=23, username=张三}]
-->
方法二
复制代码
/**
 * 查询所有用户信息为map集合
 * @return
 * 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键(),值是每条数据所对应的map集合
 */
@MapKey("id")
Map<String, Object> getAllUserToMap();


<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map">
	select * from t_user
</select>
<!--
	结果:
	{
	1={password=123456, sex=男, id=1, age=23, username=admin},
	2={password=123456, sex=男, id=2, age=23, username=张三},
	3={password=123456, sex=男, id=3, age=23, username=张三}
	}
-->

特殊SQL的执行

模糊查询

复制代码
/**
 * 根据用户名进行模糊查询
 * @param username 
 * @return java.util.List<com.atguigu.mybatis.pojo.User>
 * @date 2022/2/26 21:56
 */
List<User> getUserByLike(@Param("username") String username);


<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
	<!--select * from t_user where username like '%${mohu}%'-->  
	<!--select * from t_user where username like concat('%',#{mohu},'%')-->  
	select * from t_user where username like "%"#{mohu}"%"
</select>
  • 其中select * from t_user where username like "%"#{mohu}"%"是最常用的

批量删除

  • 只能使用${},如果使用#{},则解析后的sql语句为delete from t_user where id in ('1,2,3'),这样是将1,2,3看做是一个整体,只有id为1,2,3的数据会被删除。正确的语句应该是delete from t_user where id in (1,2,3),或者delete from t_user where id in ('1','2','3')

    /**

    • 根据id批量删除
    • @param ids
    • @return int
    • @date 2022/2/26 22:06
      */
      int deleteMore(@Param("ids") String ids);

    delete from t_user where id in (${ids})

    //测试类

    @Test

    public void deleteMore() {

    SqlSession sqlSession = SqlSessionUtils.getSqlSession();

    SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);

    int result = mapper.deleteMore("1,2,3,8");

    System.out.println(result);

    }

动态设置表名

  • 只能使用${},因为表名不能加单引号

    /**

    • 查询指定表中的数据
    • @param tableName
    • @return java.util.List<com.atguigu.mybatis.pojo.User>
    • @date 2022/2/27 14:41
      */
      List getUserByTable(@Param("tableName") String tableName);
      select * from ${tableName}

添加功能获取自增的主键

  • 使用场景:

  • 当有班级表和学生表满足如下一对多或者多对多关系时,需设置中间表时,我们需要获取新添加的班级的id来给中间表。

  • t_clazz(clazz_id,clazz_name)

    • t_student(student_id,student_name,clazz_id)
    1. 添加班级信息
    2. 获取新添加的班级的id
    3. 为班级分配学生,即将某学的班级id修改为新添加的班级的id
  • 在mapper.xml中设置两个属性

  • useGeneratedKeys:设置当前标签中的sql使用了自增的主键

  • keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中(如下我们设置的为id属性即id列,这样返回的每行数据就可以带上其对应的id了)

    /**

    • 添加用户信息
    • @param user
    • @date 2022/2/27 15:04
      */
      void insertUser(User user);

    insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})

    //测试类

    @Test

    public void insertUser() {

    SqlSession sqlSession = SqlSessionUtils.getSqlSession();

    SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);

    User user = new User(null, "ton", "123", 23, "男", "123@321.com");

    mapper.insertUser(user);

    System.out.println(user);

    //输出:user{id=10, username='ton', password='123', age=23, sex='男', email='123@321.com'},自增主键存放到了user的id属性中

    }

别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !

下篇更新:

秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。

相关推荐
Li.CQ1 小时前
SQL学习笔记(二)
笔记·sql·学习
小二·3 小时前
MyBatis基础入门《十五》分布式事务实战:Seata + MyBatis 实现跨服务数据一致性
分布式·wpf·mybatis
小二·3 小时前
MyBatis基础入门《十四》多租户架构实战:基于 MyBatis 实现 SaaS 系统的动态数据隔离
数据库·架构·mybatis
白衣衬衫 两袖清风3 小时前
SQL联查案例
数据库·sql
晨曦5432106 小时前
MySQL MOD()函数详解与Python对比
sql
甘露s7 小时前
MySQL深入之索引、存储引擎和SQL优化
数据库·sql·mysql
偶遇急雨洗心尘7 小时前
记录一次服务器迁移时,数据库版本不一致导致sql函数报错和系统redirect重定向丢失域名问题
运维·服务器·数据库·sql
Logic1018 小时前
《Mysql数据库应用》 第2版 郭文明 实验5 存储过程与函数的构建与使用核心操作与思路解析
数据库·sql·mysql·学习笔记·计算机网络技术·形考作业·国家开放大学
小二·8 小时前
MyBatis基础入门《十六》企业级插件实战:基于 MyBatis Interceptor 实现 SQL 审计、慢查询监控与数据脱敏
数据库·sql·mybatis
小二·8 小时前
MyBatis基础入门《十二》批量操作优化:高效插入/更新万级数据,告别慢 SQL!
数据库·sql·mybatis