一、新建工程,添加ibatis、spring和struts的jars;
二、数据库设计.
三、POJO类.
四、pojo类配置文件编写
五、ibatis主配置文件编写【主配置文件只剩下sqlMap了】
六、dao接口和接口实现
七、service接口和接口实现
八、struts action实现及struts-config.xml配置
九、spring配置文件的内容【牵扯到ibatis和struts的整合】
十、测试
一、新建工程,添加ibatis、spring和struts的jars;
二、数据库设计.
mysql数据库:
- useibatis;
- droptableifexistsuser;
- createtableifnotexistsuser(
- IDtinyintprimarykeyauto_increment,
- LOGIN_NAMEvarchar(10)notnull,
- PASS_WORDvarchar(15)notnull,
- QXvarchar(10)default'guest'notnull,
- MEMOtext
- )
- type=innodb
- comment="userinfo";
- insertintouser(LOGIN_NAME,PASS_WORD,QX)values('leh','888','admin');
- insertintouser(LOGIN_NAME,PASS_WORD)values('lek','888');
- commit;
数据源的配置
1)、配置文件db.properties (位置:resources/properties/db.properties,这里resources和src是一类文件)
- driver=com.mysql.jdbc.Driver
- url=jdbc\:mysql\://localhost\:3306/ibatis
- username=root
- password=54321
2)、注册数据源到spring
- !--springloaddataSourceconfigurationpropertyfile-->
- <beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <propertyname="locations">
- <list>
- <value>properties/database.properties</value>
- </list>
- </property>
- </bean>
- <!--dataSource-->
- <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
- <propertyname="driverClassName"value="${driver}"/>
- <propertyname="url"value="${url}"/>
- <propertyname="username"value="${username}"/>
- <propertyname="password"value="${password}"/>
- </bean>
三、POJO类.
本例是User实例类:
- packagecom.leadtone.ibatis.domain;
- importjava.io.Serializable;
- publicclassUserimplementsSerializable{
- privateintid;
- privateStringname;
- privateStringpassword;
- privateStringqx;
- privateStringmemo;
- publicintgetId(){
- returnid;
- }
- /**
- *setter和getter方法省略
- */
四、pojo类配置文件编写
本例是User.xml:(位置:com.leadtone.sqlmap.User.xml)
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEsqlMap
- PUBLIC"-//ibatis.apache.org//DTDSQLMap2.0//EN"
- "http://ibatis.apache.org/dtd/sql-map-2.dtd">
- <sqlMapnamespace="User">
- <typeAliasalias="user"type="com.leadtone.ibatis.domain.User"/>
- <resultMapclass="user"id="UserResult">
- <resultproperty="id"column="ID"/>
- <resultproperty="name"column="LOGIN_NAME"/>
- <resultproperty="password"column="PASS_WORD"/>
- <resultproperty="qx"column="QX"/>
- <resultproperty="memo"column="MEMO"/>
- </resultMap>
- <!--queryallUsers-->
- <selectid="selectAllUsers"resultMap="UserResult">
- select*fromuser
- </select>
- <!--queryuserbyid-->
- <selectid="selectUserById"parameterClass="int"resultMap="UserResult">
- selectID,LOGIN_NAME,PASS_WORD,QX,MEMOfromuserwhereID=#id#
- </select>
- <!--queryuserbyuser-->
- <selectid="selectUserByUser2"parameterClass="map"resultMap="UserResult">
- selectID,LOGIN_NAME,PASS_WORD,QX,MEMO
- fromuser
- <dynamicprepend="where">
- <isNotEmptyprepend="and"property="name">
- LOGIN_NAME=#name#
- </isNotEmpty>
- <isNotEmptyprepend="and"property="password">
- PASS_WORD=#password#
- </isNotEmpty>
- </dynamic>
- </select>
- <selectid="selectUserByUser"parameterClass="user"resultMap="UserResult">
- selectID,LOGIN_NAME,PASS_WORD,QX,MEMO
- fromuser
- <dynamicprepend="where">
- <isNotEmptyprepend="and"property="name">
- LOGIN_NAME=#name#
- </isNotEmpty>
- <isNotEmptyprepend="and"property="password">
- PASS_WORD=#password#
- </isNotEmpty>
- </dynamic>
- </select>
- <selectid="selectUsersByName"parameterClass="String"resultMap="UserResult">
- selectID,LOGIN_NAME,PASS_WORD,QX,MEMO
- fromuser
- <dynamicprepend="where">
- <isNotEmptyprepend="and"property="value">
- snamelike'%$value$%'
- </isNotEmpty>
- </dynamic>
- </select>
- <!--
- <insertid="addUser"parameterClass="User">
- insertintouser(LOGIN_NAME,PASS_WORD,QX,MEMO)
- values(#name#,#birth#,#score#)
- <selectKeykeyProperty="id"resultClass="int">
- selectlast_insert_id()
- </selectKey>
- </insert>
- <!--注意这里的keyProperty="id"中的id就是User中的id属性,resultClass就是查询的的返回值-->
- -->
- <updateid="updateUser"parameterClass="User">
- updateusersetLOGIN_NAME=#name#,PASS_WORD=#password#,QX=#qx#,memo=#memo#whereID=#id#
- </update>
- <deleteid="deleteUser"parameterClass="int">
- deletefromuserwhereID=#id#
- </delete>
- </sqlMap>
【补充:】动态sql:
一般来说,拼接动态sql是在查询时,指定多个查询条件的情况下用的,所以用到parameterClass= (map或具体类),
但对于传递过来的参数就一个时,若如下代码就会出错:
- <selectid="selectUserById"parameterClass="int"resultMap="UserResult">
- selectsid,sname,smajor,sbirth,scorefromusers
- <dynamicprepend="where">
- <isNotEmptyprepend="and"property="id">
- sid=#id#
- </isNotEmpty>
- </dynamic>
- </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:(位置:)
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEsqlMapConfig
- PUBLIC"-//ibatis.apache.org//DTDSQLMapConfig2.0//EN"
- "<ahref="http://ibatis.apache.org/dtd/sql-map-config-2.dtd">http://ibatis.apache.org/dtd/sql-map-config-2.dtd</a>">
- <sqlMapConfig>
- <sqlMapresource="com/leadtone/ibatis/sqlmap/User.xml"/>
- <!--
- <sqlMapresource="com/leadtone/ibatis/sqlmap/User1.xml"/>
- <sqlMapresource="com/leadtone/ibatis/sqlmap/User2.xml"/>
- <sqlMapresource="com/leadtone/ibatis/sqlmap/Usern.xml"/>
- -->
- </sqlMapConfig>
六、dao接口和接口实现
1)、本例为UserDao:
- packagecom.leadtone.ibatis.dao;
- importjava.util.List;
- importcom.leadtone.ibatis.domain.User;
- publicinterfaceIUserDao{
- publicList<User>queryAllUsers();
- publicUserqueryUserById(intid);
- publicUserqueryUserByUser(Useruser);
- publicList<User>queryUserByName(Stringname);
- publicvoidaddUser(Useruser);
- publicvoidaddUserBySequence(Useruser);
- publicvoidupdateUser(Useruser);
- publicvoiddeleteUser(intid);
- }
2)、实现类UserDaoImpl:
- packagecom.leadtone.ibatis.dao.ibatis;
- importjava.util.List;
- importorg.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
- importcom.leadtone.ibatis.dao.IUserDao;
- importcom.leadtone.ibatis.domain.User;
- publicclassUserDaoImplextendsSqlMapClientDaoSupportimplementsIUserDao{
- //注意这里的SqlMapClient接口的声明和下面的static静态代码都不需要了,
- //因为这里继承了spring提供的ibatis模板template类SqlMapClientDaoSupport,不是用原生的SqlMapClient
- //privatestaticSqlMapClientsqlMapClient=null;
- /*
- static{
- Readerreader=null;
- try{
- reader=Resources.getResourceAsReader("com/leadtone/ibatis/sqlmap/SqlMapConfig.xml");
- sqlMapClient=SqlMapClientBuilder.buildSqlMapClient(reader);
- reader.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- */
- publicvoidaddUser(Useruser){
- getSqlMapClientTemplate().insert("addUser",user);
- }
- publicUserqueryUserByUser(Useruser){
- System.out.println("---UserDaoImpl---");
- return(User)this.getSqlMapClientTemplate().queryForObject("selectUserByUser",user);
- }
- /*
- *这里主要演示一个模拟用户登录系统验证的操作,主要用了queryUserByUser(Useruser)方法
- */
- }
3)、在spring配置文件中配置这个bean
- <!--sqlMapClient-->
- <beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <propertyname="configLocation"value="sqlmap/sql-map-config.xml"/>
- <propertyname="dataSource"ref="dataSource"/>
- </bean>
- <!--validateloginUser-->
- <!--dao-->
- <beanid="userDao"class="com.leadtone.ibatis.dao.ibatis.UserDaoImpl">
- <propertyname="sqlMapClient"ref="<spanstyle="color:#000000;">sqlMapClient</span>"></property>
- </bean>
七、service接口和接口实现
1)IUserLoginService接口
- packagecom.leadtone.ibatis.service;
- importcom.leadtone.ibatis.domain.User;
- publicinterfaceIUserLoginService{
- publicbooleanisLoginUser(Useruser);
- }
2)UserLoginSerivceImpl实现类
- packagecom.leadtone.ibatis.service.impl;
- importcom.leadtone.ibatis.dao.IUserDao;
- importcom.leadtone.ibatis.domain.User;
- importcom.leadtone.ibatis.service.IUserLoginService;
- publicclassUserLoginServiceImplimplementsIUserLoginService{
- privateIUserDaouserDao;
- publicIUserDaogetUserDao(){
- returnuserDao;
- }
- publicvoidsetUserDao(IUserDaouserDao){
- this.userDao=userDao;
- }
- publicbooleanisLoginUser(Useruser){
- returnnull!=userDao.queryUserByUser(user)?true:false;
- }
- }
3)在spring中注册这个bean
- <!--service-->
- <beanid="userLoginService"class="com.leadtone.ibatis.service.impl.UserLoginServiceImpl">
- <propertyname="userDao"ref="userDao"></property>
- </bean>
八、struts action实现及struts-config.xml配置(牵扯到struts和spring的整合)
1)action:
- packagecom.leadtone.web.struts.action;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importorg.apache.struts.action.Action;
- importorg.apache.struts.action.ActionForm;
- importorg.apache.struts.action.ActionForward;
- importorg.apache.struts.action.ActionMapping;
- importcom.leadtone.ibatis.domain.User;
- importcom.leadtone.ibatis.service.IUserLoginService;
- importcom.leadtone.web.struts.form.LoginForm;
- publicclassLoginActionextendsAction{
- privateIUserLoginServiceuserLoginService;
- publicIUserLoginServicegetUserLoginService(){
- returnuserLoginService;
- }
- publicvoidsetUserLoginService(IUserLoginServiceuserLoginService){
- this.userLoginService=userLoginService;
- }
- publicActionForwardexecute(ActionMappingmapping,ActionFormform,
- HttpServletRequestrequest,HttpServletResponseresponse){
- LoginFormloginForm=(LoginForm)form;
- Stringname=loginForm.getUsername();
- Stringpassword=loginForm.getPassword();
- Useruser=newUser();
- user.setName(name);
- user.setPassword(password);
- booleanisLogin=false;
- isLogin=userLoginService.isLoginUser(user);
- System.out.println(isLogin);
- if(isLogin){
- request.setAttribute("username",name);
- returnmapping.findForward("success");
- }
- else
- returnmapping.findForward("failure");
- }
- }
2)actionForm:
- publicclassLoginFormextendsActionForm{
- privateStringusername;
- privateStringpassword;
- privateStringgrade;
- publicActionErrorsvalidate(ActionMappingmapping,
- HttpServletRequestrequest){
- returnnull;
- }
- publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){
- }
- publicStringgetPassword(){
- returnpassword;
- }
- publicvoidsetPassword(Stringpassword){
- this.password=password;
- }
- publicStringgetGrade(){
- returngrade;
- }
- publicvoidsetGrade(Stringgrade){
- this.grade=grade;
- }
- publicStringgetUsername(){
- returnusername;
- }
- publicvoidsetUsername(Stringusername){
- this.username=username;
- }
- }
3)xml:
- <struts-config>
- <data-sources/>
- <form-beans>
- <form-beanname="loginForm"type="com.leadtone.web.struts.form.LoginForm"/>
- </form-beans>
- <global-exceptions/>
- <global-forwards/>
- <action-mappings>
- <action
- attribute="loginForm"
- input="/login.jsp"
- name="loginForm"
- path="/login"
- scope="request"
- type="org.springframework.web.struts.DelegatingActionProxy">
- <forwardname="failure"path="/failure.jsp"/>
- <forwardname="success"path="/succ.jsp"/>
- </action>
- </action-mappings>
- <controllerprocessorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>
- <message-resourcesparameter="com.leadtone.web.struts.ApplicationResources"/>
- <plug-inclassName="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-propertyproperty="contextConfigLocation"value="classpath:applicationContext.xml"/>
- </plug-in>
- </struts-config>
4)页面:
login.jsp
- <body>
- <center>
- <html:formaction="${Pagecontext.request.contextPath}/login"method="post">
- <tableborder="1px"cellspacing="1px"cellpadding="1px">
- <tr>
- <td>username:</td>
- <td><html:textproperty="username"/></td>
- <td><html:errorsproperty="username"/></td>
- </tr>
- <tr>
- <td>password:</td>
- <td><html:passwordproperty="password"/></td>
- <td><html:errorsproperty="password"/></td>
- </tr>
- <tr>
- <td>grade:</td>
- <td><html:selectproperty="grade">
- <html:optionvalue="guest">guest</html:option>
- <html:optionvalue="admin">admin</html:option>
- </html:select>
- </td>
- <td><html:errorsproperty="grade"/></td>
- </tr>
- <tr>
- <tdcolspan="3"valign="middle"align="center"><html:submit/><html:cancel/></td>
- </tr>
- </table>
- </html:form>
- </center>
- </body>
- succ.jsp
- <body>
- welcome${username},<br>
- loginsuccessfully!
- </body>
- falure.jsp
- <body>
- sorry,loginerror<ahref="login.jsp">relogin</a>
- </body>
5)web.xml
- <?xmlversion="1.0"encoding="UTF-8"?>
- <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">
- <servlet>
- <servlet-name>action</servlet-name>
- <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>/WEB-INF/struts-config.xml</param-value>
- </init-param>
- <init-param>
- <param-name>debug</param-name>
- <param-value>3</param-value>
- </init-param>
- <init-param>
- <param-name>detail</param-name>
- <param-value>3</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>action</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>login.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
九、spring配置文件的内容【牵扯到ibatis和struts的整合】
- <!--action-->
- <beanname="/login"class="com.leadtone.web.struts.action.LoginAction"abstract="false"
- lazy-init="default"autowire="default"dependency-check="default">
- <propertyname="userLoginService"ref="userLoginService"></property>
- </bean>
十、测试
这里的测试 包括单元测试。例如对dao层、service层、action层编写完成后都要进行junit4单元测试(Jmock或easyMock等)测试,这里就不添加了。
spring的配置文件中对事物拦截器的配置,也是必须的,这里没有配置