首页 > 其他分享 >解决MyBatis中常见的错误

解决MyBatis中常见的错误

时间:2024-01-27 17:00:44浏览次数:22  
标签:映射 错误 数据库 常见 role MyBatis public 列名 name

传递多个参数时出现的错误

dao层中的方法只传递一个参数,但需要传递多个参数时会出现什么问题呢?

dao接口内容:

public interface RoleDao {
    //根据role_name和role_code查询用户
    public Role selectByNameAndCode(String name,String code);
}

对应接口的映射文件:

<select id="selectByNameAndCode" resultType="com.hrc.entity.Role">
   select * from t_role where role_name = #{name} and role_code=#{code}
 </select>

测试代码:

public class RoleTest {
    @Test
    public void queryTest() throws Exception{
        //读取 MyBatis配置文件资源
        //import org.apache.ibatis.io.Resources; 注意这里导入的包必须是ibatis下的
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
        //创建SqlSessionFactory工厂(根据读取mybatis配置文件进行创建)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
        //开启SqlSession会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射关系,获取映射文件中对应的接口
        RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
        //通过接口调用相关查询方法(注意一点:数据库中式存在这名角色的信息)
        Role role = roleDao.selectByNameAndCode("老师", "teacher");
        //输出结果
        System.out.println("role = " + role);
    }
}

结果展示:

原因是:MyBatis中如何传递多个参数时,默认第一个参数为param1或arg0后面参数依次类推。

解决方法:

使用注解@Param("起别名"):通过给参数起别名的方式

例如:

效果展示:

实现模糊查询

 模糊查询的sql语句为:

select * from 表名  where 列名 like '';
注意:
%:表示匹配0个或多个字符
_:表示匹配一个字符

实现模糊查询拥有两种方法解决:

使用MySQL中函数concat()

语法:

concat(字符串a,字符串b,......,字符串n)

举个例子:

dao接口中的方法:

public interface RoleDao {
    //根据role_name模糊查询用户
    public List<Role> likeByName(String name);
}

对应其映射文件内容:

<select id="likeByName" resultType="com.hrc.entity.Role">
        select * from t_role where role_name like concat('%',#{name},'%')
</select>

效果展示:

 通过模糊查询,找到姓名存在管理员的人有三个。

使用${}实现字符串拼接

语法:

${'\'%'+值+'%\''}

举个例子:

dao对应的映射文件内容:

效果展示:

这里出现的${}与#{}的区别

${}:一般是用于字符串拼接的,而字符串拼接会出现一个问题(SQL注入)

#{}:使用占位符的方式,mybatis通过PrepareStatement完成占位符赋值,可以有效的防止sql注入安全问题。

解决MyBatis映射文件中出现的特殊字符

由于MyBatis中存在一些特殊含义的字符比如:>,<,',&

要如何解决这些特殊字符呢?

方法一:使用这些字符的转义字符

举个例子:

dao接口内容:

public interface StudentDao {
    //查询年龄在min与max之间的学生
    public List<Student> queryByAge(@Param("min") Integer min ,@Param("max") Integer max);
}

对应其映射文件内容:

效果展示:

方法二:使用<![CDATA[sql]]>实现

举个例子:

接口对应其映射文件内容:

<select id="queryByAge" resultType="com.hrc.entity.Student">
        <![CDATA[
        select * from t_student where age >= #{min} and age <=#{max}
        ]]]>
</select>

效果展示:

结果与之前的一样。

列名和属性名不一致

之前说过,数据库中列名要和属性名一致,否则会出现数据库列内容映射不到实体类的属性值。

这里我们可以使用两种方法来解决这个问题:

这里我将实体类Role中部分属性与数据库中列名不一致:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role {
    //角色id与数据库中列名不一致
    private Integer rid;
    //角色的姓名与数据库中列名不一致
    private String name;
    //角色的编码与数据库中列名不一致
    private String code;
    //角色的描述与数据库中列名一致
    private String description;
}

方法一:给查询出来的数据库列名起别名

举个例子:

接口对应的映射器内容:

效果展示:

方法二:使用resultMap进行映射

举个例子:

效果展示:

结果与第二种方法的一致。

添加时获取递增主键的值

情景:数据库中主键一般自增形式,所以在添加的时候不需要为其提供主键值,

所以当我们添加数据时,如何获取其对应的主键值呢?

方法:

使用属性useGeneratedKeys以及keyProperty

举个例子:

测试代码:

public class RoleTest {
    @Test
    public void queryTest() throws Exception{
        //读取 MyBatis配置文件资源
        //import org.apache.ibatis.io.Resources; 注意这里导入的包必须是ibatis下的
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
        //创建SqlSessionFactory工厂(根据读取mybatis配置文件进行创建)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
        //开启SqlSession会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过映射关系,获取映射文件中对应的接口
        RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
        //通过接口调用相关查询方法(注意一点:数据库中式存在这名角色的信息)
        Role role = new Role(null,"普通用户","user","一个普通的用户");
        System.out.println("添加前的role: " + role);
        roleDao.insertRole(role);
        sqlSession.commit();
        System.out.println("添加后的role: " + role);
    }
}

效果展示:

控制台的内容:

数据库的内容:

 

标签:映射,错误,数据库,常见,role,MyBatis,public,列名,name
From: https://www.cnblogs.com/gzyhrc/p/17991526

相关文章

  • mybatis框架
    1.什么是MyBatis框架?MyBatis是一个开源的持久层框架,用于将Java对象与数据库进行映射。它提供了简单且直观的编程接口,可以实现自定义SQL查询、存储过程调用和结果映射等功能。MyBatis不是一个全面的ORM(对象关系映射)框架,而是一种半自动化的数据访问层解决方案。2.为什么使用MyBat......
  • 描述文件错误:如何屏蔽 iOS 软件自动更新,去除更新通知和标记
    描述文件错误:如何屏蔽iOS软件自动更新,去除更新通知和标记适用于iOS、iPadOS和watchOS,即iPhone、iPad和AppleWatch通用请访问原文链接:https://sysin.org/blog/disable-ios-update/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org如何禁用iPhone、iPad和A......
  • MyBatis注解模式和优化
    MyBatis注解模式之前我们使用xml文件方式实现sql语句的编写,我们也可以使用注解模式编写sql语句。前面的基本配置一致,不再叙述。第一步:创建实体类根据数据库的列名与表名设计实体类数据库信息:(表名t_student)实体类:@Data@NoArgsConstructor@AllArgsConstructorpubliccla......
  • windowForm程序的webView2错误 System.IO.FileNotFoundException: 系统找不到指定的文
    最近开发公司的一个项目,要求打包在windows中执行的exe可执行文件开始我想到的是使用windowsForm里面webView嵌套网页执行,vs自带提供的WebBrowser的内核是ie7的,兼容性确实不好,后面使用Microsoft.Web.WebView2(通过NuGet安装)兼容性问题解决了。在我的电脑上可以完整的运行,但是在同......
  • 搭建MyBatis工程
    快速搭建MyBatis工程第一步:创建一个maven的工程这里使用maven来创建MyBatis工程第二步:导入相关依赖需要导入MyBatis工程中对应的依赖,以及后期所需要的依赖<dependencies><!--mybatis的依赖--><dependency><groupId>org.mybatis</groupId>......
  • MyBatis简易教程
     MyBatis是数据库访问层框架,是一个应用层框架。 MyBatis简易教程(01):mybatis基础MyBatis简易教程(02):mybatis动态sqlMyBatis简易教程(03):mybatis关联映射(一对一)MyBatis简易教程(04):mybatis关联映射(一对多、多对一)MyBatis简易教程(05):mybatis关联映射(多对多)MyBatis简易教程(06):MyBati......
  • spring boot mybatis plus & tk-mybatis
    使用Mybatis时,最大的问题是,要写大量的重复SQL语句在xml文件中,除了特殊的业务逻辑SQL语句之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这大量增加了程序员的负担。避免重复书写CRUD映射的框架有两个通用mybati......
  • 修复“Monty Hall”游戏模拟的错误输出
    最近公司在做模拟器开发,因为开发技术员都是新手,经常遇到很多逻辑上得错误。游戏ROM文件没有损坏或错误。有时候下载的ROM文件可能出现问题,导致模拟器无法正确加载。有些模拟器提供调试选项,可以帮助你识别和解决问题。但是大部分得问题还得要我们自己解决。例如下列得问题。问题......
  • openGauss学习笔记-208 openGauss 数据库运维-常见故障定位案例-TPCC高并发长稳运行因
    openGauss学习笔记-208openGauss数据库运维-常见故障定位案例-TPCC高并发长稳运行因脏页刷盘效率导致性能下降208.1TPCC高并发长稳运行因脏页刷盘效率导致性能下降208.1.1问题现象TPCC高并发长稳运行因脏页刷盘效率导致性能下降,具体表现为:初始性能较高,随着运行时间增加,数据......
  • 常见的并联谐振应用案例
    并联谐振在许多领域都有广泛的应用,以下是一些具体的例子:音频处理:并联谐振可用于改善音响系统的音质。例如,它可以用于增强或抑制特定频率的信号,从而使声音更加清晰和质感。振动检测:并联谐振电路可以用于检测机械设备的振动状态,从而判断设备的运行状态是否正常。电磁波检测:并联谐振电......