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.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>
  1. 在Spring配置文件中配置连接源,需要注意MySQL8中一定要有标明时区,& 在xml中是&amp; 来表达。
    <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&amp;characterEncoding=UTF-8&amp;serverTimezone=Hongkong"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
  1. 打印输出,测试是否连接成功
    在这里插入图片描述
  • DRUID连接池
  1. 导入依赖,在前面的3个基础上,再加多一个
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.4</version>
        </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&amp;characterEncoding=UTF-8&amp;serverTimezone=Hongkong"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
  1. 测试结果
    在这里插入图片描述

二. 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整合起来的。
  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&amp;characterEncoding=UTF-8&amp;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的事件处理。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值