SSM三大框架之——Mybatis自我总结

版权声明:转载请附上文章地址https://blog.csdn.net/qq_42672839

SSM三大框架(spring MVC , spring , mybatis 分别用于 web展示层,业务逻辑处理层,持久层 操作数据库)

目录

----------------第一部分 Mybatis-------------------------  

Mybais测试类      

Mybatis 的动态 SQL 语句 

Mybatis的多表查询

Mybtais的数据操作                

Mybatis中的注解开发



----------------第一部分 Mybatis-------------------------
  


mybatis持久层的框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身,从而省去了 创建驱动,创建连接,创建 statement 等繁杂的过程.
    

mybatis官网有模板

maven环境下的pom文件的配置:
            在 pom.xml 文件中添加 
                1】Mybatis3.4.5 的坐标
                2】mysql5.1.6
                3】junit4.10
                4】log4j1.2.12
            
    在mave的
     src->main->java下创建
                    cn.yzh.domian包放实体类对象(如:User)
                    cn.yzh.dao 包下放操作数据库的接口 (如:UserDao)
        ->main->resources下放配置文件
------------------------------第一种---------------------------------
                    全局配置文件:SqlMapConfig.xml
                                    1】里面配置了 数据库驱动,数据库名,账号,密码
                                    2】 <mappers><mapper resource="cn/yzh/dao/UserDao.xml"/></mappers> 
                                            【*】resuorce是用配置文件写sql语句--->resource="cn/yzh/dao/UserDao.xml"
                                            【*】class是通过注解来写sql语句--->class="cn.yzh.UserDao"
                                            
                                            //在cn.yzh.dao包下的所有接口接口都可以使用
                                            <package name="cn.yzh.dao"></package>
                    
 ------------------------------第二种---------------------------------

                    打印日之文件:log4j.properties(控制台打印日志,通过日志寻找错误和异常)


 ------------------------------第三种---------------------------------
                    放置sql语句的配置文件
                        路径:和数据库的接口路径相同-->cn.yzh.dao包下创建 UserDao.xml
                            设置:
                            <mapper  (标签)
                                namespace="接口全类名"(cn.yzh.dao.UserDao)>
                                
                                四种标签:
                                    查询:
                                    [1]<select id="接口中的方法名" resultType="单条的数据类型"[返回值类型](cn.yzh.domian.User)parameterType="参数类型">sql语句</select>
                                    更新:
                                    [2]<update>sql语句</update>
                                    添加:
                                    [3]<insert>sql语句</insert>
                                    删除:
                                    [4]<delete>sql语句</delete>
                            </mapper>
                            
                            parameterType="参数类型":参数类型 分为基本类型+String+包装类和对象实体类
                                *第一种变量名可以随意写 
                                *第二中变量名为属性名
                            resultType="单条的数据类型"[返回值类型]
                            resultMap 解决实体类属性与数据库列名不一致的问题 
                            
                             <!-- 配置保存时获取插入的 id -->
                                <selectKey keyColumn="id" keyProperty="id" resultType="int">
                                    select last_insert_id();
                                </selectKey>
    
        注解的方式:
                    删除配置UserDao.xml
                    
                在数据库接口的方法上使用注解
                @select(sql语句)
                public void 方法名();
                
                *注意事项: 在全局配置文件中必须改 resuorce=“cn/yzb/dao/UserDao.xml”  ---->class="cn.yzh.dao.UserDao
                

   
mybais测试类      

 

【1】用mybatis提供的Resuorce.getResourceAsStream("全局配置文件")获取一个输入流;
                    InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
                【2】用构建模式:获取一个构建者对象
                    SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
                【3】用构建者对象加载输入流创建一个工厂模式的对象(参数是输入流)
                    SqlSessionFactory factory = builder.build(is);
                【4】用工厂对象创建一个代理对象
                    SqlSession sqlSession = factory.openSession();  //已经设置了不自动提交  如果要自动提交传入参数true
                【5】用代理模式创建一个接口的对象(参数是接口的字节码)
                     UserDao userDao = sqlSession.getMapper(UserDao.class);
                【6】用接口的实现类对象执行方法
                     List<User> all = userDao.findAll();
                【7】处理结果集
                【8】关闭流
                    is.close();
                    sqlSession.close();
                    
                
                简化版:
                把重复的代码封装方法:
                把【1】InputStream is 【2】SqlSessionFactory factory 【3】SqlSession sqlSession 【4】UserDao userDao都放到成员变量的位置
                
                //抽取成员变量
                    private InputStream is;
                    private  SqlSessionFactory factory;
                    private SqlSession sqlSession;
                    private UserDao userDao;
                    
                    
                    /**
                    * 初始化成员变量 
                    */
                    @Before     (注解:在Test执行之前先执行)
                    public void init() throws Exception{
                    
                        is=Resources.getResourceAsStream("SqlMapConfig.xml");
                        factory=new SqlSessionFactoryBuilder().build(is);
                        sqlSession = factory.openSession();
                        userDao = sqlSession.getMapper(UserDao.class);
                    }
                    
                    @after    (注解:在Test执行完后执行)
                    public void destroy() throws Exception{
                        //除了查询以外,添加,修改,删除都要提交表单
                        sqlSession.commit();
                        //7.释放资源
                        sqlSession.close();
                        is.close();
                    ]


 Mybatis 的动态 SQL 语句 

【1】<!-- 根据用户信息查询 -->  <select id="findByUser" resultType="user" parameterType="user">
                    <include refid="defaultSql"></include>
                    <where> 
                        <if test="username!=null and username != '' ">
                            and username like #{username}
                        </if> 
                        <if test="address != null">
                            and address like #{address}
                        </if>
                    </where> 
                    
                    if标签是判断的作用,where标签相当于sql语句中的条件where!
                    
                    <!-- 查询所有用户在 id 的集合之中 -->
                    <select id="findInIds" resultType="user" parameterType="queryvo">
                    <!--  select * from user where id in (1,2,3,4,5); --> 
                        <include refid="defaultSql"></include>
                        <where> 
                            <if test="ids != null and ids.size() > 0">
                                <foreach collection="ids" open="id in ( " close=")" item="uid"  separator=",">
                                #{uid}     
                                </foreach>    
                            </if>   
                        </where>  
                    </select>
                    
                    foreach用于循环遍历!
                
                
                【2】
                    Mybatis 中简化编写的 SQL 片段 
                    
                    
                    <!-- 配置查询所有操作 -->
                    <select id="findAll" resultType="user">
                        <include refid="defaultSql"></include>
                    </select>   
                    <!-- 根据 id 查询 -->
                    <select id="findById" resultType="UsEr" parameterType="int"> 
                    
                    

 

mybatis的多表查询


    数据库中表和表之间关系,以及如何建立关系。
    
    user和account关系。
        一个用户有多个账户
        某一个账户只属于某一个用户
        综上:用户:账户 1:m关系。
        在account表中创建user表的外键
    需求:查询account表中所有建立封装List<Account>(略)
    
需求1:查询账户及账户关联的用户的用户名和地址(使用resultType封装) 看图1
    回顾多表关联查询的SQL语句
    -- 多表关联查询。
    -- 三类
    -- 笛卡尔积(了解) 
        特点:记录是2个表记录之积,字段是2个表字段纸盒
        select * from account , user
    -- 内连接,特点:显示2个表有关联关系的数据(掌握)
        select * from account,user  where account.uid = user.id  //92
        select * from account inner join user    //99
        on account.uid = user.id
        
    -- 外连接 
        -- 特点: 以左边的表为准,左边表的数据要全部展示,右边如果和左边没有关系,右边显示null
        左 : select * from user left join account on user.id = account.uid
        
        -- 特点: 以右边的表为准,右边表的数据要全部展示,左边如果和右边没有关系,左边显示null
        右 :select * from user right join account on user.id = account.uid
    
 

   
mybtais的数据操作
                


                【mybatis 1:m】高级映射(重点)

                    需求:查询所有用户并且将用户拥有的账户数据(如果该用户没有账户也要显示)(参考图)
                        1.建立实体之间关系。
                            在User中创建List<Account>
                        2.在UserDao中编写方法
                            public List<User> findAll();
                        3.在UserDao.xml编写Statement
                            1:m使用
                            collection property="user中account集合的引用" ofType="集合中元素的类型"
                        
                【mybatis m:n】:高级映射(重点)
                    分析role user 关系。
                        1个角色可以被多个用户使用。
                        1个用户可以拥有多个角色。
                        综上:用户和角色是m:n
                    


Mybatis中的注解开发


    环境搭建
    单表CRUD操作(代理Dao方式)
    多表查询操作
    缓存的配置
    
    需求1:查询所有的用户封装List<User>
    
    1.创建mybatis全局配置文件,一般叫sqlMapConfig.xml
        配置数据源
        配置事务
        配置包扫描
        选配:
            properties
            typeAliases
            
    2.创建User的实体类
    
    3.编写UserDao接口
        @Select("select * from user")
        public List<User> findAll();
    
    4.测试
        1.加载sqlMapConfig.xml,获取其输入流
        2.创建SqlSessionFactoryBuilder,调用其build方法,传入全局配置文件输入流获取SqlSessionFactory
        3.使用SqlSessionFactory的openSession获取SqlSession
        4.调用SqlSession的getMapper获取UserDao接口的代理对象。
        5.代理对象中findAll方法
        6.释放资源
        
    
    需求:插入用户,根据id修改用户。
        在UserDao编写插入用户方法
            @Insert("insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})")
            public void saveUser(User user);
            @Update("update user set username = #{username},sex=#{sex}... where id = #{id}")
            public void updateUser(User user);
    
    
    
    需求:
        根据id删除用户
            @Delete("delete from user where id = #{renyi}")
            public void deleteUser(int id);
        根据id查询用户
            @Select("select * from user where id = #{renyi}")
            public User findById(int id);
        根据用户名模糊查询用户列表
            @Select("select * from user where username like #{renyi}")
            //@Select("select * from user where username like '%${value}%'")
            public List<User> findByUsername(String username);
        
        查询所有用户记录数量
            @Select("select count(id) from user")
            public int findTotal();
        
    

思考:
    如果POJO中属性和查询出来结果集中字段不一致。
        
    解决方案:
        1.给查询的结果集字段起别名
        2.使用resultMap
            
            
        
        回顾注解中属性的类型。
            1.基本类型
            2.String类型
            3.Class类型
            4.枚举类型
            5.注解类型
            6.以上类型的数组
            
    @Results(id="UserMap",value = {
            @Result(id = true ,column = "id" ,property = "userId"),
            @Result(column = "username" ,property = "username"),
            @Result(column = "birthday" ,property = "userBirthday"),
            @Result(column = "userSex" ,property = "sex"),
            @Result(column = "address" ,property = "userAddress")
    })
        
    id属性是用来复用。
    @ResultMap("UserMap")
    
    
    多表查询:
        1.查询账户关联账户对应的用户。(思路看图)
        2.查询用户以及关联的账户的集合。

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值