一、层化分析
---------------------------
1.Spring MVC 表现层 //最直观的数据表现形式(jsp),网页,web等,内部的controller与业务层进行交互
3.Service 业务层 //使用Spring框架,整合业务层、数据访问层、持久层,将涉及到的类及其关系整合到一个容器中,实例化容器即可实现各个层之间的联系
3.Dao 数据访问层 //增删改查等数据操作
4.Mybatis 持久层 //使用Mybatis持久化技术,封装jdbc,对接数据库mysql
5.DB层 数据库层 //存储数据
二、Spring 业务层框架
---------------------------
1.管理java bean的,不再new对象,将对象的配置信息放到xml文件中。一般用于单例模式
2.内部维护一个ApplicationContext[实质就是一个Map<String,Object>集合,存储bean id 到 java bean类的映射]
3.这样就可以通过外部文件来实例化类的对象,而且只要更改配置文件就可以达到更改类对象的目的
4.创建Spring项目,添加maven依赖,添加spring支持
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
</dependencies>
5.创建spring配置文件[Resources/beans.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="ws" class="test.ssm.spring.WelcomeService">
<!-- value 表示值, ref表示引用,解决依赖 -->
<property name="message" value="hello world" />
<property name="dao" ref="userDao"/>
</bean>
<bean id="userDao" class="dao.UserDao">
</bean>
</beans>
6.创建类test.ssm.spring.WelcomeService和依赖类dao.UserDao
---------------------------------------------------------------
package test.ssm.spring;
import dao.UserDao;
public class WelcomeService {
private String message;
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao dao) {
this.dao = dao;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void sayMsg()
{
System.out.println(message);
dao.insert();
}
}
------------------------------------------
package dao;
public class UserDao {
public void insert()
{
System.out.println("insert over");
}
}
7.创建App类
-------------------------------
package test.ssm.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String [] args)
{
//根据配置文件beans.xml 创建一个ApplicationContext,里面存放javabeans
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
//通过 bean id, 在ApplicationContext中取出WelcomeService类
WelcomeService ws = (WelcomeService)ac.getBean("ws");
ws.sayMsg();
}
}
三、使用spring的注解方式 -- 替代写配置文件
---------------------------------------------------
1.@Repository:仓库 -- 持久层
2.@Service:服务 -- 业务层
3.在类前面添加特定的注解,然后就不用编写配置文件了,只需要指定扫描的package即可
4.添加maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
5.UserDao增加@Repository注解
@Repository("dao")
//默认名字是userDao
public class UserDao {
public void insert()
{
System.out.println("insert over");
}
}
6.Service增加 @Service注解
@Service("ws")
//默认名字是welcomeService
public class WelcomeService {
...
//注入指定的dao对象
//注意,只能在setDao这里添加
@Resource(name = "dao")
public void setDao(UserDao dao) {
this.dao = dao;
}
}
7.修改beans.xml文件,引入context空间,使用组件扫描。
[resrouces/beans.xml]
<?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: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/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="dao,test.ssm.spring" />
</beans>
8.测试App
public class App {
public static void main(String[] args) {
//创建容器
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
WelcomeService ws = (WelcomeService)ac.getBean("ws");
ws.sayHello();
}
}
四、spring 整合mybatis
----------------------------------------------------------
1.原理:将mybatis的类在spring容器中进行配置和储存
2.创建模块SpringMybatisDemo,添加maven依赖
<
?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it18zhang</groupId>
<artifactId>springmybatisdemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
</project>
3.创建包
test.demo.dao
test.demo.service
test.demo.util
test.demo.domain
4.配置c3p0连接池的 beans.xml
[resources/beans.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置从c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="user" value="mysql"/>
<property name="password" value="mysql"/>
<property name="maxPoolSize" value="10"/>
<property name="minPoolSize" value="2"/>
<property name="initialPoolSize" value="3"/>
<property name="acquireIncrement" value="2"/>
</bean>
</beans>
5.编写单元测试 -- 测试c3p0连接池
/**
* 测试c3p0连接池
*/
@Test
public void testC3p0Conn() throws SQLException {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
DataSource ds = (DataSource) ac.getBean("dataSource");
System.out.println(ds.getConnection());
}
6.配置Mybatis-sqlSession会话工厂的bean,修改beans.xml
[resources/beans.xml]
...
<!-- 配置会话工厂bean -->
<!-- mybatis 整合 spring 的核心类 -->
<bean id="sf" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 给数据源dataSource属性指定关联类,类id为dataSource -->
<property name="dataSource" ref="dataSource"/>
<!-- 给属性configLocation属性赋值,值为mybatis-congif.xml -->
<property name="configLocation" value="mybatis-config.xml"/>
</bean>
...
7.在test.demo.domain包下,添加domain类[详见上篇 SSM -- Mybatis]
Users
Orders
Items
8.添加Mapper.xml映射文件[详见上篇 SSM -- Mybatis]
//注意:修改类的别名
resources/UserMapper.xml
resources/OrderMapper.xml
9.添加[Resources/mybatis-config.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 给类定义别名 -->
<typeAliases>
<typeAlias type="test.demo.domain.Users" alias="_Users"/>
<typeAlias type="test.demo.domain.Orders" alias="_Orders"/>
<typeAlias type="test.demo.domain.Items" alias="_Items"/>
</typeAliases>
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="OrderMapper.xml"/>
</mappers>
</configuration>
10.新建包dao和类 UserDao 和 OrderDao 以及 IBaseDao接口 底层数据库通信
----------------------------------
package test.demo.dao;
import java.util.List;
/**
* dao接口--面向接口设计
* @param <T>
*/
public interface IBaseDao<T> {
public void insert(T t);
public void update(T t);
public void delete(Integer id);
public T selectOne(Integer id);
public List<T> selectAll();
}
-------------------------------------
package test.demo.dao;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;
import test.demo.domain.Users;
import java.util.List;
/**
* 用户dao--增删改查
*/
@Repository
public class UserDao extends SqlSessionDaoSupport implements IBaseDao<UserDao>{
public void insert(UserDao userDao) {
this.getSqlSession().insert("users.insert", userDao);
}
public void update(UserDao userDao) {
this.getSqlSession().update("users.update", userDao);
}
public void delete(Integer id) {
this.getSqlSession().delete("users.delete", id);
}
/**
* 按照id查询
*/
public UserDao selectOne(Integer id) {
return this.getSqlSession().selectOne("users.select_one",id);
}
/**
* 全表扫描
*/
public List<UserDao> selectAll() {
return this.getSqlSession().selectList("users.select_all");
}
}
---------------------------------------
package test.demo.dao;
import org.junit.Test;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;
import test.demo.domain.Orders;
import test.demo.domain.Users;
import javax.swing.text.DefaultEditorKit;
import java.util.List;
/**
* 订单dao--增删改查
*/
@Repository
public class OrderDao extends SqlSessionDaoSupport implements IBaseDao<OrderDao>{
public void insert(OrderDao orderDao) {
this.getSqlSession().insert("orders.insert", orderDao);
}
public void update(OrderDao orderDao) {
}
public void delete(Integer id) {
}
public OrderDao selectOne(Integer id) {
return this.getSqlSession().selectOne("orders.select_one", id);
}
public List<OrderDao> selectAll() {
return null;
}
public List<OrderDao> selectAll(OrderDao orderDao) {
return this.getSqlSession().selectOne("orders.select_all");
}
}
11.新建service包:BaseService + impl, UserService + impl, OrderService + impl
[IBaseService<T> 服务接口类]
----------------------------------------------
package test.demo.service;
import java.util.List;
/**
* 主要用于用户要求的实现
* 偏应用层
* 跟随需求随时变更
*/
public interface IBaseService<T> {
public void insert(T t);
public void update(T t);
public void delete(Integer id);
public T selectOne(Integer id);
public List<T> selectAll();
}
[IOrderService]
-----------------------------------------------
/**
* 单独用于订单类需求的更改的接口
*/
public interface IOrderService extends IBaseService <Orders>{
/** 拓展内容 **/
}
[IUserService]
-----------------------------------------------
/**
* 单独针对于用户需求的更改的接口
*/
public interface IUserService extends IBaseService <Users>{
}
[BaseServiceImpl<T>]
------------------------
package test.demo.service.impl;
import test.demo.dao.IBaseDao;
import test.demo.service.IBaseService;
import javax.annotation.Resource;
import java.util.List;
public abstract class BaseServiceImpl<T> implements IBaseService<T> {
private IBaseDao<T> baseDao;
public void setBaseDao(IBaseDao<T> baseDao) {
this.baseDao = baseDao;
}
public void insert(T t) {
baseDao.insert(t);
}
public void update(T t) {
baseDao.update(t);
}
public void delete(Integer id) {
baseDao.delete(id);
}
public T selectOne(Integer id) {
return baseDao.selectOne(id);
}
public List<T> selectAll() {
return baseDao.selectAll();
}
}
[UserServiceImpl]
---------------------------
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<Users> implements IUserService {
/**
* 重写set方法 注入,指定UserDao
* @Resource 在Repository(仓库)中指定UserDao
*/
@Resource(name="userDao")
public void setBaseDao(IBaseDao<Users> baseDao) {
super.setBaseDao(baseDao);
}
}
[OrderServiceImpl]
-----------------------------
@Service("orderService")
public class OrderServiceImpl extends BaseServiceImpl<Orders> implements IOrderService {
@Resource(name="orderDao")
public void setBaseDao(IBaseDao<Orders> baseDao) {
super.setBaseDao(baseDao);
}
}
12.完善spring的配置文件,增加扫描配置文件选项和事务管理器
[beans.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd" default-autowire="byType">
<!-- 配置扫描组件 -->
<context:component-scan base-package="test.demo.dao,test.demo.service"/>
<!-- 配置c3p0池化数据源bean -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatis?user=mysql&password=mysql"/>
<property name="user" value="mysql"/>
<property name="password" value="mysql"/>
<property name="maxPoolSize" value="10"/>
<property name="minPoolSize" value="2"/>
<property name="initialPoolSize" value="3"/>
<property name="acquireIncrement" value="2"/>
</bean>
<!-- 配置会话工厂bean -->
<!-- mybatis 整合 spring 的核心类 -->
<bean id="sf" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 给数据源dataSource属性指定关联类,类id为dataSource -->
<property name="dataSource" ref="dataSource"/>
<!-- 给属性configLocation属性赋值,值为mybatis-congif.xml -->
<property name="configLocation" value="mybatis-config.xml"/>
</bean>
<!-- 配置事务的属性:开启何种事务 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- * 表示对所有的方法使用默认的隔离级别 -->
<!-- 也可以 tx:method name="insert *" 对所有的插入函数使用默认的隔离级别 -->
<!-- propagation 传播行为-->
<tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务切面:在何处开启事务,pointcut切入点 -->
<!-- execution(* *..*Service.*(..)) -->
<!-- execution(返回值 包.*Service.*(..)) -->
<!-- 任何返回值的 任何包下的以Service结尾的类中的任何方法(..表示参数不限) :其实就是表示一类方法-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Service.*(..))" />
</aop:config>
<!-- 配置数据源事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
13.测试UserService
/**
* 测试用户服务
*/
@Test
public void testUserService()
{
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
IUserService us = (IUserService) ac.getBean("userService");
Users u = new Users();
u.setName("laaaa");
u.setAge(16);
us.insert(u);
}