ibatis+spring+struts整合实例【好例子】

本文介绍如何使用IBATIS结合Spring和Struts实现一个简单的用户登录系统,涵盖数据库设计、POJO类定义、DAO层实现、Service层逻辑、Struts配置以及Spring配置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


步骤:

一、新建工程,添加ibatis、spring和struts的jars;
二、数据库设计.
三、POJO类.
四、pojo类配置文件编写
五、ibatis主配置文件编写【主配置文件只剩下sqlMap了】
六、dao接口和接口实现
七、service接口和接口实现
八、struts action实现及struts-config.xml配置
九、spring配置文件的内容【牵扯到ibatis和struts的整合】
十、测试

一、新建工程,添加ibatis、spring和struts的jars;

二、数据库设计.

mysql数据库:

  1. useibatis;
  2. droptableifexistsuser;
  3. createtableifnotexistsuser(
  4. IDtinyintprimarykeyauto_increment,
  5. LOGIN_NAMEvarchar(10)notnull,
  6. PASS_WORDvarchar(15)notnull,
  7. QXvarchar(10)default'guest'notnull,
  8. MEMOtext
  9. )
  10. type=innodb
  11. comment="userinfo";
  12. insertintouser(LOGIN_NAME,PASS_WORD,QX)values('leh','888','admin');
  13. insertintouser(LOGIN_NAME,PASS_WORD)values('lek','888');
  14. commit;


数据源的配置

1)、配置文件db.properties (位置:resources/properties/db.properties,这里resources和src是一类文件)

[html] view plain copy
  1. driver=com.mysql.jdbc.Driver
  2. url=jdbc\:mysql\://localhost\:3306/ibatis
  3. username=root
  4. password=54321


2)、注册数据源到spring

[html] view plain copy
  1. !--springloaddataSourceconfigurationpropertyfile-->
  2. <beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  3. <propertyname="locations">
  4. <list>
  5. <value>properties/database.properties</value>
  6. </list>
  7. </property>
  8. </bean>
  9. <!--dataSource-->
  10. <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
  11. <propertyname="driverClassName"value="${driver}"/>
  12. <propertyname="url"value="${url}"/>
  13. <propertyname="username"value="${username}"/>
  14. <propertyname="password"value="${password}"/>
  15. </bean>


三、POJO类.

本例是User实例类:

[java] view plain copy
  1. packagecom.leadtone.ibatis.domain;
  2. importjava.io.Serializable;
  3. publicclassUserimplementsSerializable{
  4. privateintid;
  5. privateStringname;
  6. privateStringpassword;
  7. privateStringqx;
  8. privateStringmemo;
  9. publicintgetId(){
  10. returnid;
  11. }
  12. /**
  13. *setter和getter方法省略
  14. */



四、pojo类配置文件编写

本例是User.xml:(位置:com.leadtone.sqlmap.User.xml)

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEsqlMap
  3. PUBLIC"-//ibatis.apache.org//DTDSQLMap2.0//EN"
  4. "http://ibatis.apache.org/dtd/sql-map-2.dtd">
  5. <sqlMapnamespace="User">
  6. <typeAliasalias="user"type="com.leadtone.ibatis.domain.User"/>
  7. <resultMapclass="user"id="UserResult">
  8. <resultproperty="id"column="ID"/>
  9. <resultproperty="name"column="LOGIN_NAME"/>
  10. <resultproperty="password"column="PASS_WORD"/>
  11. <resultproperty="qx"column="QX"/>
  12. <resultproperty="memo"column="MEMO"/>
  13. </resultMap>
  14. <!--queryallUsers-->
  15. <selectid="selectAllUsers"resultMap="UserResult">
  16. select*fromuser
  17. </select>
  18. <!--queryuserbyid-->
  19. <selectid="selectUserById"parameterClass="int"resultMap="UserResult">
  20. selectID,LOGIN_NAME,PASS_WORD,QX,MEMOfromuserwhereID=#id#
  21. </select>
  22. <!--queryuserbyuser-->
  23. <selectid="selectUserByUser2"parameterClass="map"resultMap="UserResult">
  24. selectID,LOGIN_NAME,PASS_WORD,QX,MEMO
  25. fromuser
  26. <dynamicprepend="where">
  27. <isNotEmptyprepend="and"property="name">
  28. LOGIN_NAME=#name#
  29. </isNotEmpty>
  30. <isNotEmptyprepend="and"property="password">
  31. PASS_WORD=#password#
  32. </isNotEmpty>
  33. </dynamic>
  34. </select>
  35. <selectid="selectUserByUser"parameterClass="user"resultMap="UserResult">
  36. selectID,LOGIN_NAME,PASS_WORD,QX,MEMO
  37. fromuser
  38. <dynamicprepend="where">
  39. <isNotEmptyprepend="and"property="name">
  40. LOGIN_NAME=#name#
  41. </isNotEmpty>
  42. <isNotEmptyprepend="and"property="password">
  43. PASS_WORD=#password#
  44. </isNotEmpty>
  45. </dynamic>
  46. </select>
  47. <selectid="selectUsersByName"parameterClass="String"resultMap="UserResult">
  48. selectID,LOGIN_NAME,PASS_WORD,QX,MEMO
  49. fromuser
  50. <dynamicprepend="where">
  51. <isNotEmptyprepend="and"property="value">
  52. snamelike'%$value$%'
  53. </isNotEmpty>
  54. </dynamic>
  55. </select>
  56. <!--
  57. <insertid="addUser"parameterClass="User">
  58. insertintouser(LOGIN_NAME,PASS_WORD,QX,MEMO)
  59. values(#name#,#birth#,#score#)
  60. <selectKeykeyProperty="id"resultClass="int">
  61. selectlast_insert_id()
  62. </selectKey>
  63. </insert>
  64. <!--注意这里的keyProperty="id"中的id就是User中的id属性,resultClass就是查询的的返回值-->
  65. -->
  66. <updateid="updateUser"parameterClass="User">
  67. updateusersetLOGIN_NAME=#name#,PASS_WORD=#password#,QX=#qx#,memo=#memo#whereID=#id#
  68. </update>
  69. <deleteid="deleteUser"parameterClass="int">
  70. deletefromuserwhereID=#id#
  71. </delete>
  72. </sqlMap>


【补充:】动态sql:

一般来说,拼接动态sql是在查询时,指定多个查询条件的情况下用的,所以用到parameterClass= (map或具体类),

但对于传递过来的参数就一个时,若如下代码就会出错:

[html] view plain copy
  1. <selectid="selectUserById"parameterClass="int"resultMap="UserResult">
  2. selectsid,sname,smajor,sbirth,scorefromusers
  3. <dynamicprepend="where">
  4. <isNotEmptyprepend="and"property="id">
  5. sid=#id#
  6. </isNotEmpty>
  7. </dynamic>
  8. </select>


会报错误如下:There is no READABLE property named 'id' in class 'java.lang.Integer'

因为你无缘故用了一个莫名其妙的property="id",id对ibatis来说不认识。

这时的解决办法有两种,一个是这里的property="id" 中的id用value来代替,所以下面的sid=#value#,这个value是ibatis内部指定个变量;另一个方法是直接把property="id"删除,不用property这个属性了。

五、ibatis主配置文件编写【主配置文件只剩下sqlMap了,事务和数据源都交给spring进行配置和管理】

本例为sql-map-config.xml:(位置:)

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEsqlMapConfig
  3. PUBLIC"-//ibatis.apache.org//DTDSQLMapConfig2.0//EN"
  4. "<ahref="http://ibatis.apache.org/dtd/sql-map-config-2.dtd">http://ibatis.apache.org/dtd/sql-map-config-2.dtd</a>">
  5. <sqlMapConfig>
  6. <sqlMapresource="com/leadtone/ibatis/sqlmap/User.xml"/>
  7. <!--
  8. <sqlMapresource="com/leadtone/ibatis/sqlmap/User1.xml"/>
  9. <sqlMapresource="com/leadtone/ibatis/sqlmap/User2.xml"/>
  10. <sqlMapresource="com/leadtone/ibatis/sqlmap/Usern.xml"/>
  11. -->
  12. </sqlMapConfig>


六、dao接口和接口实现

1)、本例为UserDao:

[java] view plain copy
  1. packagecom.leadtone.ibatis.dao;
  2. importjava.util.List;
  3. importcom.leadtone.ibatis.domain.User;
  4. publicinterfaceIUserDao{
  5. publicList<User>queryAllUsers();
  6. publicUserqueryUserById(intid);
  7. publicUserqueryUserByUser(Useruser);
  8. publicList<User>queryUserByName(Stringname);
  9. publicvoidaddUser(Useruser);
  10. publicvoidaddUserBySequence(Useruser);
  11. publicvoidupdateUser(Useruser);
  12. publicvoiddeleteUser(intid);
  13. }


2)、实现类UserDaoImpl:

[java] view plain copy
  1. packagecom.leadtone.ibatis.dao.ibatis;
  2. importjava.util.List;
  3. importorg.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
  4. importcom.leadtone.ibatis.dao.IUserDao;
  5. importcom.leadtone.ibatis.domain.User;
  6. publicclassUserDaoImplextendsSqlMapClientDaoSupportimplementsIUserDao{
  7. //注意这里的SqlMapClient接口的声明和下面的static静态代码都不需要了,
  8. //因为这里继承了spring提供的ibatis模板template类SqlMapClientDaoSupport,不是用原生的SqlMapClient
  9. //privatestaticSqlMapClientsqlMapClient=null;
  10. /*
  11. static{
  12. Readerreader=null;
  13. try{
  14. reader=Resources.getResourceAsReader("com/leadtone/ibatis/sqlmap/SqlMapConfig.xml");
  15. sqlMapClient=SqlMapClientBuilder.buildSqlMapClient(reader);
  16. reader.close();
  17. }catch(IOExceptione){
  18. e.printStackTrace();
  19. }
  20. }
  21. */
  22. publicvoidaddUser(Useruser){
  23. getSqlMapClientTemplate().insert("addUser",user);
  24. }
  25. publicUserqueryUserByUser(Useruser){
  26. System.out.println("---UserDaoImpl---");
  27. return(User)this.getSqlMapClientTemplate().queryForObject("selectUserByUser",user);
  28. }
  29. /*
  30. *这里主要演示一个模拟用户登录系统验证的操作,主要用了queryUserByUser(Useruser)方法
  31. */
  32. }


3)、在spring配置文件中配置这个bean

[html] view plain copy
  1. <!--sqlMapClient-->
  2. <beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  3. <propertyname="configLocation"value="sqlmap/sql-map-config.xml"/>
  4. <propertyname="dataSource"ref="dataSource"/>
  5. </bean>
  6. <!--validateloginUser-->
  7. <!--dao-->
  8. <beanid="userDao"class="com.leadtone.ibatis.dao.ibatis.UserDaoImpl">
  9. <propertyname="sqlMapClient"ref="<spanstyle="color:#000000;">sqlMapClient</span>"></property>
  10. </bean>


七、service接口和接口实现

1)IUserLoginService接口

[java] view plain copy
  1. packagecom.leadtone.ibatis.service;
  2. importcom.leadtone.ibatis.domain.User;
  3. publicinterfaceIUserLoginService{
  4. publicbooleanisLoginUser(Useruser);
  5. }


2)UserLoginSerivceImpl实现类

[java] view plain copy
  1. packagecom.leadtone.ibatis.service.impl;
  2. importcom.leadtone.ibatis.dao.IUserDao;
  3. importcom.leadtone.ibatis.domain.User;
  4. importcom.leadtone.ibatis.service.IUserLoginService;
  5. publicclassUserLoginServiceImplimplementsIUserLoginService{
  6. privateIUserDaouserDao;
  7. publicIUserDaogetUserDao(){
  8. returnuserDao;
  9. }
  10. publicvoidsetUserDao(IUserDaouserDao){
  11. this.userDao=userDao;
  12. }
  13. publicbooleanisLoginUser(Useruser){
  14. returnnull!=userDao.queryUserByUser(user)?true:false;
  15. }
  16. }


3)在spring中注册这个bean

[html] view plain copy
  1. <!--service-->
  2. <beanid="userLoginService"class="com.leadtone.ibatis.service.impl.UserLoginServiceImpl">
  3. <propertyname="userDao"ref="userDao"></property>
  4. </bean>


八、struts action实现及struts-config.xml配置(牵扯到struts和spring的整合)

1)action:

[java] view plain copy
  1. packagecom.leadtone.web.struts.action;
  2. importjavax.servlet.http.HttpServletRequest;
  3. importjavax.servlet.http.HttpServletResponse;
  4. importorg.apache.struts.action.Action;
  5. importorg.apache.struts.action.ActionForm;
  6. importorg.apache.struts.action.ActionForward;
  7. importorg.apache.struts.action.ActionMapping;
  8. importcom.leadtone.ibatis.domain.User;
  9. importcom.leadtone.ibatis.service.IUserLoginService;
  10. importcom.leadtone.web.struts.form.LoginForm;
  11. publicclassLoginActionextendsAction{
  12. privateIUserLoginServiceuserLoginService;
  13. publicIUserLoginServicegetUserLoginService(){
  14. returnuserLoginService;
  15. }
  16. publicvoidsetUserLoginService(IUserLoginServiceuserLoginService){
  17. this.userLoginService=userLoginService;
  18. }
  19. publicActionForwardexecute(ActionMappingmapping,ActionFormform,
  20. HttpServletRequestrequest,HttpServletResponseresponse){
  21. LoginFormloginForm=(LoginForm)form;
  22. Stringname=loginForm.getUsername();
  23. Stringpassword=loginForm.getPassword();
  24. Useruser=newUser();
  25. user.setName(name);
  26. user.setPassword(password);
  27. booleanisLogin=false;
  28. isLogin=userLoginService.isLoginUser(user);
  29. System.out.println(isLogin);
  30. if(isLogin){
  31. request.setAttribute("username",name);
  32. returnmapping.findForward("success");
  33. }
  34. else
  35. returnmapping.findForward("failure");
  36. }
  37. }


2)actionForm:

[java] view plain copy
  1. publicclassLoginFormextendsActionForm{
  2. privateStringusername;
  3. privateStringpassword;
  4. privateStringgrade;
  5. publicActionErrorsvalidate(ActionMappingmapping,
  6. HttpServletRequestrequest){
  7. returnnull;
  8. }
  9. publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){
  10. }
  11. publicStringgetPassword(){
  12. returnpassword;
  13. }
  14. publicvoidsetPassword(Stringpassword){
  15. this.password=password;
  16. }
  17. publicStringgetGrade(){
  18. returngrade;
  19. }
  20. publicvoidsetGrade(Stringgrade){
  21. this.grade=grade;
  22. }
  23. publicStringgetUsername(){
  24. returnusername;
  25. }
  26. publicvoidsetUsername(Stringusername){
  27. this.username=username;
  28. }
  29. }


3)xml:

[html] view plain copy
  1. <struts-config>
  2. <data-sources/>
  3. <form-beans>
  4. <form-beanname="loginForm"type="com.leadtone.web.struts.form.LoginForm"/>
  5. </form-beans>
  6. <global-exceptions/>
  7. <global-forwards/>
  8. <action-mappings>
  9. <action
  10. attribute="loginForm"
  11. input="/login.jsp"
  12. name="loginForm"
  13. path="/login"
  14. scope="request"
  15. type="org.springframework.web.struts.DelegatingActionProxy">
  16. <forwardname="failure"path="/failure.jsp"/>
  17. <forwardname="success"path="/succ.jsp"/>
  18. </action>
  19. </action-mappings>
  20. <controllerprocessorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>
  21. <message-resourcesparameter="com.leadtone.web.struts.ApplicationResources"/>
  22. <plug-inclassName="org.springframework.web.struts.ContextLoaderPlugIn">
  23. <set-propertyproperty="contextConfigLocation"value="classpath:applicationContext.xml"/>
  24. </plug-in>
  25. </struts-config>


4)页面:

login.jsp

[html] view plain copy
  1. <body>
  2. <center>
  3. <html:formaction="${Pagecontext.request.contextPath}/login"method="post">
  4. <tableborder="1px"cellspacing="1px"cellpadding="1px">
  5. <tr>
  6. <td>username:</td>
  7. <td><html:textproperty="username"/></td>
  8. <td><html:errorsproperty="username"/></td>
  9. </tr>
  10. <tr>
  11. <td>password:</td>
  12. <td><html:passwordproperty="password"/></td>
  13. <td><html:errorsproperty="password"/></td>
  14. </tr>
  15. <tr>
  16. <td>grade:</td>
  17. <td><html:selectproperty="grade">
  18. <html:optionvalue="guest">guest</html:option>
  19. <html:optionvalue="admin">admin</html:option>
  20. </html:select>
  21. </td>
  22. <td><html:errorsproperty="grade"/></td>
  23. </tr>
  24. <tr>
  25. <tdcolspan="3"valign="middle"align="center"><html:submit/><html:cancel/></td>
  26. </tr>
  27. </table>
  28. </html:form>
  29. </center>
  30. </body>


[html] view plain copy
  1. succ.jsp
  2. <body>
  3. welcome${username},<br>
  4. loginsuccessfully!
  5. </body>
  6. falure.jsp
  7. <body>
  8. sorry,loginerror<ahref="login.jsp">relogin</a>
  9. </body>


5)web.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.5"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  3. <servlet>
  4. <servlet-name>action</servlet-name>
  5. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  6. <init-param>
  7. <param-name>config</param-name>
  8. <param-value>/WEB-INF/struts-config.xml</param-value>
  9. </init-param>
  10. <init-param>
  11. <param-name>debug</param-name>
  12. <param-value>3</param-value>
  13. </init-param>
  14. <init-param>
  15. <param-name>detail</param-name>
  16. <param-value>3</param-value>
  17. </init-param>
  18. <load-on-startup>0</load-on-startup>
  19. </servlet>
  20. <servlet-mapping>
  21. <servlet-name>action</servlet-name>
  22. <url-pattern>*.do</url-pattern>
  23. </servlet-mapping>
  24. <welcome-file-list>
  25. <welcome-file>login.jsp</welcome-file>
  26. </welcome-file-list>
  27. </web-app>


九、spring配置文件的内容【牵扯到ibatis和struts的整合】

[html] view plain copy
  1. <!--action-->
  2. <beanname="/login"class="com.leadtone.web.struts.action.LoginAction"abstract="false"
  3. lazy-init="default"autowire="default"dependency-check="default">
  4. <propertyname="userLoginService"ref="userLoginService"></property>
  5. </bean>


十、测试

这里的测试 包括单元测试。例如对dao层、service层、action层编写完成后都要进行junit4单元测试(Jmock或easyMock等)测试,这里就不添加了。

spring的配置文件中对事物拦截器的配置,也是必须的,这里没有配置


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值