设为首页 收藏本站
查看: 611|回复: 0

[经验分享] mybatis + spring 全注解

[复制链接]

尚未签到

发表于 2016-11-25 06:25:54 | 显示全部楼层 |阅读模式
  公司最近起了一个新项目,之前一直使用的是Strut  + Spring + hibernate;由于新项目比较小,使用ssh有点杀鸡用牛刀的意思,经过评估后,感觉mybatis比Hibernate要简单的很多。
  通过注解的方式开发,可以减少spring和mybatis的很多xml配置,当然spring还是得有部分的xml配置,除非使用spring官网提倡的REST风格;对于REST风格 俺不太熟悉,这里就不献丑啦。
  咱们使用Maven进行项目开发,在jar管理方面要省心很多。
  第一步 加载所需要的jar包,pom.xml的配置如下:

         <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-framework.version>3.2.5.RELEASE</spring-framework.version>
<mysql.driver.version>5.1.27</mysql.driver.version>
<c3p0.version>0.9.1.2</c3p0.version>
<javassist.version>3.17.1-GA</javassist.version>
<log.slf4j.version>1.7.5</log.slf4j.version>
<log4j.version>1.2.17</log4j.version>
<commons.lang.version>2.6</commons.lang.version>
<servlet.version>2.5</servlet.version>
<jstl.version>1.2</jstl.version>
<jsp.version>2.2</jsp.version>
<tomcat.plugin.version>2.2</tomcat.plugin.version>
<junit.version>4.11</junit.version>
<javax.mail.version>1.5.1</javax.mail.version>
<mybatis-spring.version>1.2.2</mybatis-spring.version>
<mybatis.version>3.2.7</mybatis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${log.slf4j.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${javax.mail.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
  这里主要是加载mybatis-spring和mybatis。
  第二步 设置mybatis需要的sqlSessionFactory,并且让mybatis自动加载Mapper接口(该接口在下面会说)

<context:property-placeholder location="classpath:spring/jdbc.properties" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 解决初次链接 链接已被释放 start -->
<property name="acquireRetryAttempts" value="30" />
<property name="acquireRetryDelay" value="1000" />
<property name="testConnectionOnCheckin" value="true" />
<property name="automaticTestTable" value="C3P0TestTable" />
<property name="idleConnectionTestPeriod" value="14400" />
<property name="checkoutTimeout" value="3000" />
<!-- 解决初次链接 链接已被释放 end -->
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
<property name="minPoolSize" value="${jdbc.minPoolSize}" />
<property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
</bean>
<!-- sql session factory to create sql session -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wangjin.admin.mapper" />
</bean>
<!-- configuration for transaction -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
  第三步 书写Mapper 接口,该接口相当于普通项目的Dao类,但是该Mapper是接口的形式并且通过注解的方式进行sql声明,mybatis会通过代理的方式执行相应的sql,在第二步中已经设置了让mybatis来加载Mapper接口。

public interface AdminUserMapper {
@Insert("insert into admin_user(username, password) values(#{username}, #{password})")
@SelectKey(statement="SELECT last_insert_id() as id", keyProperty="id", before=false, resultType=int.class)
public int add(AdminUser adminUser);
@Delete("delete from admin_user where id=#{id}")
public void delete(@Param("id")int id);
@Update("update admin_user set username=#{username}, password=#{password} where id=#{id}")
public void update(AdminUser adminUser);
@Select("select * from admin_user")
public List<AdminUser> loadAll();
@Select("select * from admin_user limit #{start}, #{size}")
public List<AdminUser> loadAllLimit(@Param("start")int start, @Param("size")int size);
@Select("select * from admin_user where id=#{id}")
public AdminUser getById(@Param("id")int id);
@Select("select * from admin_user where username=#{username}")
public AdminUser getByUsername(@Param("username")String username);
}
  这里要注意在Mapper中一定不要有相同名称的方法,要不然会出错。 
  @SelectKey(statement="SELECT last_insert_id() as id", keyProperty="id", before=false, resultType=int.class)
  这句注解表示插入成功后,将主键设置到adminUser中, 当然AdminUser一定要有id的set方法, AdminUser的详情如下

public class AdminUser {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
  第四步 在service中使用Mapper接口(相当于在service中使用Dao),你会发现以前需要进行Dao的接口设计以及Dao接口的实现,很麻烦,现在这些都不需要啦,只需要定义Mapper接口,然后定义相关的接口方法,在相关的方法上声明sql语句,然后在service中就可以使用该接口啦。

public interface AdminUserService {
public int addAdminUser(AdminUser adminUser);
public void deleteAdminUserById(int id);
public void updateAdminUser(AdminUser adminUser);
public AdminUser getByUsername(String username);
public List<AdminUser> loadAllAdminUsers();
public List<AdminUser> loadAllAdminUsers(int start, int size);
}
/**
* service for admin user
* @author kinfer
*
*/
@Service
public class AdminUserServiceImpl implements AdminUserService {
@Autowired
private AdminUserMapper adminUserMapper;
@Override
@Transactional
public int addAdminUser(AdminUser adminUser) {
return adminUserMapper.add(adminUser);
}
@Override
@Transactional
public void deleteAdminUserById(int id) {
adminUserMapper.delete(id);
}
@Override
@Transactional
public void updateAdminUser(AdminUser adminUser) {
adminUserMapper.update(adminUser);
}
@Override
@Transactional(readOnly=true)
public AdminUser getByUsername(String username) {
return adminUserMapper.getByUsername(username);
}
@Override
@Transactional(readOnly=true)
public List<AdminUser> loadAllAdminUsers() {
return adminUserMapper.loadAll();
}
@Override
@Transactional(readOnly=true)
public List<AdminUser> loadAllAdminUsers(int start, int size) {
return adminUserMapper.loadAllLimit(start, size);
}
}
  第五步 测试,我使用的是springjunit

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/business-config.xml")
public class AdminUserServiceTester {
@Autowired
private AdminUserService service;
@Test
public void addTest(){
AdminUser adminUser = service.getByUsername("kinfer");
if(adminUser != null){
service.deleteAdminUserById(adminUser.getId());
} else{
adminUser = new AdminUser();
adminUser.setUsername("kinfer");
adminUser.setPassword("0000");
}
int result = service.addAdminUser(adminUser);
Assert.assertTrue(result > 0);
Assert.assertTrue(adminUser.getId() > 0);
adminUser = service.getByUsername("kinfer");
Assert.assertTrue(adminUser != null);
Assert.assertEquals("kinfer", adminUser.getUsername());
adminUser.setUsername("kinfer1");
service.updateAdminUser(adminUser);
adminUser = service.getByUsername("kinfer1");
Assert.assertTrue(adminUser != null);
Assert.assertEquals("kinfer1", adminUser.getUsername());
adminUser.setUsername("kinfer");
service.updateAdminUser(adminUser);
}
}

  完成spring+mybatis配置,是不是很easy.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305046-1-1.html 上篇帖子: mybatis配置简单用法(2) 下篇帖子: MyBatis 批量操作、添加日志显示、MyBatis与iBatis区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表