用到的框架:spring、springmvc,mybatis
開發工具:eclipse,apache-tomcat-6.0.39
jar包管理:maven
開發過程
壹、建立工程
1、引入相關jar包:
<dependencies>
<!--測試包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<!-- servlet的jar包 添加<scope>provided</scope>, 因為provided表明該包只在編譯和測試的時候用-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
二、引入mybatis相關內容並測試
1、引入JAR包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
<mybatis.version>3.3.1</mybatis.version>
</properties>
<dependencies>
<!--測試包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<!-- servlet的jar包 添加<scope>provided</scope>,因為provided表明該包只在編譯和測試的時候用-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
</dependencies>
這裏面在pom裏面使用了<properties> 標簽重點看壹下,在這個環節添加了數據庫連接的jar包和mybatis的jar包。這裏要想可以操作數據庫需要編程式的讀取配置文件壹般放在classpath下面。這裏取名為conf.xml.這個裏面主要完成2件事:
a:對數據庫4個基本信息的配置, b:引入mapper.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ".mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/SSM_XML"/>
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 註冊userMapper.xml文件,-->
<mapper resource="im/fenqi/study/user/mapper/UserMapper.xml"/>
</mappers>
</configuration>
下面對這個步驟裏面的內容進行詳細說明:
1、創建im.fenqi.study.user.entity.User實體對象,這裏導入壹個lombok插件,這個插件要安裝(具體百度),可以不用顯示的寫set/get方法。
2、創建im/fenqi/study/user/mapper/UserMapper.xml文件,這個裏面是對數據庫進行操作壹般和 im.fenqi.study.user.mapper.UserMapper配對使用,裏面註意點。
標簽mapper裏面的namespace的值就是配對的JAVA類im.fenqi.study.user.mapper.UserMapper
標簽resultMap:是為了解決實體類的屬性名字和數據庫字段名字不壹致的問題。主鍵和其他鍵是有區別的。
resultMap裏面定義的字段和屬性在對應的表和實體必須有對應的內容否則會報錯。
標簽trim:可以處理user(user_id,user_name,password)等問題,裏面的子標簽為:
prefix:前綴覆蓋並增加其內容
suffix:後綴覆蓋並增加其內容
prefixOverrides:前綴判斷的條件
找到最前面的和條件壹樣的內容然後變成prefix裏面的內容
例:<trim prefix="where" prefixOverrides="AND">
</trim>
根據條件判斷trim裏面的字符串為"AND id=#{id} AND name like #{name}"
找到最前面的AND(prefixOverrides的內容)替換成where(prefix內容)
如果沒有prefixOverrides的內容就直接加在前面。
suffixOverrides:後綴判斷的條件
和prefixOverrides類似。
標簽if:比較簡單,<if test="判斷條件"></if>
標簽sql:
<sql id="Base_Column_List">
id, user_id,user_name,password
</sql>
使用場景:
select <include refid="Base_Column_List" /> from user
需要返回的字段很多的時候不用每次都寫壹遍
3、創建im.fenqi.study.user.mapper.UserMapper類這個和上面的文件是成對出現的,這是壹個接口接口裏面的方法名和UserMapper.xml裏面的id要壹致
4、測試類userTest
在本地測試主要使用SqlSession對象二這個對象需要使用SqlSessionFactory對象才能創建,下面先說SqlSessionFactory對象是怎麽得到的
a:獲取配置文件config.xml的輸入流:
String resource = "/conf.xml";
//從classpath裏面尋找
InputStream resourceAsStream = Object.class.getResourceAsStream(resource);
b:獲取SqlSessionFactory對象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
c:獲取SqlSession對象:
SqlSession session = factory.openSession();
d:得到dao層的對象
UserMapper userMapper = session.getMapper(UserMapper.class);
d:插入數據
User user = new User();
user.setUserId(UUID.randomUUID().toString());
user.setUserName("zw1");
user.setPassword("123456");
int count = userMapper.saveUserInfo(user);
session.commit();
System.out.println("insert:"+count);
三、引入spring框架並測試
首先需要引入必要的jar包,主要是spring必要的包和spring支持mybatis,jdbc的包
<!--spring基礎的包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring+mybatis+jdbc-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
這個時候conf.xml這個配置文件已經不需要了,統壹在spring.xml裏面進行配置
1、配置數據庫連接
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns=".mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/SSM_XML"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
</beans>
當然這個配置可以寫在properties文件裏面(用到再說)
2、spring引入以後主要目的就是利用IOC容器進行創建對象,沒有加入spring之前SqlSessionFactory、SqlSession、UserMapper 對象的創建都是我們硬編碼實現,spring就是為了解決這些問題,最後直接返回UserMapper 給我們使用。其他的事情都在配置裏完成。這裏面具體操作流程以後會詳細分析
3、創建SqlSessionFactory
創建這個對象需要數據源和mapper.xml配置文件的位置
<!--創建 sqlSessionFactory,給了數據源和配置路徑 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:im/fenqi/study/*/mapper/*.xml"></property>
</bean>
4、創建UserMapper 對象(這壹部分還要重點研究)
需要SqlSessionFactory對象創建SqlSession對象,然後創建UserMapper 對象,所以需要SqlSessionFactory和UserMapper 接口的位置,MapperScannerConfigurer是掃描包,不要每次都創建MapperFactoryBean
<!-- 創建Mapper層的對象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="im.fenqi.study.*.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
5、測試獲取對象
ApplicationContext context = new ClassPathXmlApplicationContext("/spring.xml");
UserMapper bean = context.getBean("userMapper",UserMapper.class);
List<User> userByUser = bean.getUserByUser(null);
6、這個測試還可以使用spring自帶的test類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring.xml")
public class springtest {
@Autowired
private UserMapper userMapper;
@Test
public void save()
{
User user = new User("zw1", 20);
userMapper.save(user);
}
四、引入springmvc框架
首先引入springmvc的JAR包
<!--springMVC相關框架 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
這個時候需要配置web.xml,也要配置springmvc.xml
1、配置web.xml
添加加載spring.xml的監聽器和spring文件路徑
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
配置Dispatcherservlet和springmvx.xml配置文件的位置
2、配置springmvc.xml文件
springmvc.xml主要配置控制器、handlerMapper、HandlerAdapter、渲染器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="ponent-scan base-package="im.fenqi.study"/>
<!--創建控制器 -->
<bean id="/user.do" class="im.fenqi.study.user.rest.UserController">
<property name="userService" ref="userService"></property>
</bean>
<!--創建handlermapper -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--創建handlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 配置渲染器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3、編寫控制器控制器和配置的類型要壹致
public class UserController implements Controller{
private UserService userService;
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
List<User> userList = userService.getUserByUser(null);
modelAndView.addObject("user", userList.get(0));
modelAndView.setViewName("mypage");
return modelAndView;
}
}
五、整合過程中出現的問題
1、IOC容器。
如果我使用XML配置IOC容器,自己定義壹個類這個類裏面的屬性想用IOC容器裏面的對象初始化,必須提供set/get方法。
2、JSP不能使用el表達式,這個問題要解決
這個問題是缺少jar包的問題要想jsp使用起來不出現問題需要添加下面的包,最上面的包之前添加過了
<!-- servlet的jar包 添加<scope>provided</scope>,因為provided表明該包只在編譯和測試的時候用-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--JSP -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
3、mybatis和spring的配置過程還要具體分析
A:這個裏面有很多種配置這壹次就詳細說明壹下我們這裏使用的sqlSessionFactory和 MapperScannerConfigurer
sqlSessionFactory:創建的時候需要dataSource和mapper.xml的配置文件
MapperScannerConfigurer:可以整體掃描,提供基礎的包名可以使用通配符,需要sqlSessionFactoryBeanName用來創建sqlSessionFactory對象再創建SqlSession對象再通過SqlSession對象創建各個mapper對象。