SSM-mybatis-spring容器 复杂和简化方法

回顾
-------------
    1、JVM
        runtime data area.
        a.method area
            方法区,永久区,metaspace , 共享
        b.heap
            堆区,共享
            heap    = young代 + old代理
            young    = 伊甸区 + 幸存区
            幸存区    = 幸存一区(from) + 幸存二区(to),内存碎片整理
            所有对象诞生于伊甸区。

            heap            //堆
            non-heap        //非堆 , metaspace
            off-heap        //离堆 , os - jvm
                            //ByteBuffer.allocateDirect(1024) ; cleaner
            -Xms            //堆初始值
            -Xmx            //堆最大值
            -Xmn            //年轻代大小
            -XX:NewSize
            -XX:MaxNewSize
            -XX:NewRatio        //年老代是年轻代的倍数
            -XX:SurvivorRatio    //伊甸区是单个幸存区的倍数
            -Xloggc:<file>        //

        c.java stack
            线程,StackFrame(method frame) , push | pop
            死递归 ,
            -Xss1m

        d.native method stack
        e.program couter register

        System.gc()
        没有任何指针能够直接或间接到达他。

        jvisualvm
        jconsole
        jmap

    2、ClassLoader
        类加载器,将类型映射到路径,加载对应字节码文件到内存的方法区。
        三级类加载机制,Bootstrap(核心类) -> ExtClassLoader(jre\ext\xxx.jar) -> AppClassLoader
        extends ClassLoader{
            findClass(){
                defineClass(byte[] .. ) ;
            }
        }

    2、mybatis
        sql映射,oop方式访问jdbc。

实现mybatis的一对多关联关系
---------------------------
    1、修改Customer.class,增加集合属性
        class Customer{
            ...
            private List<Order> orders = new ArrayList<Order>();
            //get/set
        }
    2、修改CustomerMapper.xml
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="customers">
            <insert id="insert">
              insert into customers(name, age) values(#{name} , #{age})
            </insert>

            <update id="update">
                update customers set name = #{name} , age = #{age} where id = #{id}
            </update>

            <delete id="deleteOne">
                delete from customers where id = #{id}
            </delete>

            <delete id="deleteAll">
                delete from customers
            </delete>

            <select id="selectOne" resultMap="rmCustomer">
                SELECT
                  c.id cid ,
                  c.name cname ,
                  c.age cage ,
                  o.id oid ,
                  o.orderno oorderno,
                  o.price oprice,
                  o.cid ocid
                FROM
                  customes c left outer join orders o
                ON
                  c.id = o.cid
                WHERE
                  c.id = #{id}
            </select>
            <select id="selectAll" resultType="_Customer">
                select * from customers
            </select>

            <resultMap id="rmCustomer" type="_Customer">
                <id column="cid" property="id" />
                <result column="cname" property="name" />
                <result column="cage" property="age" />
                <collection property="orders" ofType="_Order" column="ocid">
                    <id column="oid" property="id" />
                    <result column="oorderno" property="orderNo" />
                    <result column="oprice" property="price"/>
                </collection>
            </resultMap>
        </mapper>
    3、测试
        @Test
        public void testSelectOne() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;
            Customer c = s.selectOne("customers.selectOne" , 6) ;
            s.commit();
            s.close();
        }
    4、

自关联
-----------------
    树形图 :
    全国
       |---河北省
                 |---保定
                 |---张家口
       |---河南省
               |--驻马店
               |---开封

    1.设计表
        create table areas(id int primary key auto_increment , areaname varchar(20) , pid int) ;

    2.创建Area类
        public class Area {
            private Integer id ;
            private String areaName ;
            private Area parentArea ;
            //get/set
        }
    3.映射文件
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="areas">
            <insert id="insert" useGeneratedKeys="true" keyProperty="id">
              insert into areas(areaname , pid) values(#{areaName} , #{parentArea.id})
            </insert>
        </mapper>

    4.配置文件
        <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration
                PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
            <properties>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/big10"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </properties>

            <!-- 定义类型别名 -->
            <typeAliases>
                <typeAlias type="com.oldboy.mybatis.domain.Customer" alias="_Customer" />
                <typeAlias type="com.oldboy.mybatis.domain.Order" alias="_Order" />
                <typeAlias type="com.oldboy.mybatis.domain.Area" alias="_Area" />
            </typeAliases>

            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC"/>
                    <dataSource type="POOLED">
                        <property name="driver" value="${driver}"/>
                        <property name="url" value="${url}"/>
                        <property name="username" value="${username}"/>
                        <property name="password" value="${password}"/>
                    </dataSource>
                </environment>
            </environments>
            <mappers>
                <mapper resource="CustomerMapper.xml"/>
                <mapper resource="OrderMapper.xml"/>
                <mapper resource="AreaMapper.xml"/>
            </mappers>
        </configuration>

    5.插入
        @Test
        public void testInsert() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;

            Area a1 = new Area("quanguo") ;
            Area a2 = new Area("hebeisheng" , a1) ;
            Area a3 = new Area("henansheng", a1) ;
            Area a4 = new Area("baoding",a2) ;
            Area a5 = new Area("zhangjiakou", a2) ;
            Area a6 = new Area("zhumadian", a3) ;
            Area a7 = new Area("kaifeng", a3) ;
            s.insert("areas.insert" , a1);
            s.insert("areas.insert" , a2);
            s.insert("areas.insert" , a3);
            s.insert("areas.insert" , a4);
            s.insert("areas.insert" , a5);
            s.insert("areas.insert" , a6);
            s.insert("areas.insert" , a7);
            s.commit();
            s.close();
        }

实现自关联查询
------------------
    1.查询自己和上级的信息
        select
            s.id sid,
            s.areaname sname ,
            p.id pid ,
            p.areaname pname
        from
            areas s left outer join areas p on s.pid = p.id  ;

    2.编写AreaMapper.xml
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="areas">
            <insert id="insert" useGeneratedKeys="true" keyProperty="id">
              insert into areas(areaname , pid) values(#{areaName} , #{parentArea.id})
            </insert>

            <select id="selectOne" resultMap="rmArea">
                select
                    s.id sid,
                    s.areaname sname ,
                    p.id pid ,
                    p.areaname pname
                from
                    areas s left outer join areas p on s.pid = p.id
                WHERE
                    s.id = #{id}
            </select>
            <resultMap id="rmArea" type="_Area">
                <id column="sid" property="id" />
                <result column="sname" property="areaName" />
                <association property="parentArea" column="pid" javaType="_Area">
                    <id column="pid" property="id" />
                    <result column="pname" property="areaName"/>
                </association>
            </resultMap>
        </mapper>

    3.实现查询
        @Test
        public void testSelectOne() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;
            Area a1 = s.selectOne("areas.selectOne" , 2) ;

            s.commit();
            s.close();
        }

实现自关联的下级查询
----------------------
    1.增加Area的集合属性
        public class Area {
            ...
            //所辖区域集合
            private List<Area> children ;
            //get/set
        }
    2.映射文件
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="areas">
            <insert id="insert" useGeneratedKeys="true" keyProperty="id">
              insert into areas(areaname , pid) values(#{areaName} , #{parentArea.id})
            </insert>

            <select id="selectOne" resultMap="rmArea">
                select
                    p.id pid,
                    p.areaname pname ,
                    s.id sid ,
                    s.areaname sname ,
                    c.id cid ,
                    c.areaname cname
                from
                    areas s
                    left outer join areas p on s.pid = p.id
                    left outer join areas c on c.pid = s.id
                where
                    s.id = #{id}
            </select>
            <select id="selectAll" resultMap="rmArea">
                select
                    p.id pid,
                    p.areaname pname ,
                    s.id sid ,
                    s.areaname sname ,
                    c.id cid ,
                    c.areaname cname
                from
                    areas s
                    left outer join areas p on s.pid = p.id
                    left outer join areas c on c.pid = s.id
            </select>
            <resultMap id="rmArea" type="_Area">
                <id column="sid" property="id" />
                <result column="sname" property="areaName" />
                <association property="parentArea" column="pid" javaType="_Area">
                    <id column="pid" property="id" />
                    <result column="pname" property="areaName"/>
                </association>
                <collection property="children" column="sid" ofType="_Area">
                    <id column="cid" property="id"/>
                    <result column="cname" property="areaName"/>
                </collection>
            </resultMap>
        </mapper>
    3.
        public void testSelectOne() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;
            Area a1 = s.selectOne("areas.selectOne" , 2) ;

            s.commit();
            s.close();
        }

        @Test
        public void testSelectAll() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;
            List<Area> list = s.selectList("areas.selectAll" ) ;

            s.commit();
            s.close();
        }

 一对一关系
 ---------------
    1.创建husband,wife表。
        [主键关联]
        原理是一张表的主键和另外外一张表相一致。
        create table husbands(id int primary key auto_increment , hname varchar(20)) ;
        create table wifes(id int primary key auto_increment , wname varchar(20)) ;

        [外键关联]
        原理等同于多对一关联关系。

    2.创建类
        //丈夫类
        public class Husband {
            private Integer id ;
            private String hname ;
            //一对一关联关系
            private Wife wife ;
        }

        //妻子类
        public class Wife {
            private Integer id ;
            private String wname ;

            //双向一对一关联
            private Husband husband ;
            ...
        }
    3.映射文件
        [丈夫]
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="husbands">
            <insert id="insert" useGeneratedKeys="true" keyProperty="id">
              insert into husbands(hname) values(#{hname})
            </insert>

            <select id="selectOne" resultMap="rmHusband">
              select
                h.id hid ,
                h.hname hname ,
                w.wname wname
              FROM
                husbands h left outer join wifes w on h.id = w.id
              where
                h.id = #{id}
            </select>

            <resultMap id="rmHusband" type="_Husband">
                <id column="hid" property="id" />
                <result column="hname" property="hname" />
                <association property="wife" column="hid" javaType="_Wife">
                    <result column="wname" property="wname" />
                    <association property="husband" column="hid" javaType="_Husband">
                        <id column="hid" property="id"/>
                        <result column="hname" property="hname"/>
                    </association>
                </association>
            </resultMap>
        </mapper>

        [妻子]
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="wifes">
            <insert id="insert">
              insert into wifes(id , wname) values(#{husband.id} , #{wname})
            </insert>

        </mapper>
    4.配置文件
        <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration
                PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
            <properties>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/big10"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </properties>

            <!-- 定义类型别名 -->
            <typeAliases>
                <typeAlias type="com.oldboy.mybatis.domain.Customer" alias="_Customer" />
                <typeAlias type="com.oldboy.mybatis.domain.Order" alias="_Order" />
                <typeAlias type="com.oldboy.mybatis.domain.Area" alias="_Area" />
                <typeAlias type="com.oldboy.mybatis.domain.Husband" alias="_Husband" />
                <typeAlias type="com.oldboy.mybatis.domain.Wife" alias="_Wife" />
            </typeAliases>

            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC"/>
                    <dataSource type="POOLED">
                        <property name="driver" value="${driver}"/>
                        <property name="url" value="${url}"/>
                        <property name="username" value="${username}"/>
                        <property name="password" value="${password}"/>
                    </dataSource>
                </environment>
            </environments>
            <mappers>
                <mapper resource="CustomerMapper.xml"/>
                <mapper resource="OrderMapper.xml"/>
                <mapper resource="AreaMapper.xml"/>
                <mapper resource="HusbandMapper.xml"/>
                <mapper resource="WifeMapper.xml"/>
            </mappers>
        </configuration>

    5.测试
        @Test
        public void testInsert() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;
            Husband h = new Husband();
            h.setHname("huangxiaoming");

            Wife w = new Wife();
            w.setHusband(h);
            w.setWname("ab");

            s.insert("husbands.insert" , h) ;
            s.insert("wifes.insert" , w) ;
            s.commit();
            s.close();
        }

        @Test
        public void testSelectOne() throws Exception {
            InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
            SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
            SqlSession s = f.openSession() ;
            Husband h = s.selectOne("husbands.selectOne",1);
            s.commit();
            s.close();
        }

多对多关系
-----------------
    1.创建表
        create table teas(id int primary key auto_increment , tno varchar(20)) ;
        create table stus(id int primary key auto_increment , sno varchar(20)) ;
        create table links(tid int , sid int) ;
    2.创建类
        [Tea]
        /**
         * 教师类
         */
        public class Tea {
            private Integer id ;
            private String tno ;

            private List<Stu> stus = new ArrayList<Stu>();

        }
        [Stu]
        /**
         * 学生类
         */
        public class Stu {
            private Integer id ;
            private String sno ;

            private List<Tea> teas = new ArrayList<Tea>();
        }

    3.映射文件
        [TeaMapper.xml]
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="teas">
            <insert id="insert" useGeneratedKeys="true" keyProperty="id">
              insert into teas(tno) values(#{tno})
            </insert>
            <insert id="insertLinks">
              <foreach collection="stus" item="s">
                insert into links(tid,sid) values(#{id} , #{s.id});
              </foreach>
            </insert>

            <select id="selectOne" resultMap="rmTea">
                select
                    t.id tid ,
                    t.tno tno ,
                    s.id sid ,
                    s.sno sno
                from
                    teas t
                    left outer join links l on l.tid = t.id
                    left outer join stus s  on s.id = l.sid
                where
                    t.id = #{id}
            </select>
            <resultMap id="rmTea" type="_Tea">
                <id column="tid" property="id"/>
                <result column="tno" property="tno" />
                <collection property="stus" ofType="_Stu" column="tid">
                    <id column="sid" property="id" />
                    <result column="sno" property="sno" />
                </collection>
            </resultMap>
        </mapper>

        [StuMapper.xml]
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="stus">
            <insert id="insert" useGeneratedKeys="true" keyProperty="id">
              insert into stus(sno) values(#{sno})
            </insert>
        </mapper>
    4.修改配置文件,添加执行多条语句支持
        <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration
                PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
            <properties>
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/big10?allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </properties>

            <!-- 定义类型别名 -->
            <typeAliases>
                <typeAlias type="com.oldboy.mybatis.domain.Customer" alias="_Customer" />
                <typeAlias type="com.oldboy.mybatis.domain.Order" alias="_Order" />
                <typeAlias type="com.oldboy.mybatis.domain.Area" alias="_Area" />
                <typeAlias type="com.oldboy.mybatis.domain.Husband" alias="_Husband" />
                <typeAlias type="com.oldboy.mybatis.domain.Wife" alias="_Wife" />
                <typeAlias type="com.oldboy.mybatis.domain.Tea" alias="_Tea" />
                <typeAlias type="com.oldboy.mybatis.domain.Stu" alias="_Stu" />
            </typeAliases>

            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC"/>
                    <dataSource type="POOLED">
                        <property name="driver" value="${driver}"/>
                        <property name="url" value="${url}"/>
                        <property name="username" value="${username}"/>
                        <property name="password" value="${password}"/>
                    </dataSource>
                </environment>
            </environments>
            <mappers>
                <mapper resource="CustomerMapper.xml"/>
                <mapper resource="OrderMapper.xml"/>
                <mapper resource="AreaMapper.xml"/>
                <mapper resource="HusbandMapper.xml"/>
                <mapper resource="WifeMapper.xml"/>
                <mapper resource="TeaMapper.xml"/>
                <mapper resource="StuMapper.xml"/>
            </mappers>
        </configuration>

    5.测试类
        package com.oldboy.mybatis.test;

        import com.oldboy.mybatis.domain.Husband;
        import com.oldboy.mybatis.domain.Stu;
        import com.oldboy.mybatis.domain.Tea;
        import com.oldboy.mybatis.domain.Wife;
        import org.apache.ibatis.io.Resources;
        import org.apache.ibatis.session.SqlSession;
        import org.apache.ibatis.session.SqlSessionFactory;
        import org.apache.ibatis.session.SqlSessionFactoryBuilder;
        import org.junit.Test;

        import java.io.InputStream;

        /**
         * 测试多对多
         */
        public class TestMany2Many {
            @Test
            public void testInsert() throws Exception {
                InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
                SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
                SqlSession s = f.openSession() ;

                Stu s1 = new Stu("s1") ;
                Stu s2 = new Stu("s2") ;
                Stu s3 = new Stu("s3") ;
                Stu s4 = new Stu("s4") ;

                Tea t1 = new Tea("t1");
                Tea t2 = new Tea("t2");

                t1.addStus(s1 ,s2 , s3);
                t2.addStus(s2 , s3 , s4);

                s.insert("stus.insert" , s1);
                s.insert("stus.insert" , s2);
                s.insert("stus.insert" , s3);
                s.insert("stus.insert" , s4);

                s.insert("teas.insert" , t1);
                s.insert("teas.insert" , t2);

                s.insert("teas.insertLinks" , t1);
                s.insert("teas.insertLinks" , t2);

                s.commit();
                s.close();
            }

            @Test
            public void testSelectOne() throws Exception {
                InputStream in = Resources.getResourceAsStream("mybatis-conf.xml") ;
                SqlSessionFactory f = new SqlSessionFactoryBuilder().build(in) ;
                SqlSession s = f.openSession() ;
                Tea t = s.selectOne("teas.selectOne" , 3) ;
                s.commit();
                s.close();
            }
        }

聚合函数查询
-----------------
    1.Mapper.xml
        <select id="selectCount" resultType="int">
            select count(*) from teas
        </select>
    2.查询
        int cnt = s.selectOne("teas.selectCount") ;

    3.多个聚合
        <select id="selectAgg" resultType="map">
            select max(price) max , min(price) min , avg(price) avg from orders
        </select>

    4.查询
        Map map = s.selectOne("orders.selectAgg");

    5.查询没有学生的老师数量
        1.查询不在links中出现的tid的数量。
            select count(distinct id) from teas where id not in (select distinct tid from links) ;

        2.连接查询
            select count(*) from teas t left outer join links l on l.tid = t.id where l.sid is null; 

Spring
-----------------
    业务层框架,管理bean,容器。
    体验spring
    1、创建模块,添加maven依赖。
        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>

            <groupId>com.oldboy</groupId>
            <artifactId>myspring</artifactId>
            <version>1.0-SNAPSHOT</version>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.11</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>4.3.5.RELEASE</version>
                </dependency>
            </dependencies>
        </project>

    2、创建接口和实现类
        [WelcomeService]
        public interface WelcomeService {
            public void sayHello() ;
        }

        [WelcomeServiceImpl]
        package com.oldboy.myspring.service;

        /**
         * 实现类
         */
        public class WelcomeServiceImpl implements WelcomeService{
            private String name ;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public void sayHello() {
                System.out.println(name);
            }
        }

        [ByeService]
        public interface ByeService {
            public void sayBye();
        }

        [ByeServiceImpl]
        package com.oldboy.myspring.service;

        /**
         * Created by Administrator on 2018/4/28.
         */
        public class ByeServiceImpl implements ByeService{
            private String bye ;

            public String getBye() {
                return bye;
            }

            public void setBye(String bye) {
                this.bye = bye;
            }

            public void sayBye() {
                System.out.println(bye);
            }
        }

    3、创建配置文件
        [resource/beans.xml]
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!-- 配置bean -->
            <bean id="welService" class="com.oldboy.myspring.service.WelcomeServiceImpl">
                <property name="name" value="hello world" />
                <property name="bs" ref="byeService" />
            </bean>
            <!-- byeService -->
            <bean id="byeService" class="com.oldboy.myspring.service.ByeServiceImpl">
                <property name="bye" value="bye bye!!!" />
            </bean>
        </beans>

    4、App.java
        package com.oldboy.myspring;

        import com.oldboy.myspring.service.ByeService;
        import com.oldboy.myspring.service.WelcomeService;
        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;

        /**
         */
        public class App {
            public static void main(String[] args) {
                //创建spring容器
                ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
                //从容器提取指定bean
                WelcomeService ws = (WelcomeService) ac.getBean("welService");
                ws.sayHello();

                //
                ByeService bs = (ByeService) ac.getBean("byeService");
                bs.sayBye();
            }
        }

spring
----------------
    思想两个:ioc和aop
    ioc : inverse of control,反转控制,获得对象的方式反转了。
    aop : aspect oriented program,面向方面编程。

    bean的范围:
    1.singleton
        单例,默认值。
    2.prototype
        原型,每次get都是创建新对象,等价于new操作。

    aop
    --------------
        系统级功能,aop对oop的增强。proxy
        1.引入新依赖
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>1.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.10</version>
            </dependency>

        2.创建目录类和接口
            略
        3.创建前置通知
            public class MyMethodBeforeAdvice implements MethodBeforeAdvice{
                public void before(Method method, Object[] args, Object target) throws Throwable {
                    System.out.println("hello world");
                }
            }

        4.配置文件
            <?xml version="1.0" encoding="UTF-8"?>
            <beans xmlns="http://www.springframework.org/schema/beans"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
                <!-- 前置通知 -->
                <bean id="beforeAdvice" class="com.oldboy.myspring.aop.MyMethodBeforeAdvice" />

                <!-- 目标对象 -->
                <bean id="welserviceTarget" class="com.oldboy.myspring.aop.WelcomeServiceImpl">
                    <property name="name" value="tom" />
                </bean>

                <bean id="welService" class="org.springframework.aop.framework.ProxyFactoryBean">
                    <!--  代理接口集-->
                    <property name="proxyInterfaces">
                        <list>
                            <value>com.oldboy.myspring.aop.WelcomeService</value>
                        </list>
                    </property>
                    <!-- 拦截器名集 -->
                    <property name="interceptorNames">
                        <list>
                            <value>beforeAdvice</value>
                        </list>
                    </property>
                    <property name="target" ref="welserviceTarget" />
                </bean>
            </beans>
        5.测试
            package com.oldboy.myspring.aop;

            import org.springframework.context.ApplicationContext;
            import org.springframework.context.support.ClassPathXmlApplicationContext;

            /**
             */
            public class App {
                public static void main(String[] args) {
                    //创建spring容器
                    ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml");
                    WelcomeService ws = (WelcomeService) ac.getBean("welcomeService");
                    ws.sayHello();
                }
            }

后置通知
----------------
    1.创建通知
        /**
         * 后置通知
         */
        public class MyAfterReturningAdvice implements AfterReturningAdvice {
            public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
                System.out.println("after");
            }
        }

    2.配置aop.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!-- 前置通知 -->
            <bean id="beforeAdvice" class="com.oldboy.myspring.aop.MyMethodBeforeAdvice" />
            <bean id="afterAdvice" class="com.oldboy.myspring.aop.MyAfterReturningAdvice" />

            <!-- 目标对象 -->
            <bean id="welserviceTarget" class="com.oldboy.myspring.aop.WelcomeServiceImpl">
                <property name="name" value="tom" />
            </bean>

            <!-- 代理对象 -->
            <bean id="welcomeService" class="org.springframework.aop.framework.ProxyFactoryBean">
                <!--  代理接口集-->
                <property name="proxyInterfaces">
                    <list>
                        <value>com.oldboy.myspring.aop.WelcomeService</value>
                    </list>
                </property>
                <!-- 拦截器名集 -->
                <property name="interceptorNames">
                    <list>
                        <value>beforeAdvice</value>
                        <value>afterAdvice</value>
                    </list>
                </property>
                <property name="target" ref="welserviceTarget" />
            </bean>
        </beans>

    3.测试
        略

环绕通知
------------------
    1.创建通知
        package com.oldboy.myspring.aop;

        import org.aopalliance.intercept.MethodInterceptor;
        import org.aopalliance.intercept.MethodInvocation;

        /**
         * 环绕通知
         */
        public class MyMethodInterceptor implements MethodInterceptor {
            public Object invoke(MethodInvocation invocation) throws Throwable {
                System.out.println("begin");
                //调用目标对象的方法
                Object ret = invocation.proceed() ;
                System.out.println("end");
                return ret;
            }
        }

    2.aop.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!-- 前置通知 -->
            <bean id="beforeAdvice" class="com.oldboy.myspring.aop.MyMethodBeforeAdvice" />
            <!-- 后置通知 -->
            <bean id="afterAdvice" class="com.oldboy.myspring.aop.MyAfterReturningAdvice" />
            <!-- 环绕通知 -->
            <bean id="roundAdvice" class="com.oldboy.myspring.aop.MyMethodInterceptor" />

            <!-- 目标对象 -->
            <bean id="welserviceTarget" class="com.oldboy.myspring.aop.WelcomeServiceImpl">
                <property name="name" value="tom" />
            </bean>

            <!-- 代理对象 -->
            <bean id="welcomeService" class="org.springframework.aop.framework.ProxyFactoryBean">
                <!--  代理接口集-->
                <property name="proxyInterfaces">
                    <list>
                        <value>com.oldboy.myspring.aop.WelcomeService</value>
                    </list>
                </property>
                <!-- 拦截器名集 -->
                <property name="interceptorNames">
                    <list>
                        <value>beforeAdvice</value>
                        <value>afterAdvice</value>
                        <value>roundAdvice</value>
                    </list>
                </property>
                <property name="target" ref="welserviceTarget" />
            </bean>
        </beans>
    3.测试
        略

异常通知
-----------------
    1.创建通知
        package com.oldboy.myspring.aop;

        import org.springframework.aop.ThrowsAdvice;

        import java.lang.reflect.Method;

        /**
         * 异常通知
         */
        public class MyThrowAdvice implements ThrowsAdvice{
            public void afterThrowing(Method method, Object[] args, Object target, Exception ex){
                System.out.println("出事了!!");
                ex.printStackTrace();
            }
        }

    2.aop.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            <!-- 前置通知 -->
            <bean id="beforeAdvice" class="com.oldboy.myspring.aop.MyMethodBeforeAdvice" />
            <!-- 后置通知 -->
            <bean id="afterAdvice" class="com.oldboy.myspring.aop.MyAfterReturningAdvice" />
            <!-- 环绕通知 -->
            <bean id="roundAdvice" class="com.oldboy.myspring.aop.MyMethodInterceptor" />
            <!-- 异常通知 -->
            <bean id="throwsAdvice" class="com.oldboy.myspring.aop.MyThrowAdvice" />

            <!-- 目标对象 -->
            <bean id="welserviceTarget" class="com.oldboy.myspring.aop.WelcomeServiceImpl">
                <property name="name" value="tom" />
            </bean>

            <!-- 代理对象 -->
            <bean id="welcomeService" class="org.springframework.aop.framework.ProxyFactoryBean">
                <!--  代理接口集-->
                <property name="proxyInterfaces">
                    <list>
                        <value>com.oldboy.myspring.aop.WelcomeService</value>
                    </list>
                </property>
                <!-- 拦截器名集 -->
                <property name="interceptorNames">
                    <list>
                        <value>beforeAdvice</value>
                        <value>afterAdvice</value>
                        <value>roundAdvice</value>
                        <value>throwsAdvice</value>
                    </list>
                </property>
                <property name="target" ref="welserviceTarget" />
            </bean>
        </beans>
    3.测试
        略

观众和演员的关系
-------------------
    1.观众类
        public class Audience {
            public void turnOffCellphone(){
                System.out.println("turnOffCellphone");
            }

            public void sitdown(){
                System.out.println("sitdown");
            }

            public void applaud(){
                System.out.println("applaud");
            }

            public void payOff(){
                System.out.println("payoff");
            }

            public void gohome(){
                System.out.println("gohome");
            }
        }

    2.创建演员类和接口
        [Performer]
        package com.oldboy.myspring.aop2;

        /**
         * Created by Administrator on 2018/4/28.
         */
        public interface Performer {
            public void show();
        }

        [Singer]
        package com.oldboy.myspring.aop2;

        /**
         * 歌手演员
         */
        public class Singer implements Performer{
            public void show() {
                System.out.println("啦啦啦~~~");
            }
        }

    3.aop.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

            <!-- 观众 -->
            <bean id="audience" class="com.oldboy.myspring.aop2.Audience"/>

            <!-- 歌手 -->
            <bean id="singer" class="com.oldboy.myspring.aop2.Singer"/>

            <aop:config>
                <!-- 将观众配置成方面 -->
                <aop:aspect id="audienceAspect" ref="audience">
                    <aop:pointcut id="audiencePointcut" expression="execution(* *..Performer.*(..))" />
                    <aop:before method="turnOffCellphone" pointcut-ref="audiencePointcut" />
                    <aop:before method="sitdown" pointcut-ref="audiencePointcut"/>
                    <aop:after-returning method="applaud" pointcut-ref="audiencePointcut"/>
                    <aop:after-throwing method="payOff" pointcut-ref="audiencePointcut"/>
                    <aop:after method="gohome" pointcut-ref="audiencePointcut"/>
                </aop:aspect>
            </aop:config>
        </beans>

使用环绕通知实现aop
---------------------
    1.观众类
        package com.oldboy.myspring.aop3;

        import org.aspectj.lang.ProceedingJoinPoint;

        /**
         * 观众bean
         */
        public class Audience {

            //环绕通知了.
            public Object watch(ProceedingJoinPoint pjp){
                try {
                    System.out.println("turnoffCellphone");

                    System.out.println("sitDown");
                    //开始你的表演
                    Object ret = pjp.proceed();
                    System.out.println("applaud");
                    return ret ;
                }
                catch (Throwable e) {
                    System.out.println("payOff");
                    e.printStackTrace();
                }
                finally {
                    System.out.println("gohome");
                }
                return null ;
            }
        }

    2.aop3.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

            <!-- 观众 -->
            <bean id="audience" class="com.oldboy.myspring.aop3.Audience"/>

            <!-- 歌手 -->
            <bean id="singer" class="com.oldboy.myspring.aop3.Singer"/>

            <aop:config>
                <!-- 将观众配置成方面 -->
                <aop:aspect id="audienceAspect" ref="audience">
                    <aop:around method="watch" pointcut="execution(* *..Performer.*(..))" />
                </aop:aspect>
            </aop:config>
        </beans>

    3.测试
        package com.oldboy.myspring.aop3;

        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;

        /**
         */
        public class App {
            public static void main(String[] args) {
                //创建spring容器
                ApplicationContext ac = new ClassPathXmlApplicationContext("aop3.xml");
                Performer p = (Performer) ac.getBean("singer");
                p.show();
            }
        }

bean的简化配置
---------------------
    1.简介
        如果配置大量的bean,繁琐。

    2.在配置的类上增加注解。
        @Service            //服务
        @Controller            //控制器
        @Component            //组件
        @Repository            //仓库

        @Service("ws")
        @Scope("prototype")
        public class WelcomeServiceImpl implements WelcomeService{
            ...

            @Resource(name="byeService")
            private ByeService bs ;
        }

    3.配置文件beans2.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:context="http://www.springframework.org/schema/context"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                                http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/context
                                http://www.springframework.org/schema/context/spring-context-4.3.xsd
                                http://www.springframework.org/schema/aop
                                http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
            <!-- 组件扫描 -->
            <context:component-scan base-package="com.oldboy.myspring.service" />
        </beans>

    4.测试
        //创建spring容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans2.xml");
        WelcomeService ws = (WelcomeService) ac.getBean("welcomerService");
        ws.sayHello();

原文地址:https://www.cnblogs.com/zyde/p/8969273.html

时间: 2024-10-16 03:53:18

SSM-mybatis-spring容器 复杂和简化方法的相关文章

SSM(MyBatis+Spring+SpringMVC)之MyBatis总结

对于SSM(MyBatis+Spring+SpringMVC)之MyBatis总结 对于ORM持久化框架之前一直是用的JDBC去连接数据库 ,对于JDBC来连接库来说可能存在一些不足,那么MyBatis确切的说只能算半持久化框架,因为MyBatis是需要我们去自动的编写我们的SQL语句的,我们可以用JDBC&MyBatis做一些比较 我们在使用JDBC的时候会对数据库进行一些频繁创建连接和释放连接的操作从而影响的整个系统的性能.那么针对这一方面我们的MyBatis很好的利用了数据库连接池来对我们

Spring容器托管两种方法

Spring最核心的就是IOC(控制反转)和AOP(面向切面编程). IOC可以理解为把Spring当做一个容器,用来管理各种service.dao等.不用再去手动new. 将service.dao等注册到spring容器中,有两种办法: 1.在xml中定义bean,比如: <bean class="com.xxx.trade.common.xxx.xxx"/> 2.通过注解. 常用的注解有 @Controller  主要是controller层. @Service  业务

初始化spring容器的几种方法

package ssh.spring; import java.io.IOException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.conte

MyBatis+Spring 基于接口编程的原理分析

整合Spring3及MyBatis3 对于整合Spring及Mybatis不作详细介绍,可以参考: MyBatis 3 User Guide Simplified Chinese.pdf,贴出我的主要代码如下: package org.denger.mapper;    import org.apache.ibatis.annotations.Param;  import org.apache.ibatis.annotations.Select;  import org.denger.po.Us

SSM框架Spring+SpringMVC+MyBatis——详细整合教程

摘要: 包括SQL Maps和Data Access ObjectsDAOMyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的... 摘要:   spring MVC属于SpringFrameWork的后续产品已经融合在Spring Web Flow里面.Spring MVC 分离了控制器.模型对... 1.基本概念 1.1.Spring Spring是一个开源框架Spring是于2003 年兴起的一个轻量级的Java 开发框架由Rod Johnson 在其著作Expert 

[JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis)

来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral(以下博文对原博文有改动和补充) 开发环境: Eclipse Java EE IDE for Web Developers. Version: Mars.2 Release (4.5.2) apache-tomcat-8.0.33 jdk1.8.0_77 MySQL 5.0.11-dev(官网下载需要账号登

简单易学的SSM(Spring+SpringMVC+MyBatis)整合

SSM(Spring+SpringMVC+MyBatis)的整合: 具体执行过程:  1.用户在页面向后台发送一个请求 2.请求由DispatcherServlet 前端控制器拦截交给SpringMVC管理,SpringMVC讲这个请求传递给Controller层处理. 同时请求由Listener监听到交付给Spring,Spring建立IOC容器. 3.Controller层中会调用相应的Service层的方法处理业务逻辑.此时Service从上一步中建立好的IOC容器获取对象,然后获取 到M

SSM(springmvc+spring+mybatis)整合过程

问题?SSM(springmvc+spring+mybatis)整合过程 一.SSM框架比较S2SH框架的优缺点比较 站在个人使用这两个框架的观点儿上来说的话,我觉得这个不能定死的说,常用的S2SH,SpringMVC等,还可以考虑jFinal. 首先说S2SH,这个是用的比较多的,特别是在中小型项目中,针对大型项目就不行了,是Struts和hibernate过于庞大,过于重量级,项目大了之后配置文件多的也是麻烦事,配置文件多了之后一方面不好操作,另外比较蛋疼的是没法断点调试,特别是对底层数据库

SSM(spring mvc+spring+Mybatis)框架整合

最近用Idea开发,idea是一款综合的相对较新的Java IDE.Idea支持很多整合功能,我觉得挺好用的.Idea可以校正xml,支持jsp的调试.最让我喜欢的是,写spring配置文件的时候,写的一些路径都可以自己找到.classpath自己有代码的提示,超级的智能. 环境配置 在整合框架之前,先配置一下JER运行环境,配置maven仓库. 1.File--ProjectStructure--Project--New- 选择jdk的安装环境 2.File--Settings--Maven-