Spring学习笔记----三大框架(Spring+SpringMVC+MyBatis)整合详细教程

下面的过程中我还没有使用Maven,在后面的学习过程中我会补上,此外,下面在整合的过程中我总会碰到路径的问题,所以将有的配置文件直接放在了src目录下,有的在放在了WEB-INF的目录下,下面列举一下所有的配置文件。

spring.xml(applicationContext.xml)--------------------spring配置文件
spring-mybatis.xml------------------------------------MyBatis配置文件
generatorConfig.xml-----------------------------------MyBatis Generator自动创建代码配置文件

spring-MVC.xml(springMVC.xml)-------------------------SpringMVC配置文件
web.xml-----------------------------------------------SpringMVC配置文件

log4j.properties--------------------------------------Log4j配置文件
jdbc.properties---------------------------------------数据源配置文件

上述的配置文件存放的位置很容易发生找不到文件的错误,所以一定要注意,后面我会继续整理配置文件的存放位置。
下面是我整合完成后文件的目录,感觉有点乱


Spring学习笔记----三大框架(Spring+SpringMVC+MyBatis)整合详细教程_第1张图片

1、Spring

Spring是一个开源框架,Spring是一个轻量级的Java开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来,它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只有可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单的来说,Spring是一个轻量级的
控制反转(IoC)和面向切面(AOP)的容器框架。

2、SpringMVC

SpringMVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

3、MyBatis

MyBatis本来是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code ,并且改名为MyBatis。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Object(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射数据库
中的记录。

4、SSM整合 

4.1  Spring与Mybatis的整合

所有的jar包都引入后,先将spring和MyBatris整合,然后写了个单元测试。

4.1.1、建立JDBC属性文件(设置属性为utf-8)

jdbc.properties

driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=123

起初我设置了包括下面的属性,但是发现出现了问题,我直接选择了将下面的属性去掉。这个问题我在后面会进一步的解决掉

#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000

4.1.2、建立spring-mybatis.xml配置文件



	
	
	

	
	
		
	

	
		
		
		
		
		
		
		
		
		
	

	
		
		
		
		

		
		
	

	
	
		
		
	
	
	
		
	
	
	

在这个配置文件里面,我碰到的最大的问题就是路径的问题。比如说value="classpath:jdbc.properties",最开始我是放在WEB-INF目录下面,但是后来运行时一直说找不到文件,在网上找了很久,发现有人说一般的Properties都是放在class的path下面,发布项目后,WEB-INF的目录很深的,不能直接的找到的所以我选择了直接将所有的配置文件放在src目录下面,这里也是我需要改进的地方。


4.1.3、Log4j的配置

之前我也简单的学习了一下Log4j,Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
下面是我的基本配置,我之前写过一点关于Log4j的应用,下面是我的网址
http://blog.csdn.net/cwzhsi/article/details/41926467
还有转载的一篇Log4j使用的文章
http://blog.csdn.net/zhshulin/article/details/37937365


log4j.properties
#定义LOG输出级别
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#灵活的指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x -%m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File=org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File=E:WorkSpace/logs/errors.log
#定义文件最大大小
log4j.appender.File.MaxFileSize=10MB
#输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

4.1.4、Junit测试

上面基本完成了Spring和MyBatis的配置,下面来进行一个具体的测试。

4.1.4.1、创建测试用表

我之前就在oracle中创建了TD表,表的创建步骤之前也已经介绍过,这里就不再详述了。

4.1.4.2、利用MyBatis Generator

这个可根据表自动创建实体类,MyBatis映射文件及DAO接口,一般都习惯性的将接口改名为IUserDao,而不是直接用它生成的UserMapper,注意,这一步改了之后,千万要记得MyBatis映射文件也要改,我就是之前忘了改然后一直不知道哪里报错了。关于MyBatis Generator的具体实现可以看看我的另一篇博文
 http://blog.csdn.net/cwzhsi/article/details/42041087

下面是生成目录图如下:

Spring学习笔记----三大框架(Spring+SpringMVC+MyBatis)整合详细教程_第2张图片

4.1.4.3、建立service接口和实现类

下面是我的具体的内容:

IUserService.java

public interface IUserService {
    public User getUserById(BigDecimal userId);
    public String addUser(User user);
}
IUserSerivceImpl.java

@Service("userService")
public class IUserServiceImpl implements IUserService{
	private IUserDao userDao;
	@Autowired
	public void setUserDao(IUserDao userDao) {
		this.userDao = userDao;
	}
	@Override
	public User getUserById(BigDecimal userId) {
		return this.userDao.selectByPrimaryKey(userId);
	}
	@Override
	public String addUser(User user) {
		System.out.println("zhsi");
		userDao.insert(user);
		return "success";
	}
}
这里我使用了自动注解的功能,这样在注入时就不用在配置文件中进行设置了,不过也要注意这里的实现,这一步我也调试了很久主要是对注解的使用还不是很熟练。

4.1.4.4 建立测试类

@ContextConfiguration(locations={"spring-mybatis.xml","applicationContext.xml"})
public class SpringTest {
	private static Logger logger=Logger.getLogger(SpringTest.class);
	@Resource
	private IUserService userService;
	@Before
	public void before(){
		ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"classpath:spring-mybatis.xml","classpath:applicationContext.xml"});
		userService =(IUserService) context.getBean("userService");
		PropertyConfigurator
		.configure(".//WebContent/WEB-INF/cfg/log4j.properties");
	}
	@Test
	public void test() {
		User user=new User();
		user.setUserName("mama");
		user.setPassword("789");
		user.setAge(new BigDecimal(21));
		logger.info(userService.addUser(user));
	}
}
测试结果如下:

Spring学习笔记----三大框架(Spring+SpringMVC+MyBatis)整合详细教程_第3张图片
上面的方式实现了Spring和MyBatis的整合,输出的信息使用的是Log4j打印到控制台。

这里我碰到了一个问题,就是使用注解的方式来引入配置文件和类,然后将service接口对象注入,但是这里我一直出现了空指针错误,找不到userService类。

哇塞,我终于解决问题了!

下面的测试类如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-mybatis.xml","classpath:applicationContext.xml"})
public class SpringTest {
	private static Logger logger=Logger.getLogger(SpringTest.class);
	/**
	 * @Resource按名称注入(不需要setter方法了),@Autowired按类型注入
	 */
	@Resource
	private IUserService userService;
	@Autowired
	public void setUserService(IUserService userService) {
		this.userService = userService;
	}

	/*@Before
	public void before(){
		ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"classpath:spring-mybatis.xml","classpath:applicationContext.xml"});
		userService =(IUserService) context.getBean("userService");
		PropertyConfigurator
		.configure(".//WebContent/WEB-INF/cfg/log4j.properties");
	}*/
	
	@Test
	public void test() {
		PropertyConfigurator
		.configure(".//WebContent/WEB-INF/cfg/log4j.properties");
		User user=new User();
		user.setUserName("baba");
		user.setPassword("222");
		user.setAge(new BigDecimal(21));
		logger.info(userService.addUser(user));
	}
}

现在不需要执行@Before里面的内容了,因为我加上了@RunWith(SpringJUnit4ClassRunner.class),现在就不会报service空指针错了,在网上看了一下,原因是说在使用所有注解前必须使用@RunWith(SpringJUnit4ClassRunner.class),让测试运行与Spring测试环境Spring框架在org.springframework.test.annotation包中提供了常用的Spring特定注解集。

这个问题整了我一天了,多谢师姐过来给我指点一下,太高兴了!

4.2、整合SpringMVC

SpringMVC的配置文件包括web.xml 和 springMVC.xml  这两个配置文件存放在WEB-INF目录下面

4.2.1、配置springMVC.xml文件(一般是spring-mvc.xml,我将其的名字改为了springMVC.xml)

该配置文件主要是自动扫描控制器、视图模式、注解的启动这三个。配置文件如下:



	

	

    
    
	
	
	
	
	
		
			
				text/html;charset=UTF-8
			
		
	

	
	
		
			
				
			
		
	
	
	
		
		
	

	
	
		
		
		
		
		
	


配置文件中都有注释,我就不再详细介绍了。

4.2.2、配置web.xml文件

在这里对spring-mybatis.xml和配置文件springMVC.xml进行的引入就是完成了对SSM框架的整合。

web.xml



	SSM_1
	
		index.html
		index.htm
		index.jsp
		default.html
		default.htm
		default.jsp
	
	
	
		contextConfigLocation
		classpath:spring-mybatis.xml,classpath:applicationContext.xml
	

	
	
		log4jConfigLocation
		classpath:log4j.properties
	

	
	
		encodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
	

	
		encodingFilter
		/*
	

4.2.3、创建一个简单的JSP显示文件

showUser.jsp  此页面仅输出一下用户名

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>




ssm Test

   
    ${user.userName}
   


4.2.4、建立UserController类

UserController.java

@Controller
@RequestMapping("/user")
public class UserController {
	private static Logger logger=Logger.getLogger(SpringTest.class);
	@Resource
	private IUserService userService;
	@RequestMapping("/addUser")
	public String addUser(HttpServletRequest request,Model model){
		//PropertyConfigurator.configure(".//WebContent/WEB-INF/cfg/log4j.properties");
		User user=new User();
		user.setUserName("weiwei");
		user.setPassword("333");
		user.setAge(new BigDecimal(21));
		userService.addUser(user);
		model.addAttribute("user", user);
		return "showUser";
	}
	@RequestMapping("/getUser")
	public String getUser(HttpServletRequest request,Model model){
		int userId=Integer.parseInt(request.getParameter("id"));
		User user=this.userService.getUserById(new BigDecimal(userId));
		model.addAttribute("user", user);
		return "showUser";
	}
}	

4.2.5、部署项目

addUser方法被调用时,输入地址:http://localhost:8080/SSM_1/user/addUser
getUser方法被调用时,输入地址:http://localhost:8080/SSM_1/user/getUser?id=107

至此,SSM三大框架简单的整合就基本完成了,虽然是我是模仿的别人的例子,但是在整合的过程中通过碰到问题、解决问题这样反复折腾的
过程,我学习了很多,对框架整合的流程也基本上算是了解了,后面再进一步的学习吧。



你可能感兴趣的:(Spring)