parameterType写与不写的区别
时间: 2024-01-17 10:05:21 浏览: 111
parameterType 是 CSDN 开发的一种扩展,用于指定函数参数的类型。它的作用是在函数定义中明确指定参数的类型,从而提供更加严格的类型检查和编译器优化。
如果不写 parameterType,编译器会根据函数调用时传入的实际参数类型进行隐式类型转换。这样可能会导致一些潜在的问题,比如传入错误类型的参数,可能会造成程序运行时错误或者产生不可预期的结果。
而如果写上 parameterType,编译器会在编译阶段进行类型检查,如果传入的实际参数类型与指定的参数类型不匹配,会直接报错,提前发现问题。这样可以避免一些潜在的错误,并且在编译器优化方面也能够提供更好的性能。
总的来说,写上 parameterType 可以提高代码的可靠性和可维护性,减少潜在的错误,并且可以帮助编译器进行更好的优化。但是需要注意,使用 parameterType 也会增加代码的冗余性和可读性较差,因此需要根据具体情况来选择是否使用。
相关问题
mybatis中$和#的区别
在MyBatis中,`$`和`#`是两个特殊的字符,它们在动态SQL生成中有重要的作用:
1. `$`: 这是MyBatis的传统方式(即JDBC预编译语句的遗留支持),在动态SQL表达式中用于引用参数的值。当你在mapper XML文件中直接写 `${parameterName}`,它会被替换为传入的参数值。例如:
```xml
<select id="selectUser" parameterType="map" resultType="User">
SELECT * FROM user WHERE name = #{name}
</select>
```
2. `#`: 这种形式是MyBatis 3.3及以上版本推荐使用的,特别是在Spring Boot集成时,它可以更好地避免SQL注入攻击,因为MyBatis会将`#{}`视为一个表达式,并通过EL(Expression Language)引擎去解析和安全地传递参数值。这种写法更安全且易于维护。同样地:
```xml
<select id="selectUser" parameterType="User" resultType="User">
SELECT * FROM user WHERE name = #{name}
</select>
```
在上述XML中,`#name`会被Spring EL引擎解析成对应的请求参数值。
总结来说,`$`在老版本中使用较多,而`#`不仅提供了更好的安全特性,还兼容了更多现代的依赖和框架。使用`#`时,参数的类型信息会保存在Mapper的参数映射中,有助于MyBatis性能优化。
mybatis和mybatisplus在代码上的区别
### MyBatis 与 MyBatis Plus 的代码实现差异
#### 使用 MyBatis 进行 CRUD 操作
在 MyBatis 中,通常需要手动编写 SQL 映射文件或使用注解来定义 SQL 语句。这种方式提供了极大的灵活性,但也增加了编码量和潜在的错误风险。
```xml
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<!-- 插入用户记录 -->
<insert id="insertUser" parameterType="User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
<!-- 查询用户列表 -->
<select id="getUserList" resultType="User">
SELECT * FROM users WHERE name LIKE CONCAT('%', #{keyword}, '%')
</select>
</mapper>
```
```java
// UserMapper.java
public interface UserMapper {
void insertUser(User user);
List<User> getUserList(String keyword);
}
```
这种做法使得每次新增业务逻辑时都需要额外创建对应的 XML 文件并维护其中的 SQL 语句[^2]。
#### 使用 MyBatis Plus 实现相同的功能
相比之下,MyBatis Plus 提供了更简洁高效的 API 接口设计模式以及内置的方法支持基本的数据持久化操作,极大简化了日常开发工作:
```java
// BaseMapper 是 MyBatis Plus 提供的基础接口
public interface UserMapper extends BaseMapper<User> {}
// Service 层可以直接调用这些方法而无需关心底层 SQL 细节
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public boolean saveOrUpdateUser(User user){
return this.userMapper.insert(user) > 0;
}
public IPage<User> getUsersByKeyword(Page page, String keyword){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(User::getName, keyword);
return this.userMapper.selectPage(page, queryWrapper);
}
}
```
这里展示了如何仅通过继承 `BaseMapper` 就可以获得一系列常用的操作函数,并且可以通过条件构造器轻松构建复杂的查询条件,从而显著降低了手写 SQL 的需求[^4]。
阅读全文