pom.xml
<?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.zhang</groupId>
<artifactId>day37_spring_mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<!--版本锁定-->
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.5.3</mybatis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
spring.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.xsd
">
<!--
配置包扫描
-->
<context:component-scan base-package="com.angen"/>
<!--spring整合mybaties-->
<!--
1,配置jdbc环境
1,配置dataSource,可以配置spring自带的,也可以使用第三方的
2,配置事务管理者
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--配置简单类型-->
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test_mybatis?characterEncoding=utf-8&useSSL=false"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<!--
2,将SqlSessionFactory进行ioc放到spring核心容器
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入上面的dataSource数据源对象-->
<property name="dataSource" ref="dataSource"></property>
<!--加载mybatis主配置文件-->
<!--<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>-->
<!--别名包扫描 映射配置文件里面的resultType的别名,如果不配置就不能使用别名
<select id="findById" resultType="Member">
select * from dlq_member where id=#{id}
</select>
-->
<property name="typeAliasesPackage" value="com.angen.pojo"></property>
</bean>
<!--
3,扫描dao包,映射配置文件扫描器
-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--
注入要扫描的dao接口所在的包
-->
<property name="basePackage" value="com.angen.dao"></property>
</bean>
</beans>
然后就直接能使用了
@Test
public void method2(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
UserDao userDao = (UserDao) ac.getBean("userDao");
List<User> all = userDao.findAll();
for (User user : all) {
System.out.println(user);
}
}
使用配置类的方式,不是使用spring.xml的方式
/**
* @Configuration注解
* 代替spring的配置文件,作为spring入口
* @ComponentScan注解
* 包扫描,扫描IOC和DI的注解
*/
@Configuration
@ComponentScan(basePackages = "com.angen")
public class SpringConfig {
/**
* 配置文件的这段
* <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
* <!--配置简单类型-->
* <property name="username" value="root"></property>
* <property name="password" value="root"></property>
* <property name="url" value="jdbc:mysql://localhost:3306/test_mybatis?characterEncoding=utf-8&useSSL=false"></property>
* <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
* </bean>
* 将DriverManagerDataSource进行IOC
* 加上@Bean注解后
* 由spring进行IOC并且调用这个方法
*
*/
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setUrl("jdbc:mysql://localhost:3306/test_mybatis?characterEncoding=utf-8&useSSL=false");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
/**
* 2,将SqlSessionFactory进行ioc放到spring核心容器
* <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
* <property name="dataSource" ref="dataSource"></property>
* <property name="typeAliasesPackage" value="com.angen.pojo"></property>
* </bean>
* 参数DataSource dataSource是由于容器里面有dataSource所以可以传递参数
*/
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.angen.pojo");
return sqlSessionFactoryBean;
}
/**
* 3,扫描dao包,映射配置文件扫描器
* <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
* <property name="basePackage" value="com.angen.dao"></property>
* </bean>
*/
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.angen.dao");
return mapperScannerConfigurer;
}
}
测试
@Test
public void test2(){
//用纯注解配置,AnnotationConfigApplicationContext类加载配置
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
MemberController memberController = (MemberController)ac.getBean("memberController");
memberController.updataMemberUsername();
memberController.getMember();
memberController.insertMember();
memberController.deleteById();
}
上面配置文件有点冗余
然后把mybatis的配置提取出来
public class MybatisConfig {
/**
* 配置文件的这段
* <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
* <property name="username" value="root"></property>
* <property name="password" value="root"></property>
* <property name="url" value="jdbc:mysql://localhost:3306/test_mybatis?characterEncoding=utf-8&useSSL=false"></property>
* <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
* </bean>
* 将DriverManagerDataSource进行IOC
* 加上@Bean注解后
* 由spring进行IOC并且调用这个方法
*
*/
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setUrl("jdbc:mysql://localhost:3306/test_mybatis?characterEncoding=utf-8&useSSL=false");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
/**
* 2,将SqlSessionFactory进行ioc放到spring核心容器
* <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
* <property name="dataSource" ref="dataSource"></property>
* <property name="typeAliasesPackage" value="com.angen.pojo"></property>
* </bean>
* 参数DataSource dataSource是由于容器里面有dataSource所以可以传递参数
*/
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.angen.pojo");
return sqlSessionFactoryBean;
}
/**
* 3,扫描dao包,映射配置文件扫描器
* <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
* <property name="basePackage" value="com.angen.dao"></property>
* </bean>
*/
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.angen.dao");
return mapperScannerConfigurer;
}
}
通过注解
@Import(MybatisConfig.class)
导入到Spring配置类中
/**
* @Configuration注解
* 代替spring的配置文件,作为spring入口
* @ComponentScan注解
* 包扫描,扫描IOC和DI的注解
*/
@Configuration
@ComponentScan(basePackages = "com.angen")
@Import(MybatisConfig.class)
public class SpringConfig {
}
然后还是有点不完美,mybatis配置类中有很多硬编码,我们在创建一个mybatis.properties属性集文件
@Value给属性赋值有三种方式
1) @Value("xxx"),直接加上想要赋的值
2) @Value("#{}") ,也可以通过spring提供的SPEL表达式来赋值
3) @Value("${}"),也可以通过注解@PropertySource的方式将配置文件注入到运行环境中,然后通过${}的方式去获取
/**
* 使用@PropertySource注解引入外部的属性集文件
* 这里使用的@PropertySource(value = {"classpath:mybatis.properties"})
* 就相当于xml文件中使用的<context:property-placeholder location="classpath:mybatis.properties"/>。
*/
@PropertySource(value = {"classpath:mybatis.properties"})
public class MybatisConfig {
@Value("${mybatis.username}")
private String username;
@Value("${mybatis.password}")
private String password;
@Value("${mybatis.url}")
private String url;
@Value("${mybatis.driverClassName}")
private String driverClassName;
@Value("${mybatis.typeAliasesPackage}")
private String typeAliasesPackage;
@Value("${mybatis.basePackage}")
private String basePackage;
/**
* 配置文件的这段
* <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
* <property name="username" value="root"></property>
* <property name="password" value="root"></property>
* <property name="url" value="jdbc:mysql://localhost:3306/test_mybatis?characterEncoding=utf-8&useSSL=false"></property>
* <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
* </bean>
* 将DriverManagerDataSource进行IOC
* 加上@Bean注解后
* 由spring进行IOC并且调用这个方法
*
*/
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
/**
* 2,将SqlSessionFactory进行ioc放到spring核心容器
* <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
* <property name="dataSource" ref="dataSource"></property>
* <property name="typeAliasesPackage" value="com.angen.pojo"></property>
* </bean>
* 参数DataSource dataSource是由于容器里面有dataSource所以可以传递参数
*/
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);
return sqlSessionFactoryBean;
}
/**
* 3,扫描dao包,映射配置文件扫描器
* <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
* <property name="basePackage" value="com.angen.dao"></property>
* </bean>
*/
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage(basePackage);
return mapperScannerConfigurer;
}
}