在MyBatis中,Mapper接口的编写有以下几种方式:
1. 注解方式:使用注解来定义Mapper接口中的方法,并将SQL语句直接写在注解中。常用的Mapper注解包括@Select、@Insert、@Update、@Delete等,通过这些注解可以直接映射方法与对应的SQL语句。
示例:
```java
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(@Param("id") int id);
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
int addUser(User user);
}
```
2. XML映射文件方式:使用XML映射文件来定义Mapper接口中的方法和对应的SQL语句。在XML中定义SQL语句,并通过namespace和id来标识Mapper接口方法与XML中的SQL语句的对应关系。
示例:
```java
// UserMapper.java
public interface UserMapper {
User getUserById(int id);
int addUser(User user);
}
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="addUser" parameterType="com.example.User">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
</mapper>
```
3. 自定义SQL的Provider方式:使用注解和Provider类的配合来动态生成SQL语句。通过在Mapper接口上使用@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider等注解,指定Provider类来生成SQL语句。Provider类中定义了动态生成SQL的方法。
示例:
```java
@Mapper
public interface UserMapper {
@SelectProvider(type = UserSqlProvider.class, method = "getUserByIdSql")
User getUserById(int id);
@InsertProvider(type = UserSqlProvider.class, method = "addUserSql")
int addUser(User user);
}
public class UserSqlProvider {
public static String getUserByIdSql(int id) {
return "SELECT * FROM user WHERE id = " + id;
}
public static String addUserSql(User user) {
return "INSERT INTO user(name, age) VALUES(" + user.getName() + ", " + user.getAge() + ")";
}
}
```
这些方式各有优缺点,可以根据实际需求和个人偏好来选择最适合的方式。注解方式简洁方便,适合简单的SQL语句;XML方式可读性较好,支持复杂SQL场景;Provider方式灵活性较高,适用于需要动态生成SQL的情况。