1. Mybatis的介绍

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2. Mybatis注解

mybatis 注解在mybatis jar包中的E:org.apache.ibatis.annotations包中所有注解类如下所示

image-20220623163316628.png

3. 常用注解

注解 作用
@Select 用于查询sql
@Insert 用于插入sql
@Update 用于修改sql
@Delete 用于删除sql
@Results 多个结果映射Result合集
@Result 单个结果映射
@ResultMap 结果集映射
@ResultType 结果集映射
@Param 输入参数设置
@Options 设置参数项,主要用于update、insert中
@One 一对一
@Many 多对多
@SelectProvider select的动态查询
@InsertProvider insert的动态插入
@UpdateProvider @UpdateProvider
@DeleteProvider delete的动态删除

4. 用法

(1) @Select

@Select 主要在查询的时候使用,具体如下:

@Select("SELECT * FROM users")
List<User> getUserList();

(2) @Insert

插入数据库时使用:

@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(‘xiaohong’, ‘123456‘, ‘male’)")
void addUser();

(3) @Update

所有的更新操作 SQL 都可以使用 @Update:

@Update("UPDATE users SET userName='xiaohong2',password=#{passWord} WHERE id = 1")
void updateUser();

(4) @Delete

处理数据删除:

@Delete("DELETE FROM users WHERE id =1")
void deleteUser();

(5) @Results和@Result

Results中可以包含多个Result注解。其中每个Result注解设置javaBean对象和数据库表映射关系:

@Select({"select id,name,password,age from tb_users","where id=2"})
@Results({
    @Result(id = true, property = "id", column = "id"),
    @Result(property = "name", column = "name"),
    @Result(property = "password", column = "password"),
    @Result(property = "age", column = "age")
    })
List<User> getUserByUserid();

(6) @ResultMap

用其他方法中的Results结果集,getUser3方法中的@ResultMap({“results”})引用getUserByUserid方法中的Results结果集

@Select({"select id,user_name,password,age from tb_users2","where id=2"})
@Results(id="results",value = {
    @Result(id = true, property = "id", column = "id"),
    @Result(property = "name", column = "user_name"),
    @Result(property = "password", column = "password"),
    @Result(property = "age", column = "age")
    })
List<User> getUserByUserid();

@Select(value = {"select id,user_name,password,age from tb_users2"})
@ResultMap({"results"})
List<User> getUser3();

(7) @ResultType

ResultType属性为返回值的javaBean对象。与@ResultMap不可以同时使用

@Select(value = {"select id,user_name,password,age from tb_users2"}) @ResultType(User.class)
List<User> getUser4();

(8) @Param

param设置参数值名称。@Param(“name”)和#{name}一致

@Select("select id,user_name,password,age from tb_users2 where id = #{id} and user_name = #{name} ")
User getUser5(@Param("id") Long id,@Param("name") String username);

(9) @Options

设置参数项,主要用于update、insert中。可以操作返回主键值

useGeneratedKeyskeyPropertykeyColumn`使用(使用的是mysql数据库,支持自增)

@Insert("INSERT INTO tb_users2 (user_name, PASSWORD, age)VALUES(#{name},#{password},#{age})")
@Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
int InsertUser3(User user);

(10) @SelectKey

返回非自增主键

keyProperty指定主键属性名,before属性值true|false。resultType 返回值类型。statement属性写sql语句。statementType设置statement类型,默认是PREPARED的。可设置值有PREPARED|STATEMENT|CALLABLE

@Insert("INSERT INTO tb_users2 (user_name, PASSWORD, age)VALUES(#{name},#{password},#{age})")
@SelectKey(keyProperty = "id",before = false,resultType = Long.class,statement = "select LAST_INSERT_ID()",statementType = StatementType.PREPARED
    )
    int InsertUser4(User user);

(11) @SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider

与sql语句构造器类组合使用

type为构造器类。method为构造器类中的方法(注意:方法修饰符必须为public)

@SelectProvider(type= ProviderConfig.class,method = "getUser")
List<User> getUserSelectProvider();
/**
    sql语句构造器类
 */
public class ProviderConfig {  
    /**
    方法修饰符必须为public(和类反射的方法权限有关)    
    方法返回值类型为String
    */
   public String getUser(){
        String sql = new SQL(){{
            SELECT("id,user_name,password,age");
            FROM("tb_users2");
        }}.toString();
        return sql;
    }
}

Mybatis使用PageHelper实现分页查询

1、导入与PageHelper的jar包 (第三方开发的)
2、在mybatis核心配置文件中配置PageHelper插件

<!-- 配置插件 -->
<plugins>
    <!-- 注意:分页助手的插件  配置在通用mapper之前 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用MySQL方言的分页 -->
        <property name="helperDialect" value="mysql"/><!--如果使用oracle,这里value为oracle-->
    </plugin>
</plugins>

3、分页数据获取

@Test
public void testPageHelper(){
    //设置分页参数
    PageHelper.startPage(1,3); //第1页, 每页显示3条数据

    //省略....

    //调用Mapper接口中的方法,查询所有用户信息
    List<User> userList = userMapper.queryAllUsers();


    for(User user : userList){
        System.out.println(user);
    }
}
//其他分页的数据
PageInfo<User> pageInfo = new PageInfo<User>(userList);
System.out.println("总条数:"+pageInfo.getTotal());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示长度:"+pageInfo.getPageSize());
System.out.println("是否第一页:"+pageInfo.isIsFirstPage());
System.out.println("是否最后一页:"+pageInfo.isIsLastPage());
System.out.println("查询的数据:");
List<User> users = pageInfo.getList();
for(User user : users){
    System.out.println(user);
}