8Spring+Struts2+MyBaits(Spring注解+jdbc属性文件+log4j属性文件)

Posted 红酒人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8Spring+Struts2+MyBaits(Spring注解+jdbc属性文件+log4j属性文件)相关的知识,希望对你有一定的参考价值。

一、注解理论

使用注解来构造IoC容器

用注解来向Spring容器注册Bean。需要在applicationContext.xml中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>

如:在base-package指明一个包

1 <context:component-scan base-package="cn.gacl.java"/>

表明cn.gacl.java包及其子包中,如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。也可以在<context:component-scan base-package=” ”/>中指定多个包,如:

1 <context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>

多个包逗号隔开。

1、@Component

@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。

2、@Controller

@Controller对应表现层的Bean,也就是Action,例如:

1 @Controller
2 @Scope("prototype")
3 public class UserAction extends BaseAction<User>{
4 ……
5 }

使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,Spring容器中会存在一个名字为"userAction"action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字

这里的UserAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免strutsAction的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Actionscope="prototype" 可以保证当有请求的时候都创建一个Action对象

3、@ Service

@Service对应的是业务层Bean,例如:

1 @Service("userService")
2 public class UserServiceImpl implements UserService {
3 ………
4 }

@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:

1 // 注入userService
2 @Resource(name = "userService")
3 private UserService userService;

注意:在Action声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入,由于Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = "userService",这就等于告诉Spring,说我Action要实例化一个“userService”,你Spring快点帮我实例化好,然后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。

4、@ Repository

@Repository对应数据访问层Bean ,例如:

1 @Repository(value="userDao")
2 public class UserDaoImpl extends BaseDaoImpl<User> {
3 ………
4 }

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。

1 // 注入userDao,从数据库中根据用户Id取出指定用户时需要用到
2 @Resource(name = "userDao")
3 private BaseDao<User> userDao;


 

二、通过注解配置bean

加上注解的类会被Spring容器管理

@Component

    标注于通用实体类

@Controller

    标注于Controller/Action

@Service

    标注于Service

@Respository

    标注于RespositoryImpl/DaoImlp

@Autowired

    依据类型自动装配

@Qualifier

    指定自动装载的bean的name

 

三、项目具体案例如下:

1、创建如下oracle数据库脚本userinfo.sql

 1 SQL> create table userinfo
 2 (id number(4),
 3 name varchar2(50),
 4 password varchar2(20
 5 telephone varchar2(15),
 6 isadmin varchar2(5));
 7 
 8 SQL> --4.2 用户表序列
 9 SQL> create sequence seq_userinfo;
10 
11 SQL> alter table userinfo add constraint pk_userinfo_id primary key(id);
12 
13 SQL> insert into userinfo values(seq_userinfo.nextval,\'holly\',\'123\',\'134518024
14 \',\'\');
15 
16 SQL> commit;
userinfo.sql

2、创建如下所示项目结构

3、在src下的com.entity包下创建UserInfo.java

 1 package com.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * 用户信息表
 7  * @author Holly老师
 8  *
 9  */
10 public class UserInfo implements Serializable {
11     private static final long serialVersionUID = 1L;
12     private Integer id; //编号
13     private String name; //姓名
14     private String password; //密码
15     private String telephone; //电话
16     private String isadmin; //是否是管理员
17     
18     public UserInfo() {
19     }
20 
21     public UserInfo(Integer id, String name, String password, String telephone,
22             String isadmin) {
23         this.id = id;
24         this.name = name;
25         this.password = password;
26         this.telephone = telephone;
27         this.isadmin = isadmin;
28     }
29 
30     public Integer getId() {
31         return id;
32     }
33 
34     public void setId(Integer id) {
35         this.id = id;
36     }
37 
38     public String getName() {
39         return name;
40     }
41 
42     public void setName(String name) {
43         this.name = name;
44     }
45 
46     public String getPassword() {
47         return password;
48     }
49 
50     public void setPassword(String password) {
51         this.password = password;
52     }
53 
54     public String getTelephone() {
55         return telephone;
56     }
57 
58     public void setTelephone(String telephone) {
59         this.telephone = telephone;
60     }
61 
62     public String getIsadmin() {
63         return isadmin;
64     }
65 
66     public void setIsadmin(String isadmin) {
67         this.isadmin = isadmin;
68     }
69     
70     
71     
72 
73 }
UserInfo.java

4、在src下的com.mapper包下创建UserInfoMapper.java

 1 package com.mapper;
 2 
 3 import java.util.List;
 4 
 5 import com.entity.UserInfo;
 6 /**
 7  * 数据访问层接口
 8  * @author Holly老师
 9  *
10  */
11 public interface UserInfoMapper {
12     /**
13      * 1.根据用户信息查询某个用户
14      * @param userinfo
15      * @return
16      */
17     UserInfo findNamePwd(UserInfo userinfo);
18     
19     /**
20      * 2.添加用户信息
21      * @param userinfo
22      */
23     void addUserInfo(UserInfo userinfo);
24     
25     /**
26      * 3.查询所有
27      * @return
28      */
29     List<UserInfo> findAll();
30     
31     /**
32      * 4.删除
33      * @param id
34      */
35     void deleteUser(int id);
36     /**
37      * 5.修改
38      * @param userinfo
39      */
40     void updateUser(UserInfo userinfo);
41     
42     /**
43      * 5.根据id查询
44      */
45     UserInfo findId(int id);
46 }
UserInfoMapper.java

5、在src下的com.mapper包下创建UserInfoMapper.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 3 <mapper namespace="com.mapper.UserInfoMapper">
 4   <!-- 根据用户查询用户 -->
 5   <select id="findNamePwd" parameterType="userinfo" resultType="userinfo">
 6     select * from userinfo where name=#{name} and password=#{password}
 7   </select>
 8   
 9   <!-- 插入用户信息 -->
10   <insert id="addUserInfo" parameterType="userinfo">
11      insert into userinfo values(seq_userinfo.nextval,#{name},#{password},#{telephone},#{isadmin})
12   </insert>
13   
14   <!-- 查询所有 -->
15   <select id="findAll" resultType="userinfo">
16     select * from userinfo
17   </select>
18   
19    <!-- 删除 -->
20    <delete id="deleteUser" parameterType="int">
21      delete from userinfo where id=#{id}
22    </delete>
23    
24    <!-- 修改 -->
25    <update id="updateUser" parameterType="userinfo">
26      update userinfo set name=#{name},password=#{password},telephone=#{telephone},isadmin=#{isadmin} where id=#{id}
27    </update>
28    
29    <!-- 根据id查询 -->
30    <select id="findId" parameterType="int" resultType="userinfo">
31     select * from userinfo where id=#{id}
32    </select>
33   
34 </mapper>
UserInfoMapper.xml

6、在src下创建mybatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
 3 <configuration>
 4  <!-- 定义别名 -->
 5  <typeAliases>
 6    <typeAlias type="com.entity.UserInfo" alias="userinfo"/>
 7  </typeAliases>
 8  <!-- 注册xml -->
 9  <mappers>
10    <mapper resource="com/mapper/UserInfoMapper.xml"/>
11  </mappers>
12 </configuration>
mybatis-config.xml

7、在src下的com.mapper.impl包下创建UserInfoMapperImpl.java

  1 package com.mapper.impl;
  2 
  3 import java.util.List;
  4 
  5 import org.mybatis.spring.SqlSessionTemplate;
  6 import org.springframework.beans.factory.annotation.Autowired;
  7 import org.springframework.stereotype.Repository;
  8 
  9 import com.entity.UserInfo;
 10 import com.mapper.UserInfoMapper;
 11 /**
 12  * 数据访问层实现类
 13  * @author Holly老师
 14  */
 15 /*@Repository表示标注dao类,相当于dao的bean
 16  * 或者写@Component(dao)等同于<bean id="dao" class="com.dao.impl.UserInfoDaoImpl"/>
 17  */
 18 @Repository 
 19 public class UserInfoMapperImpl implements UserInfoMapper {
 20     /*采用注解方式注入sqlSessionTemplate对象
 21      * Autowired表示按类型自动装配方式*/
 22      @Autowired  
 23     SqlSessionTemplate sqlSessionTemplate;
 24     
 25     public SqlSessionTemplate getSqlSessionTemplate() {
 26         return sqlSessionTemplate;
 27     }
 28     public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
 29         this.sqlSessionTemplate = sqlSessionTemplate;
 30     }
 31     
 32     /**
 33      * 1.根据用户信息查询用户
 34      * 用代理方式
 35      */
 36     public UserInfo findNamePwd(UserInfo userinfo) {
 37         
 38         //2.通过反射生成动态代理对象
 39         UserInfoMapper dao=sqlSessionTemplate.getMapper(UserInfoMapper.class);
 40         
 41         //3.代理对象调用接口里 的方法
 42         UserInfo user=dao.findNamePwd(userinfo);
 43         
 44         //5.数据判断
 45         if(user!=null){
 46             System.out.println("登录成功");
 47             return user;
 48         }else{
 49             System.out.println("登录失败");
 50             return null;
 51         }
 52     }
 53     /**
 54      *2. 添加操作用无代理方式
 55      */
 56     public void addUserInfo(UserInfo userinfo) {
 57         
 58         //2.session执行插入操作,第一个参数映射文件namespace+id.第二个参数,插入对象
 59         String key="com.mapper.UserInfoMapper.addUserInfo";
 60         int number=sqlSessionTemplate.insert(key, userinfo);
 61         if(number>0){
 62             System.out.println("注册成功");
 63         }else{
 64             System.out.println("注册失败");
 65         }
 66     }
 67     /**
 68      * 3.查询所有
 69      */
 70     public List<UserInfo> findAll() {
 71         
 72         //2.session执行插入操作,第一个参数映射文件namespace+id.第二个参数,插入对象
 73         String key="com.mapper.UserInfoMapper.findAll";
 74         List<UserInfo> list =sqlSessionTemplate.selectList(key);
 75         if(list!=null){
 76             System.out.println("查询所有成功");
 77         }else{
 78             System.out.println("查询所有失败");
 79         }
 80         return list;
 81     }
 82     /**
 83      * 4.根据id删除
 84      */
 85     public void deleteUser(int id) {
 86         UserInfoMapper dao=sqlSessionTemplate.getMapper(UserInfoMapper.class);
 87         try {
 88             dao.deleteUser(id);
 89             System.out.println("删除成功");
 90         } catch (Exception e) {
 91             System.out.println("删除失败");
 92             e.printStackTrace();
 93         }
 94         
 95     }
 96     /**
 97      * 5.根据id查询某个对象
 98      */
 99     public UserInfo findId(int id) {
100         
101         //2.通过反射生成动态代理对象
102         UserInfoMapper dao=sqlSessionTemplate.getMapper(UserInfoMapper.class);
103         
104         //3.代理对象调用接口里 的方法
105         UserInfo user=dao.findId(id);
106         
107         //5.数据判断
108         if(user!=null){
109             System.out.println("登录成功");
110             return user;
111         }else{
112             System.out.println("登录失败");
113             return null;
114         }
115     }
116     /**
117      * 6.修改对象
118      */
119     public void updateUser(UserInfo userinfo) {
120         UserInfoMapper dao=sqlSessionTemplate.getMapper(UserInfoMapper.class);
121         try {
122             dao.updateUser(userinfo);
123             System.out.println("修改成功");
124         } catch (Exception e) {
125             System.out.println("修改失败");
126             e.printStackTrace();
127         }
128         
129     }
130     
131     
132     
133 
134 }
UserInfoMapperImpl.java

8、在src下的com.servicel包下创建UserInfoService.java

 1 package com.service;
 2 
 3 import java.util.List;
 4 
 5 import com.entity.UserInfo;
 6 /**
 7  * 服务层接口
 8  * @author Holly老师
 9  *
10  */
11 public interface UserInfoService {
12     /**
13      *1. 登录
14      * @param userinfo
3.struts2访问Servlet API,并和mybaits实现全套增删改查

mybaits和spring整合后pojo扫描怎么配置

01_Mybaits逆向工程maven版

myBaits持久性框架

springmvc + spring + mybaits 整合

8Spring 源码学习 ~ 自定义标签的解析