1. Spring中配置数据库连接源的方式
Spring中万物皆bean,包括数据库资源。Spring数据库编程中,Spring为我们提供了简单易用的数据库连接接口,我们只要提供driverclassname、url、username、password即可帮我们返回一个连接对象,而不需要原生的JDBC连接那么繁琐。
Spring中将数据源转化成bean的方式有:
- 使用Spring自带的DriverManagerDataSource进行简单数据库资源配置。该类位于 Spring 的org.springframework.jdbc.datasource 类包。这是标准 JDBC 数据源的一个简单实现类,它用于开发简单的应用和程序测试,并且不支持连接池,每次连接数据库都是创建新的连接对象。
- 使用第三方数据库连接池进行数据库资源配置,比较主流的连接池有DBCP、C3P0、DRUID。
这里分别举例用DriverManagerDataSource与DRUID的连接案例,其他的连接池大同小异,除了C3P0需要注意以下,它的数据源配置的属性名除了password全和其他的不一样。
- DriverManagerDataSource数据源配置
- pom.xml中需要用到下面的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--spring的数据库连接源-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
- 在Spring配置文件中配置连接源,需要注意MySQL8中一定要有标明时区,& 在xml中是& 来表达。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
- 打印输出,测试是否连接成功
- DRUID连接池
- 导入依赖,在前面的3个基础上,再加多一个
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
- 在applicationContext.xml中配置Druid连接信息
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
- 测试结果
二. Spring中进行数据库操作
在本篇文章中,只作Spring整合mybatis框架的数据库操作。关于Spring中的JdbcTemplate由于实际业务上使用得较少,仅作了解即可,有兴趣的同学可以另行找资料学习。
Spring整合Mybatis所必须要用到的依赖主要有以下几个,缺一不可
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--spring的数据库连接源-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
其中mybatis-spring就是spring与mybatis框架的整合包,让spring框架替我们生成SqlSessionFactory对象,而不用我们自己去写。
展示案例:数据库中有一个简单的account表,对account表完成增删改查操作。各层次的类创建不作详细讲解,主要讲解spring中是如何与mybatis整合起来的。
- 在pojo包中建立起与数据库对应的持久化类
public class Account {
private int id;
private String name;
private double money;
public int getId() {
return id;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
public void setId(int 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;
}
}
- mapper层
public interface AccountMapper {
@Select("select * from account")
List<Account> select();
@Insert("insert into account values(#{id},#{name},#{money})")
void add(Account account);
@Delete("delete from account where id=#{id}")
void delete(int id);
@Update("update account set name=#{name},money=#{money} where id=#{id}")
void update(Account account);
}
- service层
public interface AccountService {
List<Account> select();
void add(Account account);
void delete(int id);
void update(Account account);
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
AccountMapper accountMapper;
@Override
public List<Account> select() {
return accountMapper.select();
}
@Override
public void add(Account account) {
accountMapper.add(account);
}
@Override
public void delete(int id) {
accountMapper.delete(id);
}
@Override
public void update(Account account) {
accountMapper.update(account);
}
}
- 关键的Spring配置文件applicationContext.xml(重点)
首先,创建数据库连接对象
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
第二布,让Spring替我们产生SqlSessionFactory对象
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource2"/>
</bean>
第三步,mybatis自动替我们产生mapper映射对象,怎么注入到spring中的bean里?直接用mapper接口的话会报错。因为spring中的bean要求一定要是类,不能是接口,而在使用mybatis时,我们的mapper只是个接口。这时候,我们要使用mybatis的mapper工厂,将我们需要的mapper接口交给工厂,让工厂帮我们产生对应的实现类,再放入到spring中的bean里。
<!--方式一:用工厂模式将AccountMapper注入到spring中的bean-->
<bean id="accountMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.example.mapper.AccountMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
这种方式,当我们真正开发项目的时候,会有大量的Mapper接口,如果我们要一个个地配置,就算是复制粘贴,也十分繁琐。这时候就要使用,mybatis的包扫描器来自动完成了。只要指定mapper所在的包,就可以对该包中的所有mapper完成扫描自动产生mapper接口的实现类,非常方便。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
还有另外一种方式,同样是包扫描的方式,但是看起来简洁一点,不过要事先导入mybatis命名空间,图中画框的就是声明该命名空间可用。
<!--方式三:导入mybatis命名空间,本质上与方式二是一样的,都是扫描包路径,只是这样看起来高大上点-->
<mybatis-spring:scan base-package="com.example.mapper"/>
最后还有spring自身注解用的包扫描配置
<context:component-scan base-package="com.example"/>
测试结果
测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class MyTest {
@Autowired
DataSource dataSource2;
@Test
public void test1(){
System.out.println(dataSource2);
}
@Autowired
AccountService accountService;
@Test
public void testSelect() {
List<Account> accounts = accountService.select();
for (Account account : accounts) {
System.out.println(account);
}
}
@Test
public void testadd() {
Account account = new Account();
account.setId(15);
account.setName("tomy");
account.setMoney(9999999999.0);
accountService.add(account);
testSelect();
}
@Test
public void testUpdate() {
Account account = new Account();
account.setId(15);
account.setName("tomy");
account.setMoney(8888888888888.0);
accountService.update(account);
testSelect();
}
@Test
public void testDelete() {
accountService.delete(15);
accountService.select();
}
}
运行通过
总结
spring整合mybatis是ssm框架中非常重要的一步,需要多加练习,牢牢巩固。在掌握spring整合mybatis框架后,可进一步学习spring的事件处理。