1.使用properties注入数据
1、配置pom.xml文件,导入必要的依赖。注意一个Spring容器里面只能有一个id为dataSource的连接池
<?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>org.example</groupId>
<artifactId>SpringDay2</artifactId>
<version>1.0-SNAPSHOT</version>
<name>SpringDay2</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- Spring的主要依赖,负责bean的管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<!-- 数据库连接池和SQL查询优化工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!-- 连接MySQL的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!-- 数据池管理的一种依赖 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- Spring里面连接数据库的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!-- MyBatis里面连接Spring的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!--MyBatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--JDBC API 进行了封装,降低 JDBC API 的使用难度-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!--将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
</project>
2、写BookDao类
package org.example.dao;
public class BookDao {
public String name;
public BookDao() {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void save() {
System.out.println("book dao save..." + name);
}
}
3、配置applicationContext.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:property-placeholder location="jdbc.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource">
<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>
<bean id="bookdao" class="org.example.dao.BookDao">
<property name="name" value="${jdbc.username}"/>
</bean>
</beans>
4、配置jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1
jdbc.username=root
jdbc.password=jia
5、编写一个测试类App,证明可以注入数据BookDao里面的name
package org.example;
import org.example.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = ctx.getBean(BookDao.class);
bookDao.save();
}
}
6、测试运行结果
2.纯注解开发
1、了解以下注解: @component(@Repository,@service,@Controller):在类命前面写入,表示这个类是一个组件,它允许将类实例化为Spring容器中的Bean,并纳入其管理。 @Configuration:相当于告诉Spring这是一个配置类 @ComponentScan("{1,2,3}"):相当于告诉这个配置类,那个包里面有需要的组件 2、设置一个配置类文件SpringConfig.java 在类名之前加入@Configuration表示这是一个配置类文件 再加入@ComponentScan("org.example")表示<bean>对象所在的位置 ——至此就可以删除applicationContext.xml文件,或者给他改个后缀
package org.example.Config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@ComponentScan({"org.example.Config","org.example.dao","org.example.service"})
@PropertySource("jdbc.properties")
public class SpringConfig {
}
3、在变成<bean>的类(BookDao2和BookService)前面加上@component(@Repository,@service,@Controller)
package org.example.dao;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao2 {
public void save(){
System.out.println("book dao save...");
}
}
package org.example.service;
import org.springframework.stereotype.Service;
@Service
public class BookService {
public void save(){
System.out.println("book service save...");
}
}
4、重新创建一个测试类App2(注意要写main方法,又找了10分钟错!),注意区别和App里面的ctx
package org.example;
import org.example.Config.SpringConfig;
import org.example.dao.BookDao2;
import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App2 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao2 bookDao2 = ctx.getBean(BookDao2.class);
System.out.println(bookDao2);
System.out.println("-------------------------------------------");
BookService bookService = ctx.getBean(BookService.class);
System.out.println(bookService);
}
}
3.纯注解开发的依赖注入
1、了解一下
@Autowired:他会自动注入引用类型的属性,一般类命就是id
2、在BookService类里面写入@Autowired,默认按类型注入
package org.example.service;
import org.example.dao.BookDao2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@Autowired
BookDao2 bookDao2;
public void save(){
System.out.println("book service save...");
bookDao2.save();
}
}
3、在BookDao类里面写入@Value("${jdbc.username}")注入简单类型引用
package org.example.dao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao {
@Value("${jdbc.username}")
public String name;
public BookDao() {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void save() {
System.out.println("book dao save..." + name);
}
}
4、重新创建一个测试类App3
package org.example;
import org.example.Config.SpringConfig;
import org.example.dao.BookDao;
import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App3 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
bookDao.save();
BookService bookService = ctx.getBean(BookService.class);
bookService.save();
}
}
4.第三方Bean的开发管理、注入资源
1、了解一下 @Import({1,2,3}):简单来说就是不能把所有的config文件都放在SpringConfig这个文件里面,那么就要将其他的Config文件使用这个注解引入(例如,@Import({jdbcConfig.class})就是引入jdbc的配置文件) @Bean:前面的注解都是用在类上面的,然后将当前类通过无参构造函数创建对象然后放入容器,而@Bean是用在方法上,将当前方法的返回值对象放到容器当中! 2、设置一个jdbcConfig.class的文件,并在SpringConfig文件里面使用@Import(jdbcConfig.class)导入进去,也可以使用@ComponentScan只要扫描到就可以
package org.example.Config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class jdbcConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/db1")
private String url;
@Value("root")
private String usernm;
@Value("jia")
private String passwd;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(usernm);
dataSource.setPassword(passwd);
return dataSource;
}
}
package org.example.Config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
@Configuration
@ComponentScan({"org.example.Config","org.example.dao","org.example.service"})
@Import({jdbcConfig.class,MyBatisConfig.class})
@PropertySource("jdbc.properties")
public class SpringConfig {
}
3、下面会具体的使用,所以这里没有编写测试用例
5.注解开发的总结
6.重头戏:Spring整合MyBaties
1、准备底层代码dao和service
package org.example.domain;
import java.io.Serializable;
public class Account implements Serializable {
private Integer id;
private String name;
private Double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
package org.example.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.example.domain.Account;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface AccountDao {
@Insert("insert into tb_account(name,money)values(#{name},#{money})")
void save(Account account);
@Delete("delete from tb_account where id = #{id} ")
void delete(Integer id);
@Update("update tb_account set name = #{name} , money = #{money} where id = #{id} ")
void update(Account account);
@Select("select * from tb_account")
List<Account> findAll();
@Select("select * from tb_account where id = #{id} ")
Account findById(Integer id);
}
package org.example.service;
import org.example.dao.AccountDao;
import org.example.domain.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AccountService{
@Autowired
private AccountDao accountDao;
public void save(Account account) {
accountDao.save(account);
}
public void update(Account account){
accountDao.update(account);
}
public void delete(Integer id) {
accountDao.delete(id);
}
public Account findById(Integer id) {
return accountDao.findById(id);
}
public List<Account> findAll() {
return accountDao.findAll();
}
}
2、导入Spring整合MyBaties的依赖
前面已经导入了pom.xml
3、创建jdbcConfig配置DataSource数据源(注意使用那个数据库)
package org.example.Config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class jdbcConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String usernm;
@Value("jia")
private String passwd;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(usernm);
dataSource.setPassword(passwd);
return dataSource;
}
}
4、创建MyBatiesConfig整合MyBaties
package org.example.Config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MyBatisConfig {
//定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("org.example.domain");
ssfb.setDataSource(dataSource);
return ssfb;
}
//定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("org.example.dao");
return msc;
}
}
5、配置SpringConfig主配置类
前面已经完成
6、定义测试类
package org.example;
import org.example.Config.SpringConfig;
import org.example.domain.Account;
import org.example.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class app4 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService accountService = ctx.getBean(AccountService.class);
Account ac = accountService.findById(1);
System.out.println(ac);
}
}
7、执行结果