Mybatis3

Posted 花伶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis3相关的知识,希望对你有一定的参考价值。

1      Mybatis扩展

1.1     example查询

1.2     分页插件

1.3      注解

1.4     自定义类型转化器

2      Mapper接口

Example:where后的条件

方法   

功能说明

int countByExample(XXXExample example) thorws SQLException

按条件计数

int deleteByPrimaryKey(Integer id) SQLException

按主键删除

int deleteByExample(XXXExample example) thorws SQLException

按条件删除

String/Integer insert(XXX record) thorws SQLException

插入数据

XXX selectByPrimaryKey(Integer id) thorws SQLException

按主键查询

ListselectByExample(XXXExample example) thorws SQLException

按条件查询

ListselectByExampleWithBLOGs(XXXExample example) thorws SQLException

按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。

int updateByPrimaryKey(XXX record) thorws SQLException

按主键更新

int updateByPrimaryKeySelective(XXX record) thorws SQLException

按主键更新值不为null的字段

int updateByExample(XXX record, XXXExample example) thorws SQLException

按条件更新

int updateByExampleSelective(XXX record, XXXExample example) thorws SQLException

按条件更新值不为null的字段

 

  注意:

  int updateByExampleSelective(@Param("record") Pets record, @Param("example") PetsExample example);

/**

     * 使用@Param("record") 注解,可以把参数封装成Map<String,Object>

     * @Param("record") Pets record, @Param("example") 相当于

     *

     * Map<String,Object> map = new HashMap(String,Object);

     * map.put("record",record);

     * map.put("example",example);

     */

上述方法中的@Param注解

mybatis会把参数封装成Map对象,键为注解的参数,值为方法的参数

3      example实例解析

mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分 
xxxExample example = new xxxExample(); 
Criteria criteria = example .createCriteria();

方法

说明

example.setOrderByClause(“字段名 ASC”);

添加升序排列条件,DESC为降序

example.setDistinct(false)

去除重复,boolean型,true为选择不重复的记录。

criteria.andXxxIsNull

添加字段xxx为null的条件

criteria.andXxxIsNotNull

添加字段xxx不为null的条件

criteria.andXxxEqualTo(value)

添加xxx字段等于value条件

criteria.andXxxNotEqualTo(value)

添加xxx字段不等于value条件

criteria.andXxxGreaterThan(value)

添加xxx字段大于value条件

criteria.andXxxGreaterThanOrEqualTo(value)

添加xxx字段大于等于value条件

criteria.andXxxLessThan(value)

添加xxx字段小于value条件

criteria.andXxxLessThanOrEqualTo(value)

添加xxx字段小于等于value条件

criteria.andXxxIn(List<?>)

添加xxx字段值在List<?>条件

criteria.andXxxNotIn(List<?>)

添加xxx字段值不在List<?>条件

criteria.andXxxLike(“%”+value+”%”)

添加xxx字段值为value的模糊查询条件

criteria.andXxxNotLike(“%”+value+”%”)

添加xxx字段值不为value的模糊查询条件

criteria.andXxxBetween(value1,value2)

添加xxx字段值在value1和value2之间条件

criteria.andXxxNotBetween(value1,value2)

添加xxx字段值不在value1和value2之间条件

4      分页插件

1. pom.xml文件中添加分页插件

<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->

<dependency>

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper</artifactId>

    <version>4.1.6</version>

</dependency>

 

2. mybatis配置文件中添加分页插件

   <plugins>

               <plugin interceptor="com.github.pagehelper.PageHelper">

                        <property name="dialect" value="mysql"/>

               </plugin>

                <!--5.0版本pagehelper-->

                  <!-- <plugin interceptor="com.github.pagehelper.PageInterceptor">

                                   <property name="helperDialect" value="mysql"/>

                  </plugin> -->

  </plugins>

 

3. 测试类中使用PageHelper分页查询

        PageHelper.startPage(2, 4);

                  List<Pets> list1  = mapper.selectByExample(null);

                  PageInfo<Pets> pageInfo = new PageInfo<Pets>(list1);

                  System.out.println(list1);

                  List<Pets> list2 = pageInfo.getList();

                  System.out.println(list2);

                  for (Pets pets : list2) {

                          System.out.println(pets);

                  }

4   mybatis注解开发

public interface PetsMapper {

    

     @Select(value="select id,name,birth_date birthDate,type_id typeId, owner_id ownerId from pets")

     public List<Pets> findAll();

    

     @Select("select id,name,birth_date birthDate,type_id typeId, owner_id ownerId from pets where id=#{id}")

     public Pets findById(int id);

    

     @Insert("insert into pets(name,birth_date,type_id,owner_id) values(#{name},#{birthDate},#{typeId},#{ownerId})")

@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class, before = false, statement = { "select last_insert_id()" })

     public int insert(Pets p);

    

     @Update(value="update pets set name=#{name},birth_date=#{birthDate} where id=#{id}")

     public int update(Pets p);

    

     @Delete("delete from pets where id=#{id}")

     public int delete(int id) ;

   

}

5  mybatis自定义类型处理器

场景:当字段类型和数据库类型不一致时,需要自定义类型转化器。

使用:

       1)编写一个普通类继承BaseTypeHandler<T>抽象类,或者实现TypeHandler<T>接口。重写三个方法:如下:

      

/**

*TODO自定义类型处理器

*    遇到Address类型的字段,会自动来调用该类中的方法

*    1)新增 修改  :Address对象--->String

          调用setNonNullParameter() 方法 处理address类型的字段

*    2)查询:   把varchar类型的address--->Address类型

*    调用getNullableResult/getNullableResult

*    把数据库的address 重新封装成Address类型

*/

public class MyAddressTypeHandler extends  BaseTypeHandler<Address> {

 

     /**

      * 新增 或者修改时  遇到Address 类型的字段 自动会调用该方法

      */

     @Override

     public void setNonNullParameter(PreparedStatement ps, int i, Address parameter, JdbcType jdbcType)

               throws SQLException {

               //填充address这个字段的占位符

               ps.setString(i, parameter.toString());//对象--->字符串

     }

     /**

      * 根据列名查询

      */

     @Override

     public Address getNullableResult(ResultSet rs, String columnName) throws SQLException {

          // TODO Auto-generated method stub

          String a  = rs.getString(columnName);

          //山东省-青岛市-市北区-市北路-100(String)

          Address address = null;

          if (a!=null) {

               String s [] = a.split("-");

               address = new Address();

               address.setProvinceName(s[0]);

               address.setCityName(s[1]);

               address.setDistinctName(s[2]);

               address.setStreetName(s[3]);

               address.setNo(Integer.parseInt(s[4].trim()));

          }

          return  address;

     }

     /**

      * 根据下标查询

      */

     @Override

     public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

                    String a  = rs.getString(columnIndex);

                    //山东省-青岛市-市北区-市北路-100(String)

                    Address address = null;

                    if (a!=null) {

                         String s [] = a.split("-");

                         address = new Address();

                         address.setProvinceName(s[0]);

                         address.setCityName(s[1]);

                         address.setDistinctName(s[2]);

                         address.setStreetName(s[3]);

                         address.setNo(Integer.parseInt(s[4].trim()));

                    }

                    return  address;

     }

 

     /**

      * 存储过程

      */

     @Override

     public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

          // TODO Auto-generated method stub

          return null;

     }

 

2)在mybatis的配置文件中配置该处理器

<!-- 自定义类型处理器 -->

    <typeHandlers>

       <!-- 配置自定义类型处理器

          配置完成后:遇到address类型的字段 自动会调用MyAddressTypeHandler类处理该字段

       -->

       <typeHandler handler="com.itqf.handler.MyAddressTypeHandler"/>

    </typeHandlers>

 

6    Mybatis中#{}和${}的使用

#{}

            按照该字段真实的值的类型填充占位符。例如:String类型,调用ps.setString()填充。

${}

            直接把值拼接到sql语句中,不拼接链接符号。

存在sql注入的问题

应用场景:排序时,要排序的字段,排序规则,就可以使用${}

排序:

select  * from   users order by #{order} #{sorter};

使用#{}方式,执行sql语句

select * from users order by ‘id‘ ‘desc‘;

 

select  * from   users order by ${order} ${sorter};

使用${}方式,执行sql语句

select * from users order by id desc;

 



以上是关于Mybatis3的主要内容,如果未能解决你的问题,请参考以下文章