SSM进阶(五)Spring整合Mybatis

Spring整合Mybatis

----------Mapper代理整合

上篇文章,就nameSpace+id得绝对定位Sql得形式,对Spring,mybatis这两个框架进行了整合,因为要定位过没有自动生成Dao层;

      再本节中,就第二种方案,mapper代理方式来整合。

为什么要一步一步来,因为如果一次性带自动挡,很多底层的东西没有了解,理解起来就不是那么容易了。所以才有了前几篇博文。

同样和之前一样我们需要得包主要由:Spring得核心包,mybatis,log4j,mysql,还有就是自动生成额插件generatorConfig.xml以及自动生成插件得plugin,好了有了这些我们就来开始,全自动得整和;
同样第一步:
1.     创建Maven项目,导入依赖,加入日志插件,以及自动生成得插件,然后再项目右侧得窗口中找到generator点击运行,生成UserMapper(相当于Dao接口,但是它没有实现类),UserMapper.xml映射文件,POJO实体类,以及ExampleL类。因为生成了相当于UserDao得UserMapper,所以我们不需要再去开发Dao层;直接去配置;
2.     同样和昨天一样,我们先出去Service与AOP编程
1)首先,配置数据源:
我们用到得类是BasicDataSource
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
配置url地址
       <property name="url" value="jdbc:mysql://localhost:3306/user?characterEncoding=utf-8"></property>
创建驱动
       <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
设置用户名
       <property name="username" value="root"></property>
设置密码
       <property name="password" value="root2"></property>
   </bean>
2)我们来和上节一样来创建SqlSessionFactory工厂
用到得类就是SqlSessionFactoryBean,代码如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="com/qf/mapper/*Mapper.xml"></property>
</bean>
同样做了两件事情,关联之前创建得数据源,然后继承Mapper.xml得注册,以为项目当中往往会有不止一个这样得文件,所以我们加前缀*来代表所有这个格式得文件。
 
 3)我们来创建UserMapper对象
因为UserMapper没有实现类我们不能像之前那样再去船舰对象,那么用什么方法呢?
我们使用得就是扫描得方式,通过扫描Dao接口,生成它的代理类对象,具体代码如下:
<!-- 扫描Dao接口 生成它的代理类随想-->
<bean id="UserMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
注明扫描包得位置:
    <property name="basePackage" value="com.qf.dao"></property>
</bean>
3.     接下来我们编写Service层及其实现类;
但在这之前,指的注意得是应该先开发一个dto层,这样会为后面整合SpringMVC做准备,到时候会好理解一点;
同样,在Service层我们党所参数传递得对象是Userdto(现在可以将其理解为web层传过来得数据),所以在Service得方法内部我们需要将dto转化为User类型,这里转化得方式由两种,上篇博文提及过,分别是
      方法设置值
      使用BeanUtils.copyPropertise(源对象,目标对象),
             就是将源对像中的数据拷贝到目标对象,
             但是使用得前提就是二者得类型要一致,否则就用SET方法;
在这里基本得增删改查得代码,基本以上篇博文一致,所以在这里不多赘述。
在这里我们介绍一下,新生成得UserExample类得用法,它是怎么结合UserMapper对象来使用得,我们在ServiceImpl当中写一个模糊查询得方法,具体代码如下:
首先模糊查询得返回时是一个UserDto类的得集合,因为数据不仅要向下传递而且也要向上返回,所以同样在这个方法中我们要做得一件事情就是,将模糊查询得到得结果(user),在转换为dto以便向上返回。接下来我们来看代码“:
public List<UserDto> findAllByname(String name) {
1)首先我们需要创建一个UserEmple得对象
    userExample example=new userExample();
 
 
2)得到criteria对象
因为在这个类当中有一个createCriteria()得方法,我们可以得到criteria对象,那么这个对象得作用是什么,作用就是以方法得方式来拼接Sql语句,从而得到想要得结果:
    userExample.Criteria criteria=example.createCriteria();
 
3)我们来创建一个user得LIST集合用来接受,查询得到得集合
    List<user> list=new ArrayList<>();
 
4)拼接sql语句
第四我们就用之前得到得对象,使用方法拼接sql语句,这里表示得语句的意思就是查询username中包含name这个参数得所有实体:当然在Example中还有许多类似得方法比如:andIdGreaterThan(Long value) 表示比这个参数大的

andIdLessThan(Long value) 表示比这个参数小得

andIdNotIn(List<Long> values)表示不再这个集合当中的等等。

有很多四百多行的代码,所以基本上不需要我们什么事情了,我们要做的就是调用,这就是为什么之前的学习中,小编也是自己敲代码,以为越到后面,愈加的自动化,了解一下底层原理还是好的。

这里我们使用的就好模糊岔村就是username包含name参数的:
    criteria.andUsernameLike("%"+name+"%");
 
5)根据拼接后的SQL语句进行查询
之后我们用注入的对象来调用持久层的方法对数据库进行操作:
将之前修改的example当作参数传入,从而根据UserMapper.xml当中的selectByExample方法来根据拼接后的SQL语句进行查询:
    list = userMapper1.selectByExample(example)
 
6创建一个UserDTO类型的集合
在创建一个UserDTO类型的集合用来存储我们拷贝之后的dto对象:
   List<UserDto> list1 = new ArrayList<UserDto>();
 
7)在接下来,就是转换了,这儿采用增强for循环来遍历转换
    for (user user : list) {
        UserDto dto = new UserDto();
        BeanUtils.copyProperties(user,dto);
        list1.add(dto);
    }
 
8)最后我们来返回这个集合
    return list1;
}
这样模糊查询的方法就写完了。
 
 
4.     最后的配置Aop编程
 
用过之前的学习,我们就会由一个疑问,UserMapper没有实现类。我们用的是代理类对象,那么我们怎么在service层将这个对象属性的值注入呢?
很简单两个注解搞定:
1)首先我们应该为ServiceImpl加上注解@Service(“UserService”),
括号内的参数可以不写,但是小编个人意见初学者写上便于理解:
这就表示这是服务层
2)给对象加注解
我们在这个实现类中的,对象属性上面加上@Autowire
意思就是自动类型注入,就是当你为这个包开扫描后,会自动匹配以之像匹配类型的值注入,想必看过之前博文的读者知道,在之前的对象属性注入的时候还有一个注解就是@Qulafire():
这个是通过括号内的参数名找到你在配置文件中创建的对象的id类注入,但在此处我们因为会开启注解扫描这个包,而且代理类意见创建好了,所以我们写一个即可。
5.     接下来我们来进行配置
 
1) 开启注解扫描
首先我们应该对Service层所在的包开启注解扫描,用来生成Userservice对象的生成和UserMappper对象属性的注入:代码如下:
<context:component-scan base-package="com.www.service"></context:component-scan>
 
2)我们应该声明一个事务管理对象
之前都是单独创建通知等公共事务类,由于过程繁琐,所以在这之后我们都用事务关联对象类统一管理,既然配置了就可以使用,我们为什么不用呢?
其实用到的就是DataSourceTransectionManager这个类即可,这个类中同样由DataSource,需要数据源,所以我们也要为其关联数据源,代码如下:
 
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
关联数据源:
    <property name="dataSource" ref="dataSource"></property>

</bean>
 
3)定义事务通知切面
也即是确定我们创建的事务是具体关联到那些方法上的,直接看代码:
首先定义的时候我们就要关联之前的事务管理对像,让该事务管理对象会更具下面具体的声明将具体的事务关联到需要事务的方法上面。
<tx:advice id="advice" transaction-manager="TransactionManager">
    <tx:attributes>
 
表示以ADD开头的方法都需要事务,REQUIRED表示要求;
        <tx:method name="add*" propagation="REQUIRED"/>
 
表示以del开头的方法都需要事务,REQUIRED表示要求;
        <tx:method name="del*" propagation="REQUIRED"/>
 
表示以update开头的方法都需要事务,REQUIRED表示要求;
 <tx:method name="update*" propagation="REQUIRED"/>
 
表示以find开头的方法都需要事务是只读,即不需事务
        <tx:method name="find*" read-only="true"></tx:method>
    </tx:attributes>
</tx:advice>
 
4)定义切入点意见形成切面
 
 
<aop:config>
首先定义切入点表达式:
    <aop:pointcut id="mypoint" expression="execution(* com.qf.service.*.*(..))"></aop:pointcut>
在就是将之前定义的事务以切入点关联形成切面
    <aop:advisor advice-ref="advice" pointcut-ref="mypoint"></aop:advisor>
</aop:config>
 
 
6.     测试

最后我们就对值前编写的哪个模糊查询的方法进行测试,代码如下:

@Test
public void find(){
    ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService=(UserService)context.getBean("UserService");
    List<UserDto> list=userService. findAllByname (“傅”);
    for (UserDto dto : list) {
        System.out.println(dto.getUsername()+"--"+dto.getPassword());
    }
    context.close();
}

综上就是今天的Mapper代理的整合。

之后小编会介绍web层框架springmvc,然后将三者整个,从而形成异常初级框架SSM,敬请期待!!!!!

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值