Spring+JdbcTemplate+mybatis

Spring+JdbcTemplate

1.dao组件继承org.springframework.jdbc.core.support.JdbcDaoSupport
applicationContext.xml文件中配置

    <util:properties id = "jdbcProperties" location = "classpath:db.properties"></util:properties>

    <bean id = "myDataSource2" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close">
        <property name="driverClassName" value ="#{jdbcProperties.driver}"></property>
        <property name="url" value="#{jdbcProperties.url}"></property>
        <property name="username" value="#{jdbcProperties.user}"></property>
        <property name="password" value="#{jdbcProperties.pwd}"></property>
    </bean>

    <bean id = "empDao01" class = "hateapple.dao.EmpDao01">
        <property name="dataSource" ref = "myDataSource2"></property>
    </bean>

empDao01通过setter注入dataSource,set方法继承自JdbcDaoSupport,且不能被覆盖重写

//set方法签名
public final void setDataSource(DataSource dataSource)

其实就是注入的dataSource被父类JdbcDaoSupport拿去初始化自己的成员变量jdbcTemplate了,empDao01想要使用jdbcTemplate只能通过getJdbcTemplate。

2.不继承
org.springframework.jdbc.core.support.JdbcDaoSupport,为empDao02注入jdbcTemplate,empDao02通过jdbcTemplate操作数据库;
applicationContext.xml文件配置

    <bean id = "myDataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close">
        <property name="driverClassName" value ="oracle.jdbc.driver.OracleDriver"></property>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
        <property name="username" value="em"></property>
        <property name="password" value="em"></property>
    </bean>

    <bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref = "myDataSource"></property>
    </bean>
    <bean id = "empDao02" class = "hateapple.dao.EmpDao02">
        <property name="jdbcTemplate" ref = "jdbcTemplate"></property>
    </bean>

对比两种方式,第一种是把钥匙交给门卫用的时候向门卫拿,第二种自己带身上。

Spring+myBatis

1.spring整合mybatis 的核心是 SqlSessionFactoryBean、MapperFactoryBean(单一接口)

org.mybatis.spring.SqlSessionFactoryBean包含了dataSource(数据源)、mapperLocations(接口的mapper映射文件路径);

org.mybatis.spring.mapper.MapperFactoryBean包含了sqlSessionFactory(上面的bean),mapperInterface(接口的完整名称);
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref = "myDataSource"></property>
        <!-- 加载多个可以改为*.xml -->
        <property name="mapperLocations" value = "classpath:hateapple/mapper/StudentMapperMyBatis.xml"></property>
</bean>

<!-- hateapple.dao.BaseDao是包含了一个findAll()方法的接口 -->
<bean id="studentMapper" class= "org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="hateapple.dao.BaseDao"></property>
        <property name="sqlSessionFactory" ref ="sqlSessionFactory"></property>
</bean>

测试代码

        @Test
        public void testMybatis(){
            String conf = "applicationContext.xml";
            ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(conf);
            BaseDao baseDao = (BaseDao)ac.getBean("studentMapper");
            List<Student> studentList = baseDao.findAll();
            for (Student  student : studentList) {
                System.out.println(student.getName());
            }
如果需要多个org.mybatis.spring.mapper.MapperFactoryBean,一个一个配置肯定不现实

2. MapperScannerConfigurer批量扫描接口,并为每个接口生成一个 MapperFactoryBean的实例

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描的接口的包 -->
        <property name="basePackage" value ="hateapple.dao"></property>
        <!-- 会话工厂 -->
        <property name="sqlSessionFactory" ref ="sqlSessionFactory"></property>
        <!-- 自定义注解,只有被自定义的注解标记的接口才会被扫描 -->
        <property name="annotationClass" value="hateapple.annotation.MyMapperAnnotation"></property>
</bean>

MyMapperAnnotation .java

public @interface MyMapperAnnotation {

}

BaseDao.java

@MyMapperAnnotation
public interface BaseDao {
    public List<Student> findAll();
}

测试代码:

        @Test
        public void testMybatis(){
            String conf = "applicationContext.xml";
            ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(conf);
            BaseDao baseDao = (BaseDao)ac.getBean("baseDao");
            List<Student> studentList = baseDao.findAll();
            for (Student  student : studentList) {
                System.out.println(student.getName());
            }

spring+SqlSessionTemplate

其实org.mybatis.spring.mapper.MapperFactoryBean就是封装了一个SqlSessionTemplate操作数据库,我们调用baseDao.findAll()最终的操作还是sqlSessionTemplate.selectList(“findAll”)

1.直接为操作数据库类注入sqlSessionTemplate

<bean id ="sqlSessionTemplate" class = "org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index = "0" ref="sqlSessionFactory"></constructor-arg>
</bean>
    //sqlSessionTemplate是被注入进来的
    @Override
    public List<Student> findAll() {
        List<Student> studentList = sqlSessionTemplate.selectList("findAll");
        for (Student student : studentList) {
            System.out.println(student.getName());
        }
        return studentList;
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值