Spring数据库的编程(spring整合mybatis)

1. Spring中配置数据库连接源的方式

Spring中万物皆bean,包括数据库资源。Spring数据库编程中,Spring为我们提供了简单易用的数据库连接接口,我们只要提供driverclassname、url、username、password即可帮我们返回一个连接对象,而不需要原生的JDBC连接那么繁琐。

Spring中将数据源转化成bean的方式有:

  1. 使用Spring自带的DriverManagerDataSource进行简单数据库资源配置。该类位于 Spring 的org.springframework.jdbc.datasource 类包。这是标准 JDBC 数据源的一个简单实现类,它用于开发简单的应用和程序测试,并且不支持连接池,每次连接数据库都是创建新的连接对象。
  2. 使用第三方数据库连接池进行数据库资源配置,比较主流的连接池有DBCP、C3P0、DRUID。

这里分别举例用DriverManagerDataSource与DRUID的连接案例,其他的连接池大同小异,除了C3P0需要注意以下,它的数据源配置的属性名除了password全和其他的不一样。

  • DriverManagerDataSource数据源配置
  1. pom.xml中需要用到下面的依赖
    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>
 
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.22version>
        dependency>
    dependencies>
  1. 在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>
  1. 打印输出,测试是否连接成功
    在这里插入图片描述
  • DRUID连接池
  1. 导入依赖,在前面的3个基础上,再加多一个
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.2.4version>
        dependency>
  1. 在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>
  1. 测试结果
    Spring数据库的编程(spring整合mybatis)_第1张图片

二. Spring中进行数据库操作

在本篇文章中,只作Spring整合mybatis框架的数据库操作。关于Spring中的JdbcTemplate由于实际业务上使用得较少,仅作了解即可,有兴趣的同学可以另行找资料学习。

Spring整合Mybatis所必须要用到的依赖主要有以下几个,缺一不可
    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.0.5.RELEASEversion>
        dependency>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.22version>
        dependency>

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.2.4version>
        dependency>

        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.6version>
        dependency>

        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatis-springartifactId>
            <version>2.0.6version>
        dependency>
   dependencies>

其中mybatis-spring就是spring与mybatis框架的整合包,让spring框架替我们生成SqlSessionFactory对象,而不用我们自己去写。

展示案例:数据库中有一个简单的account表,对account表完成增删改查操作。各层次的类创建不作详细讲解,主要讲解spring中是如何与mybatis整合起来的。

  1. 在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;
    }
}
  1. 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);
}
  1. 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);
    }
}

  1. 关键的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里。

    
    <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命名空间,图中画框的就是声明该命名空间可用。
Spring数据库的编程(spring整合mybatis)_第2张图片

    
    <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数据库的编程(spring整合mybatis)_第3张图片

总结

spring整合mybatis是ssm框架中非常重要的一步,需要多加练习,牢牢巩固。在掌握spring整合mybatis框架后,可进一步学习spring的事件处理。

你可能感兴趣的:(Java,EE学习,Spring学习笔记,mybatis,spring,java,ssm,spring+mybatis)