Mybatis相关
mybatis—template的配置
相对于配置接口的纯mybatis,利用mybatis-template可以简化代码,省去接口层,直接调用相关的sql
下面是原始的mybatis的配置方法
- 引入相关jar包
spring中添加配置
<bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 指定数据库连接信息 --><property name="dataSource" ref="dataSource" /><!-- 指定SQL语句的XML文件 --><property name="mapperLocations" value="classpath:com/test/dao/*.xml" /></bean><!--定义SqlSessionTemplate --><bean id="sqlSessionTemplate"class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlsessionfactory"/></bean>java引用
@Resourceprivate SqlSessionTemplate template;public void updateUsers(){template.update("com.test.dao.UserMapper.update", 1);template.update("com.test.dao.UserMapper.update", 2);}
mybatis相关优化
- 设置typeAliasesPackage,可以在mapper文件中省去类的包路径<bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath:com/test/dao/*.xml" /><property name="typeAliasesPackage" value="com.test.entity"/></bean>
简化的地方resultType 和parameterType可以直接写User了,而不是com.test.entity.User
resultType为实体类时,只有属性和数据库字段不一致时才需要用resultMap指定不一样的字段映射
如果所有属性和数据库字段名一样,不需要用 resultMap来映射<resultMap id="mainResultMap" type="account_huang.entity.Sleep" >result column="GET_UP" property="getUp" />result column="GET_SLEEP" property="getSleep" /></resultMap>parameterType省可以略不写
mybatis标签
foreach标签的使用
参数可以是一个 list也可以是一个数组Array,放在hashmap中,从而批量删除不需要用 ${}注入式 拼进去,通过foreach直接取更安全
chose标签的使用
|
PageHelper的引入
作用:
- 可以在mybatis查询的时候,做带分页的查询,会根据配置的dialect自动实现不同数据库的分页语句。从而从某种角度上实现了跨数据库和简化sql,因为sql不再去嵌入分页语句
可以一起求count,省略了写count的sql,简化xml代码
配置和使用
配置mybatis引入pagehelper,注意配置dialect的数据库类型
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath*:com/ge/eapp/xml/*Mapper.xml" /><property name="plugins"><array><bean class="com.github.pagehelper.PageHelper"><property name="properties"><value>dialect=mysqlreasonable=true</value></property></bean></array></property></bean>jar包依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>4.0.0</version></dependency>java中调用,注意pageNum为1表示第一页,pageNum为2表示第二页
PageHelper.startPage(pageIndex+1, pageSize,true);list=template.selectList("com.ge.eapp.dao.PCBMapper.findCourseByCode", map);PageInfo<Course> page = new PageInfo(list);long total=page.getTotal();
注意事项
select 不能以 ; 号结尾,否则会sql语法报错,如下desc后不能加 ;号
<select id="findCourseByCodeAllDistinct" >select * from course order by e.read_times desc</select>pageNum是以1开头的,表示第一页取size个,如果pageNum为0的话,也还是取第一页;如果pageNum>总页数,则取最后一个,所以
PageHelper.startPage(pageNum, pageSize,true);
mybatis xml热加载
参考BLOG: http://thinkgem.iteye.com/blog/2304557
引用步骤
引入 SqlSessionFactoryBean.java这个文件,只需要改一下类包的路径。
applicationContext.xml里面的配置 指向这个Bean。如下:
引入mybatis-refresh.properties 配置一些参数
mappingPath指向的是要扫描的xml包路径enabled=truedelaySeconds=60sleepSeconds=3mappingPath=account_huang/mybatisXml引入 MapperRefresh.java文件
使用和原理
通过一个独立的线程,定时去check所有xml文件的lastModified(),检查是否变更过。如果有变更,则重新构建mybatis的XMLMapperBuilder,然后调用parse()生效。
实现FactoryBean类,重写buildSqlSessionFactory()方法,启动refresh线程和一些异常处理(MapperXML有错误时)
- 设置刷新时间,定时的去check路径下面的file是否有变动file.lastModified(),来判断是否要更新#设置为false表示不启动该服务,就不会定时刷新xml文件enabled=true#设置延迟时间,表示等待程序启动后,延迟60秒后才开始 定期刷新xml文件delaySeconds=60#一旦刷新开始了,则设置sleepSeconds来设置每次刷新的间隔时间,一旦开始刷新了,就每3秒check一次sleepSeconds=3#设置xml文件的路径,相对路径mappingPath=com/test/dao