Spring第1天+mybatis注解:

来源:互联网 发布:湖南卫视知乎 编辑:程序博客网 时间:2024/04/28 01:54

mybatis注解:

使用mybatis注解开发,可以省去类配置文件,简洁方便。但是比较复杂的SQL和动态SQL还是建议书写类配置文件。


<!-- 定义接口,在接口方法中直接书写SQL -->
public interface IUserDao {
  @Insert("insert into t_user(userName,classId) values(#{userName},#{classId})")
public void add(UserBean bean) throws Exception;
    @Delete("delete from t_user where id=#{id}")
public void del(int id) throws Exception;

在mybatis基本配置文件mybatis.cfg.xml中加入对接口的引用
<mappers>
<!--配置ORM映射接口,使用注解配置-->
<mapper class="com.lovo.dao.IUserDao"/>
</mappers>


//读文件 
String resource = "mybatis.cfg.xml";
Reader reader = null;
try {
reader =  Resources.getResourceAsReader(resource);
} catch (IOException e1) {e1.printStackTrace();}
//创建会话工厂
         SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
//创建会话
session = ssf.openSession();
//得到接口对象
       IUserDao dao = session.getMapper(IUserDao.class);
//直接调用业务方法即可完成业务逻辑
dao.insert(new UserBean("ff",9,"tt"));

mybatis和spring整合(注解方式):
编写注解方式的DAO接口
package com.lovo.dao;
public interface IManDao {
@Insert("insert into t_man(manName,birthday) values(#{manName},#{birthday})")
public void add(ManBean bean)throws Exception;
@Select("select * from t_man")
public List<ManBean> findAll()throws Exception;
}


自动扫描指定包中的接口
 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
      <property name="basePackage" value="com.lovo.dao" />
   </bean> 
   
自动扫描指定包中类的注解
<context:component-scan base-package="com.lovo.service.impl"></context:component-scan>

@Transactional(readOnly=true) 配置只读事务
public  class ManServiceImpl extends SqlSessionDaoSupport implements IManService {
@Autowired 自动装配
private IManDao dao;
@Transactional(readOnly=false,rollbackFor=Exception.class)   配置回滚事务
public void add(ManBean bean) throws Exception {
this.dao.add(bean);
}
}

使用Spring有什么好处:

1.Spring能有效地组织中间层对象。

2.Spring能消除在许多工程中常见的对Singleton的过多使用。

3.Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化。

4.Spring能够帮助我们真正意义上实现针对接口编程。
5. 在Spring应用中的大多数业务对象没有依赖于Spring。
6.使用Spring构建的应用程序易于单元测试。
7.Spring支持JDBC和O/R Mapping产品(Hibernate)
8.MVC Web框架,提供一种清晰,无侵略性的MVC实现方式。
9.JNDI抽象层,便于改变实现细节,可以方便地在远程服务和本地服务间切换。
10.简化访问数据库时的例外处理。
11.Spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理。
12. 提供了JavaMail或其他邮件系统的支持。

Spring的IoC /DI
IoC(Inversion of Control) /DI(Dependecy Injection 依赖注入),
  作用: 主要是协调各组件间相互的依赖关系,同时大大提高了组件的可移植性 
传统的实现情况
用new关键字来完成关系的组合(组件之间耦合 )
IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理,控制程序间关系的实现交给了外部的容器来完成 
(由容器在运行期将组件间的某种依赖关系动态的注入组件中)


IoC的实现类型(1)
类型1: 接口注入 通常做法是利用接口将调用者与实现者分离。
public class ClassA { 
   private InterfaceB clzB; 
   public doSomething() { 
      Ojbect obj = 
Class.forName(Config.BImplementation).newInstance(); 
      clzB = (InterfaceB)obj; 
      clzB.doIt() 
    } 
}
ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在 代码中创建InterfaceB实现类
的实例,并将其赋予clzB。 而这样一来,ClassA在编译期即依赖于InterfaceB的实现。 
上面的代码实现了将调用者与实现者在编译期分离 
类型1: 接口注入 通常做法是利用接口将调用者与实现者分离。


Spring 框架的 IOC 容器采用类型 2 和类型3 实现。
其使得软件组件松散连接成为可能 

IoC的实现类型(2)
设值注入 在类中暴露setter方法来实现依赖关系。 
程序代码
public class Sport {
  private InterfaceBall ball;
  public void setBall(InterfaceBall arg) {
     ball = arg;
 }
}
这种方式对已经习惯了JavaBean的程序员而言,更显直观。Spring就是实现了该类型的轻量级容器。


类型2 设值注入的优势
1. 对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直观,更加自然。
2. 如果依赖关系(或继承关系)较为复杂,那么类型3模式的构造函数也会相当庞大(我们需要在构造函数中设定所有依赖关系),
此时类型2模式往往更为简洁。
3. 对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如Struts 中的Action),
此时类型3类型的依赖注入机制就体现出其局限性,难以完成我们期望的功 能。


IoC的实现类型(3)
构造子注入 即通过构造方法完成依赖关系。
public class DIByConstructor {
private final DataSource dataSource;
private final String message;
public DIByConstructor(DataSource ds, String msg) {
this.dataSource = ds;
this.message = msg;
}
……
}


类型3 构造子注入的优势:
1. 避免了繁琐的setter方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读。
2. 由于没有setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于 相对“不变”的稳定状态,
无需担心上层代码在调用过程中执行setter方法对组件依赖关系 产生破坏,特别是对于Singleton模式的组件而言,
这可能对整个系统产生重大的影响。
3. 同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。 对调用者而言,
组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的 层次清晰性提供了保证。
4. 通过构造子注入,意味着我们可以在构造函数中决定依赖关系的注入顺序,对于一个大量 依赖外部服务的组件而言,依赖关系的获得顺序可能非常重要,比如某个依赖关系注入的 先决条件是组件的DataSource及相关资源已经被设定。

0 0