MyBatis使用
MyBatis使用技巧(补充)
日志输出
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
参数映射
#{}多个参数
-
采用默认规则映射到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>
-
多个参数可以自定义映射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},可以任意写
#{}表达式和${}表达式区别
- #{}采用预编译PrepareStatement机制执行
- ${}采用普通Statement机制执行
-
字段值参数采用#{},表名或字段名可以采用${}
-
${}映射参数时,一个参数可以用默认的_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插件来进行优化,使用方法如下:
- 引入pageHelper.jar开发包
-
在sqlmap-config.xml追加定义
<!-- 配置分页插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="oracle"/> </plugin> </plugins>
-
在使用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结构
-
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>
-
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
-
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>