spring+mybatic整合开发的基本步骤
1.根据需求划分模块(Dao、Service、Controller):
2.通过maven引入相关的jar包依赖:
service模块的pom:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>spring_emp</artifactId> <groupId>com.yzy</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <artifactId>spring_emp_service</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
web模块的pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>spring_emp</artifactId> <groupId>com.yzy</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spring_emp_web</artifactId> <packaging>war</packaging> <name>spring_emp_web Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <artifactId>spring_emp_service</artifactId> <groupId>com.yzy</groupId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <finalName>spring_emp_web</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
3.编写spring配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- Spring整合Mybatis --> <!-- 配置数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/emp?serverTimezone=UTC"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!-- 配置会话工厂 --> <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="typeAliasesPackage" value="com.yzy.entity"></property> </bean> <!-- 配置mybatis的mapper配置文件存放的地方 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.yzy.Dao"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置advice,管理事务的行为 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="search*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 配置切面,以及advice使用的对象 --> <aop:config> <aop:pointcut id="txPointCut" expression="execution(* com.yzy.serice.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> </aop:config> <!-- 开启spring的注解ioc包扫描 --> <context:component-scan base-package="com.yzy"></context:component-scan> <!-- 自动代理,当代理的对象没有继承接口是,使用cglib代理,否则默认jdk自动代理(需继承接口) --> <aop:aspectj-autoproxy proxy-target-class="true"/> </beans>
4.创建实体类:
5.编写dao接口以及mapper配置文件:
package com.yzy.Dao;
import com.yzy.entity.department; import org.springframework.stereotype.Repository; import java.util.List; @Repository("departmentDao") public interface departmentDao { void add(department dep); void update(department dep); void delete(Integer id); List<department> selectAll(); department selectById(Integer id); }
mapper配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--配置命名空间,需和dao接口一致--> <mapper namespace="com.yzy.Dao.departmentDao"> <!-- 配置结果集,将数据库的表与实体类对应--> <resultMap id="resultMap" type="department"> <id property="id" column="id" javaType="Integer"></id> <result property="name" column="name" javaType="String"></result> <result property="address" column="address" javaType="String"></result> </resultMap> <!-- 配置sql语句,id需与dao接口的方法名一一对应--> <insert id="add" useGeneratedKeys="true" parameterType="department"> insert department(name,address) value(#{name},#{address}) </insert> <update id="update" parameterType="department"> update department set name=#{name},address=#{address} where id=#{id} </update> <delete id="delete" parameterType="Integer"> delete from department where id =#{id} </delete> <select id="selectAll" resultMap="resultMap"> select * from department </select> <select id="selectById" parameterType="Integer" resultMap="resultMap"> select * from department where id =#{id} </select> </mapper>
6.编写service:
package com.yzy.serice.impl; import com.yzy.Dao.departmentDao; import com.yzy.entity.department; import com.yzy.serice.DepartmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service("departmentService") public class departmentServiceImpl implements DepartmentService{ @Autowired private departmentDao dao; public void add(department dep) { dao.add(dep); } public void edit(department dep) { dao.update(dep); } public void remove(Integer id) { dao.delete(id); } public department get(Integer id) { return dao.selectById(id); } public List<department> getAll() { return dao.selectAll(); } }
7.编写controller:
package com.yzy.controller; import com.yzy.entity.department; import com.yzy.serice.DepartmentService; import com.yzy.serice.impl.departmentServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; @Controller("departmentController") public class departmentController { @Autowired private DepartmentService departmentService; public void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<department> all = departmentService.getAll(); request.setAttribute("LIST",all); request.getRequestDispatcher("/department_list.jsp").forward(request,response); } }
8.编写一个servlet来解析url,将对应的请求交给相应的controller:
package com.yzy.global; import com.yzy.controller.departmentController; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class dispatcherServlet extends HttpServlet { private ApplicationContext context; @Override public void init() throws ServletException { super.init(); context=new ClassPathXmlApplicationContext("application.xml"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getServletPath().substring(1); int index=path.indexOf("/"); String beanName=null; String methodName=null; if(index!=-1){ beanName=path.substring(0,index)+"Controller"; methodName=path.substring(index+1,path.indexOf(".do")); }else{ beanName="selfController"; methodName=path.substring(0,path.indexOf(".do")); } Object obj = context.getBean(beanName); //通过反射来调用相应的controller的方法 try { Method method = obj.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(obj,request,response); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
<!-- Spring整合Mybatis -->