“雪消门外千山绿,花发江边二月晴”
介绍
在前面介绍过MyBatis基于映射关系(也就是XML文件配置)来实现操作数据库MyBatis关联映射关系
现在,我们来看下基于注解,MyBatis如何实现数据库的CRUD(增删改查)操作。
MyBatis常用Annotation注解
注解 | 功能 |
---|---|
Select | 映射查询的SQL语句 |
SelectProvider | Select语句的动态SOL映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。 |
Insert | 映射插入的SQL语句 |
InsertProvider | Insert语句的动态SQL映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。 |
Update | 映射更新的SQL语句 |
UpdateProvider | Update语句的动态SQL。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。 |
Delete | 映射删除的SQL语句 |
DeleteProvider | Delete句的动态SQL映射。允许指定一个类名和一个方法在执行时返回运行的查询语句。有两个属性:type和 method,type属性是类的完全限定名,method是该类中的那个方法名。 |
Result | 在列和属性之间的单独结果映射。属性包括:id、 column、 property、 javaType、jdbeType、 typeHandler、one、many。id属性是一个布尔值,表示是否被用于主键映射。one属性是单独的联系,和XML配置中的 <association>相似,而many属性是对集合而言的,和XML配置的<collection>相似。 |
Options | 提供配置选项的附加值,它们通常在映射句上作为附加功能配置出现。 |
one | 复杂类型的单独属性值映射。必指定 select属性,表示已映射的SQL语句的完全限定名。 |
Many | 复杂类型的集合属性映射。必指定 select属性,表示已映射的SQL语句的完全限定名。 |
Param | 当映射器方法需要多个参数时,这个注解可以被应用于映射器方法参数来给每个参数取一个名字。否则,多参数将会以它们的顺序位置和SQL语句中的表达式进行映射,这是默认的。 |
示例
基于注解的CRUD操作:
mapper.java文件(因为这里是基于注解实现的,所以没有xml文件)
import org.apache.ibatis.annotations.*;
import org.arunner.domain.User;
import java.util.List;
/**
* @author arunner
* @date 2018/11/10
*/
public interface UserMapper {
//新增
@Insert("insert into tb_user (name,sex,age) values (#{name},#{sex},#{age})")
@Options(useGeneratedKeys = true,keyProperty = "id")
// useGeneratedKeys = true表示使用数据库自动增长的主键,需要底层数据库的支持。keyProperty = "id"表示将插入数据生成的主键设置到user对象的id当中
int saveUser(User user);
//删除
@Delete("delete from tb_user where id = #{id}")
int removeUser(@Param("id") Integer id);
//更新
@Update("update tb_user set name=#{name},age=#{age},sex=#{sex} where id = #{id}")
void modifyUser(User user);
//根据ID查询
@Select("select * from tb_user where id= #{id}")
@Results({
@Result(id=true,column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "age",property = "age"),
@Result(column = "sex",property = "sex"),
})
// @Result注解用于列和属性之间的结果映射,如果列和属性名称相同,则可以省略该注解,MyBatis会自动进行映射
User selectUserById(Integer id);
//查询所有
@Select("select * from tb_user")
List<User> selectAllUser();
}
测试插入操作:
public class InsertTest {
public static void main(String[] args) {
//获取sqlSession对象
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();
//获得mapper的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//创建user对象,并设置属性
User user = new User();
user.setAge(16);
user.setName("arunner");
user.setSex("男");
//插入数据
mapper.saveUser(user);
//查看插入数据生成的主键
System.out.println(user.getId());
//提交事务
sqlSession.commit();
//关闭sqlSession对象
sqlSession.close();
}
}
其他操作请自行测试。