11. Spring + mybatis

MyBatis使用

MyBatis使用技巧(补充)

日志输出

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

参数映射

#{}多个参数

  1. 采用默认规则映射到SQL中

    {0}#{1}...,#{param1}#{param2}...

    接口方法

    public int updateAuthor(int id,String author);
    

    SQL定义

    <update id="updateAuthor">
        update xdl_book set author=#{1} where id=#{0}
    </update>
    
    <update id="updateAuthor">
        update xdl_book set author=#{param2} where id=#{param1}
    </update>
    
  2. 多个参数可以自定义映射SQL表达式

    接口方法

    public int updatePublishing(
        @Param("id")int id,@Param("publish")String publishing);
    

    SQL定义

    <update id="updatePublishing">
        update xdl_book set publishing=#{publish} where id=#{id}
    </update>
    

#{}单个参数

使用中SQL表达式#{xxx},可以任意写

#{}表达式和${}表达式区别

  1. #{}采用预编译PrepareStatement机制执行
  2. ${}采用普通Statement机制执行
  3. 字段值参数采用#{},表名或字段名可以采用${}

  4. ${}映射参数时,一个参数可以用默认的_parameter或与@Param("key")匹配

接口方法

public List<Book> findAll1(@Param("orderName")String columnName);
public List<Book> findAll2(String columnName);

SQL映射

<select id="findAll1" parameterType="string" resultType="cn.xdl.entity.Book">
    select * from xdl_book order by ${orderName} desc
</select>

<select id="findAll2" parameterType="string" resultType="cn.xdl.entity.Book">
    select * from xdl_book order by ${_parameter} desc
</select>

分页查询

MyBaits中SqlSession.selectList()方法提供了分页功能,采用RowBounds参数控制。但是效率低,获取第2页记录时,会将第1、2页的记录全取出来。

可以采用pageHelper插件来进行优化,使用方法如下:

  1. 引入pageHelper.jar开发包
  2. 在sqlmap-config.xml追加定义

    <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="oracle"/>
        </plugin>
    </plugins>
    
  3. 在使用Mapper映射器调用SQL之前,追加PageHelper.startPage

    SqlSession sqlSession = MyBatisUtil.openSession();
    BookMapper bookDao = sqlSession.getMapper(BookMapper.class);
    //追加PageHelper分页控制
    Page page = PageHelper.startPage(1, 3);
    List<Book> list = bookDao.findAll();
    for(Book book:list){
        System.out.println(book.getId()+" "
            +book.getAuthor()+" "+book.getPublish_time());
    }
    System.out.println("页数:"+page.getPageNum()+"/"+page.getPages());
    sqlSession.close();
    

Spring和MyBatis整合应用

整合目的

将MyBatis生成的Mapper映射器对象放入到Spring容器管理,给Controller或Service注入。

Spring+MyBatis结构

  1. SqlSessionFactoryBean配置

    <bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="SCOTT"></property>
        <property name="password" value="TIGER"></property>
        <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"></property>
        <property name="driverClass" value="oracle.jdbc.OracleDriver"></property>
    </bean>
    
    <!-- 定义SqlSessionFactoryBean -->
    <bean id="factory" 
        class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定mybatis配置文件 -->
        <property name="configLocation" value="classpath:sqlmap-config.xml">
        </property>
        <!-- 必须指定dataSource -->
        <property name="dataSource" ref="c3p0">
        </property>
    </bean>
    
  2. MapperScannerConfigurer配置

    <!-- 根据Mapper接口生成对象,默认利用Mapper接口名做Bean的id -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactory" ref="factory"></property>
        <!-- 指定扫描mapper的路径 -->
        <property name="basePackage" value="cn.xdl.dao">
        </property>
        <!-- 
        <property name="annotationClass" value="cn.xdl.util.MyDao">
        </property>
         -->
    </bean>
    

    Mapper映射器+SqlSessionFactoryBean+MapperScannerConfigurer

  3. SqlSessionTemplate配置

    如果需要自己编写DAO接口和实现类时,可以采用SqlSessionTemplate对象。

    自定义Dao接口和实现类+SqlSessionFactoryBean+SqlSessionTemplate

    @Repository
    public class MyBatisBookDao implements BookDao {
    
        @Autowired
        private SqlSessionTemplate template;
    
        @Override
        public List<Book> loadAll() {
            return template.selectList("findAll");
        }
    
    }
    

    配置信息

    <!-- 扫描Dao,定义SqlSessionTemplate注入 -->
    <context:component-scan base-package="cn.xdl.dao"/>
    
    <bean id="template" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="factory">
        </constructor-arg>
    </bean>
    

MyBatis注解SQL定义

可以将SqlMapper.xml中的SQL语句利用@Select、@Insert、@Update、@Delete定义到Mapper接口中。

public interface UserDao {

    @Select("select * from xdl_user")
    public List<User> findAll();

    @Select("select * from xdl_user where id=#{no}")
    public User findById(int id);

    @Insert("insert into xdl_user (ID,LOGIN_NAME,NICK_NAME,REAL_NAME,GRADE_ID,PASSWORD) values  (#{id},#{login_name,jdbcType=VARCHAR},#{nick_name,jdbcType=VARCHAR},#{real_name,jdbcType=VARCHAR},#{grade_id,jdbcType=NUMERIC},#{password,jdbcType=VARCHAR})")
    public int save(User user);
}

在sqlmap-config.xml中加载UserDao接口

<mappers>
    <mapper class="cn.xdl.dao.UserDao"/>
</mappers>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值