SSM(一) --- Mybatis

一、SSM:Spring / Spring MVC / Mybatis
--------------------------------------------------------------------------
    1.java web 的一套框架
    2.Spring:业务层框架
    3.Spring MVC:开发web程序应用的模块 -- model view controller
    4.Mybatis:数据持久化技术。jdbc操作mysql,对数据进行持久化存储


二、Mybatis:对jdbc的封装
-------------------------------------------------------------------------
    1.创建项目和模块

    2.添加pom依赖  
<dependencies>

            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.1</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.17</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>

        </dependencies>

    3.创建配置文件
        [resoucecs/mybatis-config.xml]
<?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>
            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC"/>
                    <dataSource type="POOLED">
                        <property name="driver" value="com.mysql.jdbc.Driver"/>
                        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                        <property name="username" value="mysql"/>
                        <property name="password" value="mysql"/>
                    </dataSource>
                </environment>
            </environments>
            <mappers>
                <!-- 这里添加自定义的mapper映射xml文件 -->
            </mappers>
        </configuration>

    4.在mysql中创建数据库mybatis和表mybatis.users
        $mysql> create database mybatis;
        $mysql> create table mybatis.users (id int primary key auto_increment, name varchar(20), age int);

    5.测试是否连通
    --------------------------------
      
 package test.ssm;

       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 java.io.InputStream;

       /**
        * 测试mybatis
        */
       public class TestMybatis {

           public static void main(String [] args)
           {
               try {
                   //指定配置文件的路径(类路径)
                   String resource = "mybatis-config.xml";
                   //加载文件
                   InputStream inputStream = Resources.getResourceAsStream(resource);

                   //创建会话工厂Builder,相当于连接池
                   SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);

                   //通过sf开启会话,相当于打开连接。
                   SqlSession s = sf.openSession();
                   System.out.println(s);

               } catch (Exception e) {
                   e.printStackTrace();
               }
           }

       }

    6.编写mapper文件
        a.创建用户类users -- 和用户表对应
        
/**
         * 与数据库中的表users对应
         */
        public class Users {

            private int id;
            private String name;
            private int age;

            public int getId() {
                return id;
            }

            public void setId(int id) {
                this.id = id;
            }

            public String getName() {
                return name;
            }

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

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }
        }

        b.创建UserMapper.xml映射文件,存放在resources/目录下,将表与类对应起来
           [resources/UserMapper.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="user">
               <insert id="insert">
                   <!--#{name},#{age} 表示参数,占位符-->
                   insert into users (name,age) values (#{name},#{age});
               </insert>
           </mapper>

    7.在resources/mybatis-config.xml文件中引入mapper的xml文件
        ...
        <mappers>
            <mapper resource="UserMapper.xml"/>
        </mappers>


    8.编写单元测试,实现mapper文件中的插入操作        
/**
         * insert
         */
        @Test
        public void insert() throws Exception {
            //指定配置文件的路径(类路径)
            String resource = "mybatis-config.xml";
            //加载文件
            InputStream inputStream = Resources.getResourceAsStream(resource);

            //创建会话工厂Builder,相当于连接池
            SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);

            //通过sf开启会话,相当于打开连接。
            SqlSession s = sf.openSession();
            User u = new User();

            u.setName("jerry");
            u.setAge(2);
            s.insert("users.insert", u);
            s.commit();
            s.close();
        }


    9.测试CRUD操作
        a.编写mapper映射文件UserMapper.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="users">

                <insert id="insert">
                    <!--#{name},#{age} 表示参数,占位符-->
                    insert into users (name,age) values (#{name},#{age});
                </insert>

                <update id="update1">
                    update users set name = #{name} ,age = #{age} where id = #{id};
                </update>

                <!-- 查询一个 注意查询要指定结果的类型-->
                <select id="select_one" parameterType="int" resultType="test.ssm.domain.Users">
                    select * from users where id = #{id};
                </select>

                <!-- 查询多个 注意查询要指定结果的类型-->
                <select id="select_all"  resultType="test.ssm.domain.Users">
                    select * from users;
                </select>

                <delete id="delete">
                    delete from users where id = #{id};
                </delete>

            </mapper>

        b.编写单元测试进行CRUD
        ----------------------------------            
package test.ssm;

            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.Before;
            import org.junit.Test;
            import test.ssm.domain.Users;

            import java.io.IOException;
            import java.io.InputStream;
            import java.util.List;

            /**
             * 测试增删改查
             */
            public class TestCRUD {

                private SqlSession session = null;

                /**
                 * 打开sql会话
                 */
                @Before
                public void getSqlSession() throws Exception {

                    //指定配置文件的路径(类路径)
                    String resource = "mybatis-config.xml";
                    //加载文件
                    InputStream inputStream = Resources.getResourceAsStream(resource);

                    //创建会话工厂Builder,相当于连接池
                    SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);

                    //通过sf开启会话,相当于打开连接。
                    session = sf.openSession();
                }


                /**
                 * 测试插入
                 */
                @Test
                public void tsInsert()
                {
                    Users u = new Users();
                    u.setName("jerry111");
                    u.setAge(3);
                    //找到插入语句所在的mapper文件[namespace.insert id]
                    session.insert("users.insert", u);
                    session.commit();
                    session.close();
                }

                /**
                 * 测试更新
                 */
                @Test
                public void tsUpdate()
                {
                    Users u = new Users();
                    u.setName("jerry11");
                    u.setAge(13);
                    u.setId(1);
                    //找到插入语句所在的mapper文件[namespace.insert id]
                    session.update("users.update1",u);
                    session.commit();
                    session.close();
                }

                /**
                 * 测试查询 -- 查询一个
                 */
                @Test
                public void tsSelectOne()
                {
                    Users u = new Users();
                    u.setId(1);
                    //找到插入语句所在的mapper文件[namespace.insert id]
                    u = session.selectOne("users.select_one",u);
                    System.out.println(u.getAge() + ":" + u.getName());
                    session.close();
                }


                /**
                 * 测试查询 -- 查询全部
                 */
                @Test
                public void tsSelectAll()
                {
                    List<Users> list = session.selectList("users.select_all");
                    for(Users u : list)
                    {
                        System.out.println(u.getAge() + ":" + u.getName());
                    }
                    session.close();
                }

                /**
                 * 测试删除
                 */
                @Test
                public void tsDelete()
                {
                    Users u = new Users();
                    u.setId(1);
                    session.delete("users.delete", u);
                    session.commit();
                    session.close();
                }
            }


三、复杂关系访问-- 关联查询订单[多对一]
-------------------------------------------------
    1.准备数据库[d:\\sql.sql]     
        use mybatis ;
        -- 删除表
        drop table if exists  items ;
        drop table if exists  orders ;
        drop table if exists  users ;

        -- 创建表
        create table users(id int primary key auto_increment , name varchar(20) , age int);
        create table orders(id int primary key auto_increment , orderno varchar(20) , uid int);
        create table items(id int primary key auto_increment , itemname varchar(20) , oid int);

        -- 插入用户
        insert into users(name,age) values('tom',12);
        insert into users(name,age) values('tomas',13);

        -- 插入订单
        insert into orders(orderno,uid) values('No001',1);
        insert into orders(orderno,uid) values('No002',1);
        insert into orders(orderno,uid) values('No003',2);
        insert into orders(orderno,uid) values('No004',2);

        -- 插入订单项
        insert into items(itemname,oid) values('item001',1);
        insert into items(itemname,oid) values('item002',1);
        insert into items(itemname,oid) values('item003',2);
        insert into items(itemname,oid) values('item004',2);
        insert into items(itemname,oid) values('item005',3);
        insert into items(itemname,oid) values('item006',3);
        insert into items(itemname,oid) values('item007',4);
        insert into items(itemname,oid) values('item008',5);


        select * from users ;
        select * from orders ;
        select * from items ;

    2.执行sql.sql文件
        $mysql> source d:\\sql.sql;

    3.java项目中创建类users/orders/items
    --------------------------------------------       
public class Users {

            private int id;
            private String name;
            private int age;

            //getter

            //setter
        }

        public class Orders {

            private int id;
            private String orderno;
            private Users user;

            //geter

            //setter

        }

        public class Items {

            private int id;
            private String itemname;
            private Orders order;

            //getter

            //setter

        }


    4.创建订单映射文件 Resources/OrderMapper.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="orders">

            <insert id="insert">
                insert into orders (orderno,uid) values (#{orderno},#{user.id});
            </insert>

            <select id="select_by_id" parameterType="int" resultType="test.ssm.domain.Orders">
                select * from orders where id = #{id};
            </select>

            <!-- 关联查询:左外连接查询 -->
            <select id="select_join_one" parameterType="int" resultMap="MyResMap">
                select
                  o.id oid ,
                  o.orderno ono,
                  o.uid uid,
                  u.name uname,
                  u.age uage
                from orders o
                left outer join users u
                on o.uid=u.id
                where o.id= #{id};
            </select>

            <!-- 关联查询:左外连接查询 -->
            <select id="select_join_all" parameterType="int" resultMap="MyResMap">
                select
                  o.id oid ,
                  o.orderno ono,
                  o.uid uid,
                  u.name uname,
                  u.age uage
                from orders o
                left outer join users u
                on o.uid=u.id;
            </select>

            <!-- 指定:关联查询别名的映射 将类的属性与表中列的别名进行映射-->
            <resultMap id="MyResMap" type="test.ssm.domain.Orders">
                <!-- 主键用id ,其余用 result -->
                <id property="id" column="oid"/>
                <result property="orderno" column="ono"/>

                <!-- 关联的类要特殊处理,如下 -->
                <association property="user" javaType="test.ssm.domain.Users">
                    <id property="id" column="uid"/>
                    <result property="name" column="uname"/>
                    <result property="age" column="uage"/>
                </association>

            </resultMap>

        </mapper>


    5.将订单映射文件关联到mybatis-config.xml中
        ...
        <mappers>
            <mapper resource="UserMapper.xml"/>
            <mapper resource="OrderMapper.xml"/>
        </mappers>

    6.测试操作订单
    ---------------------------
       
 package test.ssm;

        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.Before;
        import org.junit.Test;
        import test.ssm.domain.Orders;
        import test.ssm.domain.Users;

        import java.io.InputStream;
        import java.util.List;

        /**
         * 测试联合查询
         */
        public class TestOrders {

            private SqlSession session = null;

            /**
             * 打开sql会话
             */
            @Before
            public void getSqlSession() throws Exception {

                //指定配置文件的路径(类路径)
                String resource = "mybatis-config.xml";
                //加载文件
                InputStream inputStream = Resources.getResourceAsStream(resource);

                //创建会话工厂Builder,相当于连接池
                SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);

                //通过sf开启会话,相当于打开连接。
                session = sf.openSession();
            }

            /**
             * 测试插入数据--关联users
             */
            @Test
            public void tsOrderInsert()
            {
                Users user = new Users();
                user.setId(2);
                Orders order = new Orders();
                order.setOrderno("No005");
                order.setUser(user);
                session.insert("orders.insert", order);
                session.commit();
                session.close();
            }

            /**
             * 测试id查询
             */
            @Test
            public void tsSelectById()
            {
                Orders order = new Orders();
                order.setId(3);
                order = session.selectOne("orders.select_by_id", order);
                session.close();
                System.out.println(order.getOrderno());
            }


            /**
             * 测试关联查询 -- 左外连接查询
             * 查询订单的同时,查询出订单的客户信息
             * select o.id oid , o.orderno ono, o.uid uid, u.name uname, u.age uage from orders o left outer join users u on o.uid=u.id where o.id=1;
             */
            @Test
            public void tsJoinSelectOne()
            {
                Orders order = session.selectOne("orders.select_join_one", 1);
                System.out.println(order.getUser().getName() + order.getOrderno());
                session.close();
            }

            /**
             * 测试关联查询 -- 左外连接查询
             * 查询订单的同时,查询出订单的客户信息
             * select o.id oid , o.orderno ono, o.uid uid, u.name uname, u.age uage from orders o left outer join users u on o.uid=u.id;
             */
            @Test
            public void tsJoinSelectAll()
            {
                List<Orders> list = session.selectList("orders.select_join_all");
                for(Orders o : list)
                {
                    System.out.println(o.getId()+ "_" + o.getOrderno() + "_" + o.getUser().getId() + "_" + o.getUser().getName() + "_" + o.getUser().getAge());
                }

                session.close();
            }
        }

四、复杂关系访问-- 组合多对一和一对多关联关系到一个实体(Order)中
-----------------------------------------------------------------------
    1.在用户类Users中添加一个order的集合属性
        ...
        private List<Orders> list = new ArrayList<Orders>();
        ...

    2.在订单类Orders中添加一个Items的集合属性
        ...
        private List<Items> itemList = new ArrayList<Items>();
        ...

    3.修改mybatis-config.xml,对大长串的类名定义别名
        
<?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>

            <!-- 给类定义别名 -->
            <typeAliases>
                <typeAlias type="test.ssm.domain.Orders" alias="_Orders"/>
                <typeAlias type="test.ssm.domain.Users" alias="_Users"/>
                <typeAlias type="test.ssm.domain.Items" alias="_Items"/>
            </typeAliases>

            <environments default="development">
               ...
            </environments>
            <mappers>
               ...
            </mappers>
        </configuration>

    4.修改用户映射文件 [Resources/UserMapper.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="users">

            <insert id="insert">
                <!--#{name},#{age} 表示参数,占位符-->
                insert into users (name,age) values (#{name},#{age});
            </insert>

            <update id="update1">
                update users set name = #{name} ,age = #{age} where id = #{id};
            </update>

            <!-- 查询一个 注意查询要指定结果的类型-->
            <select id="select_one" parameterType="int" resultType="_Users">
                select * from users where id = #{id};
            </select>

            <!-- 查询多个 注意查询要指定结果的类型-->
            <select id="select_all"  resultType="_Users">
                select * from users;
            </select>

            <delete id="delete">
                delete from users where id = #{id};
            </delete>


            <select id="select_join_one" parameterType="int" resultMap="userMap">
                select
                  u.id uid,
                  u.name uname,
                  u.age uage,
                  o.id oid,
                  o.orderno ono
                from users u
                left outer join orders o
                on u.id = o.uid
                where u.id = #{id};
            </select>

            <select id="select_join_all"  resultMap="userMap">
                select
                  u.id uid,
                  u.name uname,
                  u.age uage,
                  o.id oid,
                  o.orderno ono
                from users u
                left outer join orders o
                on u.id = o.uid;
            </select>

            <!-- 别名映射 将类中的属性名与表的列明或者列的别名进行映射 -->
            <resultMap id="userMap" type="_Users">

                <id property="id" column="uid"/>
                <result property="name" column="uname"/>
                <result property="age" column="uage"/>

                <!-- Users中的属性 List<Orders> list 的表示方式 -->
                <!-- property 表示属性名称 foType表示集合中的元素的类型 -->
                <collection property="list" ofType="_Orders">
                    <id property="id" column="oid"/>
                    <result property="orderno" column="ono"/>
                </collection>

            </resultMap>
        </mapper>

    5.测试操作用户进行关联订单查询
    ---------------------------
        
package test.ssm;

        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.Before;
        import org.junit.Test;
        import test.ssm.domain.Orders;
        import test.ssm.domain.Users;

        import java.io.InputStream;
        import java.util.List;

        /**
         * 测试联合查询
         */
        public class TestUsers {

            private SqlSession session = null;

            /**
             * 打开sql会话
             */
            @Before
            public void getSqlSession() throws Exception {

                //指定配置文件的路径(类路径)
                String resource = "mybatis-config.xml";
                //加载文件
                InputStream inputStream = Resources.getResourceAsStream(resource);

                //创建会话工厂Builder,相当于连接池
                SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);

                //通过sf开启会话,相当于打开连接。
                session = sf.openSession();
            }


            /**
             * 测试关联查询 -- 左外连接查询
             */
            @Test
            public void tsJoinSelectOne()
            {
                Users user = session.selectOne("users.select_join_one", 1);
                List<Orders> list = user.getList();
                for(Orders o : list)
                {
                    System.out.println(user.getId() + ":" + user.getName() + ":" + user.getAge() + ":" + o.getId() + ":" + o.getOrderno());
                }
                session.close();
            }

            /**
             * 测试关联查询 -- 左外连接查询
             */
            @Test
            public void tsJoinSelectAll()
            {
                List<Users> usersList = session.selectList("users.select_join_all");
                for(Users user : usersList)
                {
                    List<Orders> list = user.getList();
                    for(Orders o : list)
                    {
                        System.out.println(user.getId() + ":" + user.getName() + ":" + user.getAge() + ":" + o.getId() + ":" + o.getOrderno());
                    }
                }
                session.close();
            }
        }

    6.修改Order映射文件 [Resources/OrderMapper.xml] -- 进行用户订单item三级关联查询
        
<!-- 三级关联查询:用户-订单-items -->
        <select id="select_join_3_one" parameterType="int" resultMap="MyResMap">
            select
              o.id oid ,
              o.orderno ono,
              o.uid uid,
              u.name uname,
              u.age uage,
              i.id iid,
              i.itemname iitemname
            from orders o
            left outer join users u on o.uid=u.id
            left outer join items i on o.id = i.oid
            where o.id = #{id};
        </select>

        <!-- 三级关联查询:用户-订单-items -->
        <select id="select_join_3_all" resultMap="MyResMap">
            select
              o.id oid ,
              o.orderno ono,
              o.uid uid,
              u.name uname,
              u.age uage,
              i.id iid,
              i.itemname iitemname
            from orders o
            left outer join users u on o.uid=u.id
            left outer join items i on o.id = i.oid;
        </select>

        <!-- 指定:关联查询别名的映射 将类的属性与表中列的别名进行映射-->
        <resultMap id="MyResMap" type="test.ssm.domain.Orders">
            <!-- 主键用id ,其余用 result -->
            <id property="id" column="oid"/>
            <result property="orderno" column="ono"/>

            <!-- 关联的类要特殊处理,如下 -->
            <association property="user" javaType="test.ssm.domain.Users">
                <id property="id" column="uid"/>
                <result property="name" column="uname"/>
                <result property="age" column="uage"/>
            </association>

            <!-- 处理集合属性 -->
            <collection property="itemList" ofType="_Items">
                <id property="id" column="iid"/>
                <result property="itemname" column="iitemname"/>
            </collection>

        </resultMap>


    7.修改Orders类,测试3级关联查询
    ----------------------------------------
        
/**
         * 测试3级查询--指定id
         */
        @Test
        public void tsJoinSelectOne_3()
        {
            Orders o = session.selectOne("orders.select_join_3_one", 1);
            List<Items> list = o.getItemList();
            for(Items i : list)
            {
                System.out.println(
                        o.getId() + "_" + o.getOrderno() + "_"
                        + o.getUser().getId() + "_" + o.getUser().getName() + "_" + o.getUser().getAge() + "_"
                        + i.getId() + "_" + i.getItemname()
                );
            }
            session.close();
        }


        /**
         * 测试3级查询--全查询
         */
        @Test
        public void tsJoinSelectAll_3()
        {
            List<Orders> oList = session.selectList("orders.select_join_3_all");
            for(Orders o : oList)
            {
                List<Items> list = o.getItemList();
                for(Items i : list)
                {
                    System.out.println(
                            o.getId() + "_" + o.getOrderno() + "_"
                                    + o.getUser().getId() + "_" + o.getUser().getName() + "_" + o.getUser().getAge() + "_"
                                    + i.getId() + "_" + i.getItemname()
                    );
                }
            }
            session.close();
        }

五、项目的规范化改造
-------------------------------------------------
    1.在生产环境中,一般将CRUD的操作封装到一个类中,一般叫做Dao[data access object]

    2.增删改这样的代码,只需要更改很少的内容,其余完全一样。这种情况,考虑使用模板代码DaoTemplate

    3.编写模板类dao.DaoTemplate[抽取共性,并且将不同的地方写入到一个独立的回调接口ICallBack]
    -------------------------------------
        
package dao;

        import org.apache.ibatis.session.SqlSession;
        import test.ssm.domain.Users;
        import util.Util;

        /**
         * CRUD模板代码
         * 增删改这样的代码,只需要更改很少的内容,其余完全一样。
         * 这种情况,考虑使用模板代码DaoTemplate
         */
        public class DaoTemplate {

            /**
             * 模板方法
             */
            public static Object execute(ICallBack cb)
            {
                SqlSession session = null;
                try{
                    session = Util.openSqlSession();
                    Object obj = cb.exeSession(session);
                    session.commit();
                    return obj;
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                    //如果出现了错误就回滚
                    Util.rollbackSqlSession(session);
                }
                finally {
                    //最终确保session关闭
                    Util.closeSqlSession(session);
                }
                return null;
            }
        }

    4.编写回调接口,用于管理变化的那部分代码[模板类处理相同的代码,回调接口处理变化的那部分代码,谁调用,谁制定接口方法]
    -------------------------------------
        
package dao;

        import org.apache.ibatis.session.SqlSession;

        public interface ICallBack {
            public Object exeSession(SqlSession s);
        }

    5.编写实际的类UserDao类,用于用户的增删改查[因为调用了DaoTemplate.execute的模板方法,所以需要根据情况重写回调接口的回调方法]
    ----------------------------------
        
package dao;

        import org.apache.ibatis.session.SqlSession;
        import org.junit.Test;
        import test.ssm.domain.Orders;
        import test.ssm.domain.Users;
        import util.Util;

        import java.util.List;

        /**
         * 用户dao类,用于users表的增删改查
         */
        public class UserDao {

            /**
             * 增
             */
            public void insert(final Users user)
            {
                DaoTemplate.execute(new ICallBack() {
                    public Object exeSession(SqlSession s) {
                        s.insert("users.insert",user);
                        return null;
                    }
                });
            }

            /**
             * 删
             */
            public void delete(final Users user)
            {
                DaoTemplate.execute(new ICallBack() {
                    public Object exeSession(SqlSession s) {
                        s.insert("users.delete",user);
                        return null;
                    }
                });
            }

            /**
             * 改
             */
            public void update(final Users user)
            {
                DaoTemplate.execute(new ICallBack() {
                    public Object exeSession(SqlSession s) {
                        s.insert("users.update",user);
                        return null;
                    }
                });
            }

            /**
             * 测试查询
             */
            @Test
            public Users tsJoinSelectOne(final int id)
            {
                return (Users)DaoTemplate.execute(new ICallBack() {
                    public Object exeSession(SqlSession s) {
                        Users user = s.selectOne("users.select_join_one", id);
                        return user;
                    }
                });
            }

            /**
             * 测试关联查询
             */
            @Test
            public List<Users> tsJoinSelectAll()
            {
                return (List<Users>) DaoTemplate.execute(new ICallBack() {
                    public Object exeSession(SqlSession s) {
                        List<Users> usersList = s.selectList("users.select_join_all");
                        return usersList;
                    }
                });

            }
        }

    6.App测试
    -----------------------------------
        
package test.ssm.domain;

        import dao.UserDao;

        import java.util.List;

        public class App {

            public static void main(String [] args)
            {
                UserDao userDao = new UserDao();
                Users u = new Users();
                u.setName("gegege");
                u.setAge(123);
                //userDao.insert(u);

                //List<Users> list = userDao.tsJoinSelectAll();

                /*for(Users user : list)
                {
                    List<Orders> list1 = user.getList();
                    for(Orders o : list1)
                    {
                        System.out.println(user.getId() + ":" + user.getName() + ":" + user.getAge() + ":" + o.getId() + ":" + o.getOrderno());
                    }
                }*/

                Users user = userDao.tsJoinSelectOne(2);
                List<Orders> list1 = user.getList();
                for(Orders o : list1)
                {
                    System.out.println(user.getId() + ":" + user.getName() + ":" + user.getAge() + ":" + o.getId() + ":" + o.getOrderno());
                }
            }

        }

猜你喜欢

转载自blog.csdn.net/xcvbxv01/article/details/82899015