ctrl+shift+t搜索类
ctrl+o查看所有的属性和方法
ctrl+t查看继承体系
jar包版本需要一致#MyBatis和Spring整合
在配置文件中 不要写空格 空格也会被解析
JavaSE基础内容
Java语法阶段
- Java是什么,HelloWorld
- 程序是来源于并超脱于现实生活的,它其实是用来帮助我们处理数据。(CRUD),变量它是我们程序在处理数据时最基础的最单一的一种方式。数据类型、运算符。
- 选择结构 键盘录入
- 循环结构
- 循环进阶(多重循环和断点调试)
- 数组
Java面向对象阶段
- 类和对象(我们以后编写程序 要尽可能学会进行封装)
- 封装、继承和多态
- 抽象和接口
- 异常
Java高级特性
- 集合(高级存储方式)
- 实用类
- IO流
- 多线程
- 网络编程
- XML
数据库阶段
- MySQL
- Java和数据连接 JDBC
- DAO模式
前端阶段:三剑客 HTML5 CSS3 JS
JavaWeb阶段:
- 服务器
- 动态页面技术 JSP
- 第三方组件
- 分页实现
- 分层架构
- EL和JSTL
- Servlet
- 过滤器 监听器
- Ajax
- Linux
Java框架阶段:SSM框架
- MyBatis 简化DAO层实现
- Spring 使用IoC和AOP简化我们对象的生命周期管理和冗余功能的解耦
1. 理解整合的原理
Mybatis和Spring整合
思路
sqlSessionFactory sqlsession 数据源都交给Spring来管理
数据源交给Spring管理(采用第三方连接池DBCP)
BasicDataSource driverClassName+url+username+password
SqlSessionFactory交给Spring管理
SqlSessionFactoryBean dataSource+typeAliasesPackage+mapperLocations(引入sql映射文件)
1、传统方式的整合
dao层的实现类中 extends SqlSessionDaoSupport类
<!--配置dao -->
<bean id="userdao" class="cn.dao.UserDaoImpl">
配置属性sqlSessionFactory
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userDao" ref="userdao"></property>
</bean>
2、接口方式的整合
可以不需要配置mapperLocations属性
<!-- Mapper扫描器 可以帮你自动生成上方的MapperBean对象 它生成的MapperBean会自动以对应的接口的小驼峰来命名bean的id -->
<!-- Mapper接口和XML必须同名同包 否则扫描失败 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口扫描位置 -->
<property name="basePackage" value="cn.kgc.smbms.mapperdao"></property>
<!-- 不需要注入SqlSessionFactory对象了 它是默认按照类型查找 -->
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>
2. 掌握MyBatis和Spring的整合
**整合思路:**SqlSessionFactory对象 由Spring IoC来帮你创建、SqlSession对象由IoC来帮你创建。
-
数据源交给Spring来管理 因为SqlSessionFactory对象的获取需要读取配置文件
<!--环境配置-->
<environments default="development">
<environment id="development">
<!-- 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据源连接池配置 采用的是mybatis内置的连接池 其实还可以采用别的连接池-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入sql映射文件 -->
<mappers>
<package name="cn.kgc.dao"/>
</mappers>
-
SqlSessionFactory交给Spring来管理
**整合步骤:**整合完以后 有两种方式可以获取到sqlSession传统的 还有接口 见2.1 2.1
-
导包:导入MyBatis(+数据驱动包)和Spring的相关包以及MyBatis提供的整合包
.jar mybatis-spring 从github上进行下载;spring-jdbc ; spring-tx事务
导包的时候出来 yesToAll 表示覆盖
-
编写MyBatis和Spring的核心配置文件 以及其他的一些日志等配置文件
-
将MyBatis环境准备好(POJO、Mapper文件等)
-
在Spring中配置数据源(采用DBCP连接池 导jar包 commons-dbcp,commons-pool);jdbc操作数据的时候采用tomcat内置的,mybatis采用mybatis内置的
dbcp给我们提供的BasicDataSource-org.apache.commons.dbcp实现了javax.sql.DataSource
复制全类名
(一个数据源不可能平白无故给你创建出来,还需要设置属性)
property name="" 里面的内容就是属性 不是随便起的
class value写了鼠标是可以点过去的
-
在Spring中配置SqlSessionFactory(采用整合包中的SqlSessionFactoryBean)
<!-- 数据源交给Spring管理(采用第三方连接池DBCP) -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///smbms"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactory交给Spring管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.kgc.smbms.pojo"/>
<!-- 引入Sql映射文件 引入的是xml -->
<property name="mapperLocations">
<array>
<value>cn/kgc/smbms/dao/UserMapper.xml</value>
<!--可以写多个value-->
</array>
</property>
<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> -->
</bean>
(以上用的都是设置注入 需要有set方法)
//上面弄完以后 就可以获取到sqlSessionFactory
public static void main(String[] args) {
ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
SqlSessionFactory sqlSessionFactory = ca.getBean(SqlSessionFactory.class);
System.out.println(sqlSessionFactory);
}
额外配置的写法
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///smbms"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactory交给Spring管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
</beans>
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>
<package name="cn.pojo" />
</typeAliases>
<!-- 引入映射文件 路径是可以点过去的 -->
<mappers>
<package name="cn.dao"/>
</mappers>
</configuration>
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
测试方法同上
2.1 传统方式的整合[了解,它和Hibernate与Spring整合思路基本一致]
读取配置文件 获取sqlSessionFactory对象
sqlSessionFactory接口 ,实现类SqlSessionFactoryBean
属性1、typeAliases : Class<?>[] 不推荐 建议使用typeAliasesPackage : String 类型别名
2、 mapperLocations : Resource[]
3、 DataSource datasource
4、 configLocation 引入额外的配置 一般有这个 就不要前面的两个了
DataSource 接口,实现类BasicDataSource 属性 driverClassName,url,username,password
1、传统方式的整合
sqlSession接口 ,实现类SqlSessionTemplate 属性 构造方法sqlSessionFactory
或
SqlSessionDaoSupport 属性 sqlSessionFactory
最开始的方法1:
有的时候 不要看见接口 看见对应的xml文件 就是接口方式开发 这里采用的是传统方式开发
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 数据源交给Spring管理(采用第三方连接池DBCP) -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///smbms"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactory交给Spring管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.kgc.smbms.pojo"/>
<!-- 引入Sql映射文件 -->
<property name="mapperLocations">
<array>
<value>cn/kgc/smbms/dao/UserMapper.xml</value>
</array>
</property>
<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> -->
</bean>
<!-- SqlSession交给Spring管理 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"></constructor-arg>
</bean>
<!--配置dao -->
<bean id="userdao" class="cn.dao.UserDaoImpl">
<property name="sqlSessionTemplate" ref="sqlSession"></property>
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userDao" ref="userdao"></property>
</bean>
</beans>
UserMapper.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">
<!-- namespace:用于在内存中区分具体SQL映射文件的 -->
<mapper namespace="userMapper">
<select id="getUserList" resultType="cn.pojo.User">
select
*
from
smbms_user
</select>
</mapper>
ca.getBean()这个方法从spring容器中获取xx对象
有的时候报错可能不是配置文件的错 是这个方法的错
规范写法
UserService userService = ca.getBean("userService",UserService.class);
我要是写一个RolrServiceImpl 也implements UserService 上面方法就比较规范
最开始的方法2:
在上面基础上进行修改
准备dao接口+实现类,实现类中继承SqlSessionDaoSupport this.SqlSession.xxx方法执行sql语句
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
public List<User> getUserList()throws Exception {
return this.getSqlSession().selectList("usermapper.getUserList");
}
}
配置文件只需要改变他们
<!-- SqlSession交给Spring管理 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"></constructor-arg>
</bean>
<!--配置dao -->
<bean id="userdao" class="cn.dao.UserDaoImpl">
<property name="sqlSessionTemplate" ref="sqlSession"></property>
</bean>
<!-- 配置service -->
<bean id="userServivce" class="cn.service.UserServiceImpl">
<property name="userDao" ref="userdao"></property>
</bean>
改成:
<!--配置dao -->
<bean id="userdao" class="cn.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userDao" ref="userdao"></property>
</bean>
2.2 接口方式的整合[掌握]
读取配置文件 获取sqlSessionFactory对象
sqlSessionFactory接口 ,实现类SqlSessionFactoryBean
属性typeAliases : Class<?>[] 不推荐 建议使用typeAliasesPackage : String 类型别名
mapperLocations : Resource[]
DataSource datasource
configLocation 引入额外的配置 一般有这个 就不要前面的两个了
DataSource 接口,实现类BasicDataSource 属性 driverClassName,url,username,password
2、接口方式开发
MapperFactoryBean---->产生对应接口 属性mapperInterface+sqlSessionFactory 只会生成一个接口
或
MapperScannerConfigurer---->产生对应接口 属性basePackage
生成多个
接口开发 方法1:
public interface UserMapper {
List<User> getUserList()throws Exception;
}
User.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">
<!-- namespace:用于在内存中区分具体SQL映射文件的 -->
<mapper namespace="cn.dao.UserMapper">
<select id="getUserList" resultType="cn.pojo.User">
select
*
from
smbms_user
</select>
</mapper>
sqlSession.getMapper(接口.class);
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 数据源交给Spring管理(采用第三方连接池DBCP) -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///smbms"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactory交给Spring管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.kgc.smbms.pojo"/>
<!-- 引入Sql映射文件 -->
<property name="mapperLocations">
<array>
<value>cn/kgc/smbms/dao/UserMapper.xml</value>
</array>
</property>
<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> -->
</bean>
<!--配置dao -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 指定好接口全类名 -->
<property name="mapperInterface" value="cn.dao.UserMapper"></property>
<!--因为MapperFactoryBean 继承了SqlSessionDaoSupport类 所以可以采用下方注入 -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>
</beans>
测试:
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationCOntext.xml");
UserMapper userMapper = ca.getBean(UserMapper.class);
List<User> list = userMapper.getList();
for (User user : list) {
System.out.println(user);
}
}
未来如果还有其他mapper 那么用起来就不方便了 下面是改进也就是下面的接口开发2 取代了<!--配置dao -->的过程+ <!-- 引入Sql映射文件 -->的过程
<!-- Mapper扫描器 可以帮你自动生成上方的MapperBean对象 它生成的MapperBean会自动以对应的接口的小驼峰来命名bean的id -->
<!-- Mapper接口和XML必须同名同包 否则扫描失败 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口扫描位置 -->
<property name="basePackage" value="cn.kgc.smbms.mapperdao"></property>
<!-- 不需要注入SqlSessionFactory对象了 它是默认按照类型查找 -->
</bean>
接口开发 方法2:
Mapper接口的配置替代掉了以前的DAO。(MapperFactoryBean)
但是一个个的接口配置非常麻烦,所以可以使用扫描(MapperScannerConfigurer)。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 数据源交给Spring管理(采用第三方连接池DBCP) -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc-mysql"/>
</bean>
<!-- SqlSessionFactory交给Spring管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.kgc.smbms.pojo"/>
<!-- 引入Sql映射文件 -->
<property name="mapperLocations">
<array>
<value>cn/kgc/smbms/dao/UserMapper.xml</value>
</array>
</property>
<!-- 如果你的一些额外配置 不想通过Spring来注入 还是希望采用MyBatis核心配置文件 -->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> -->
</bean>
<!-- Mapper扫描器 可以帮你自动生成上方的MapperBean对象 它生成的MapperBean会自动以对应的接口的小驼峰来命名bean的id -->
<!-- Mapper接口和XML必须同名同包 否则扫描失败 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口扫描位置 -->
<property name="basePackage" value="cn.kgc.smbms.mapperdao"></property>
<!-- 不需要注入SqlSessionFactory对象了 它是默认按照类型查找 -->
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>
</beans>
##############################################################
db.properties
# MySQL Config
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql:///smbms
mysql.username=root
mysql.password=root
整合的时候可以这样写·
<!-- 引入外部的数据源文件 需要一个声明在开头 spring-context.xsd-->
<context:property-placeholder location="classpath:db.properties"/>
<!--1.将数据源交给spring进行管理 采用dbcp连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</bean>
3. 掌握声明式事务的使用(AOP)
aop主要功能
日志记录,性能统计,安全控制,事务处理,异常处理等等。
AOP动态的织入一些功能 而不影响你现在的代码
事务是写在业务逻辑层的service
出现异常以后 会报错 但是他还会提交成功,这就需要事务
会报错 但是不会提交成功
声明式事务需要一个额外的命名空间tx
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 声明式事务的规则配置 -->
<!-- transaction-manager的具体位置 上面的id值不用写 在配置他的会自动出来 -->
<tx:advice id="tx-advice" transaction-manager="transactionManager">
<tx:attributes>
<!--
下方的规则表示 如果查找到add系列的方法 则开启事务管理...
如果查找到get系列的方法 则不开启事务管理
而如果查找到的方法不符合这些系列 则默认开始事务管理
-->
<tx:method name="add*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<!-- 查询方法不需要事务管理 -->
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置AOP -->
<aop:config>
<aop:pointcut expression="execution(* cn.service..*.*(..))" id="txPointCut"/>
<!-- 引用事务通知 -->
<aop:advisor advice-ref="tx-advice" pointcut-ref="txPointCut"/>
</aop:config>
<!-- ++++++++++++++++++以上为新增内容+++++++++++++++++++++++++++++++++++++++ -->
<!-- 0.实现数据源信息外部引入 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 1.将数据源交给Spring来管理 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 2.SqlSessionFactory对象的创建交给Spring来管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.pojo"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 会自动扫描dao包和子包下的同名同包绑定的接口和XML 用于产生Mapper接口对象 -->
<property name="basePackage" value="cn.dao"/>
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>
</beans>
声明式事务还可以使用注解方式
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- 实现数据源信息外部引入 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 1.将数据源交给Spring来管理 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 2.SqlSessionFactory对象的创建交给Spring来管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.pojo"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 会自动扫描dao包和子包下的同名同包绑定的接口和XML 用于产生Mapper接口对象 -->
<property name="basePackage" value="cn.dao"/>
</bean>
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- 启用IOC注解扫描 -->
<context:component-scan base-package="cn.service"></context:component-scan>
<!-- 声明式事务 -->
<!-- 1.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 启用注解annotaiton式声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
有了ioc注解以后 这个代码就不需要写了,此外采用注解方式,事务还要加上transaction注解 有的时候配置文件会因为位置问题报错
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
//如果未来都是事务 可以统一把他加到类上面
@Transactional
@Override
public boolean addUser(User user) throws Exception {
int row = userMapper.add(user);
//int i = 1 / 0;
return row > 0;
}
//写了注解以后set就不需要了
/*public UserMapper getUserMapper() {
return userMapper;
}
@Transactional(readOnly=true)
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
*/
}
4. Spring的扩展
ctrl+t查看继承体系 如果所继承的父类里面没有对应的属性 可以去另外他的上面查找
<!-- 实现数据源信息外部引入1 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties"></property>
</bean>
<!-- 实现数据源信息外部引入2 -->
<context:property-placeholder location="classpath:db.properties"/>
4.1 JNDI数据源配置
JNDI(Java Naming and Directory Interface) Java命名和目录接口
我们可以使用JNDI来实现对于资源的共享,之前我们学习JNDI就是为了使用Tomcat内置的连接池(DBCP)。
<Resource
name="jdbc-mysql"
type="javax.sql.DataSource"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql:///smbms?useUnicode=true&characterEncoding=utf-8"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000"/>
JndiObjectFactoryBean里面没有合适的属性 我们去他的父类里面找
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- JNDI实际上用的是里面tomcat jdbc的连接池 -->
<!-- 实现数据源信息外部引入 JNDI-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties"></property>
</bean>
<!-- 1.将数据源交给Spring来管理 java:comp/env/为固定前缀-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc-mysql"></property>
</bean>
<!-- 2.SqlSessionFactory对象的创建交给Spring来管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 类型别名 -->
<property name="typeAliasesPackage" value="cn.pojo"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 会自动扫描dao包和子包下的同名同包绑定的接口和XML 用于产生Mapper接口对象 -->
<property name="basePackage" value="cn.dao"/>
</bean>
<!-- 配置service -->
<bean id="userService" class="cn.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"></property>
</bean>
</beans>
**注意:**必须经由Tomcat服务器之后,Spring才可以使用到JNDI资源。测试的时候可以这样测试
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.pojo.User;
import cn.service.UserService;
@WebServlet(name = "jndi", urlPatterns = "/jndi")
public class JNDIServlet extends HttpServlet{
//localhost:8080/spring/jndi
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = ca.getBean("userService",UserService.class);
// UserService userService = ca.getBean(UserService.class);
try {
List<User> list = userService.getUserList();
System.out.println(list.get(0).getPhone());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
借助Tomcat
<Resource
name="jdbc-mysql"
type="javax.sql.DataSource"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql:///smbms?useUnicode=true&characterEncoding=utf-8"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000"/>
proxy代理
4.2 Spring的bean作用域
request线程级别的
红线圈住的仅适用于WebApplicationContext环境
// 如果想更改默认的bean作用域 就在对应的bean的配置上添加scope="prototype"
<bean id="userService" class="" scope="prototype"></bean>
注解表示多实例
@Service
@Scope("prototype")
public class UserServiceImpl impl....
4.3 Spring自动装配
我们以前纯XML形式开发,需要自行配置service、dao的bean组件,然后自己进行依赖注入,而现在如果采用了自动注入,那么你就不需要再去配置依赖注入了,只需要配置好bean组件即可。
自动注入有几种选项:
- byName 按照属性名称来自动注入信息
- byType 按照属性类型来自动注入信息
- constructor 构造自动注入
-
**注意:**如果开启了全局的自动注入,需要保证 那些不需要的bean要配置好非自动注入。
`在上述中
表示此xml文件中的所有bean元素 会采用自动注入
<beans default-autowire="default">
</beans>
针对别的 如果不用用自动注入 设置为no
<beans default-autowire="byName">
<bean id="" class="" autowire="no"/>
</beans>
4.4 Spring文件拆分(掌握)
我们在项目开发中,未来配置越来越多,有些时候如果所有的配置都放在一起,不方便我们进行维护,同样也不方便团队开发,所以当配置内容到达一定程度之后,我们可以对配置文件进行拆分。
事务是属于service层的
拆分1:按照分层架构拆分
- applicationContext-controller.xml
- applicationContext-service.xml
- applicationContext-dao.xml
- applicationContext-basic.xml
拆分2:按照模块拆分
- applicationContext-user.xml
- applicationContext-role.xml
- applicationContext-provider.xml
- applicationContext-basic.xml
未来如果ssm整合的时候,在web.xml中需要加载多个配置文件时,可以用applicationContext-*
拆分后,加载配置文件的策略:
方案一:拆分后获取多个配置文件(使用spring重载资源API 同时加载多个资源文件)可变参
方案二: 在某个配置文件中 引入其他的拆分后的配置,然后加载单一的配置文件即可
<import resource="applicationContext-dao.xml"/>
<import resource="applicationContext-service.xml"/>