1.SSH三大框架:搭建WEB项目的基础
1)SpringMVC:
解决了:
优化页面跳转
优化参数获取
封装了基于反射的接口访问,不需要去写BaseServlet也不需要在web.xml中配置多个控制器。
2)Spring:
实现了:
IOC实现 自动化扫描与装载类对象
切面化编程(响应)
3)mybatis:ORM(Object Relational Mapping)框架:对象关系
实现了:
对数据库的访问,执行sql语句
建立了实体类与关系型数据库之间数据表的映射关系
2.对MyBatis的解释:
1)每一个MyBatis的应用程序都以一个SqlsessionFactory对象的实例为核心
2)SqlsessionFactory是线程安全的,SqlsessionFactory一旦被创建,在应用执行期间都存在,SqlsessionFactory在应用执行期间不需要重复创建多次,建议使用单例模式。
3)sqlSessionFactory是创建SqlSession的工厂。
sqlSession是mybatis的关键对象,是执行持久化操作的对象,类似于JDBC中的Connection。
sqlSession是应用程序与持久层之间执行交互操作的一个单线程对象,也是mybatis执行持久化操作的关键对象。
sqlSession对象完全包含以数据库为背景的的所有执行sql操作的方法(sqlsession可以做JDBC中preparedStatement对象的事情),他的底层封装了JDBC连接(sqlsession可以做DBHelper中Connection对象的事情),可以用sqlsession实例来直接执行被映射的sql语句。
3.MyBatis框架结构
1)pom.xml配置文件
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis集成spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 导入dbcp数据库连接池的依赖,用来在spring-mybatis.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!--j2ee相关包 servlet、jsp、jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<build>
<finalName>spring-mvc-demo</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>
2)spring.xml配置文件
<!--myBatis配置-->
<!--1.引入jdbc配置文件-->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!--2.配置数据源-数据库连接池 关联jdbc.properties配置文件中的信息-->
<bean id="dbSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="${maxIdle}"/>
<!-- 初始化连接数 -->
<property name="initialSize" value="${initialSize}"/>
<!--最大连接等待时间,连接超时时间 单位:ms-->
<property name="maxWait" value="${maxWait}"></property>
</bean>
<!--3.spring和myBatis整合 通过spring来管理MyBatis的SqlSessionFactory会话工厂 -->
<bean id="ssf" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据库连接池引用 -->
<property name="dataSource" ref="dbSource" />
<!-- 引入mybatis配置文件 从路径可以看出,mybatis.xml 和spring.xml同级-->
<property name="configLocation" value="classpath:mybatis.xml"/>
<!-- 自动扫描mapping.xml文件 -->
<!--<property name="mapperLocations" value="classpath:mapper/*.xml"></property>-->
</bean>
<!--sqlSession模板对象,sqlSession可以实现数据库连接以及包含所有执行SQL操作的方法-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="ssf" />
</bean>
3)mybatis.xml:mybatis配置文件
<?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>
<!--关联 mapping文件(ORM对象关系映射文件)路径配置 -->
<mappers>
<mapper resource="mapper/StaffMapper.xml" />
</mappers>
</configuration>
4)mapper.StaffMapper.xml配置文件
<?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">
<mapper namespace="com.st.dao.IStaffDao"><!--namespace属性关联dao层-->
<!--orm 对象和数据表之间的映射关系-->
<resultMap id="baseMap" type="com.st.model.Staff">
<!--
column 指定数据表字段
property 指定类属性
jdbcType 指定数据类型 int-INTEGER string-VARCHAR
-->
<result column="staff_id" property="staffId" jdbcType="INTEGER"/>
<result column="staff_name" property="staffName" jdbcType="VARCHAR"/>
<result column="staff_phone" property="staffPhone" jdbcType="VARCHAR"/>
</resultMap>
<!--
parameterType 参数类型
resultMap 结果集映射 对应的是resultMap.id
-->
<!--namespace属性关联dao层--><!--指定关联Dao层queryOne方法,参数为Integer类型-->
<select id="queryOne" parameterType="java.lang.Integer" resultMap="baseMap">
SELECT * FROM staff_info WHERE staff_id = #{staffId}
</select>
</mapper>
5)jdbc.properties配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=GMT%2B8&allowMultiQueries=true
username=root
password=123456
#初始化连接数
initialSize=0
maxActive=20
#最大空闲连接数
maxIdle=20
minIdle=1
#进行数据库连接的最长等待时间
maxWait=60000
6)model /dao /service /controller层
//Dao层实现:
@Repository
public class StaffDao implements IStaffDao {
@Autowired
private SqlSession sqlSession;
@Override
public Staff queryOne(Integer staffId) {//跟StaffMapper的select标签关联
/*selectOne(mapper.namespace,params)*/
/*sqlsession实例对象执行sql语句*/
return sqlSession.selectOne("com.st.dao.IStaffDao.queryOne",staffId);
}
}