Mybatis框架总结

编程思想的培养?

1.什么时候需要传参?
add(对象 引用) update(对象 引用) delete(int id) delete(对象 引用) findById(int id)
2.什么时候需要返回值?
List<对象> findAll() , 对象 findById()
3.返回值改为int类型 传参+返回值一起写 谁执行效率高?
int delete(int id) 代码会多 相对来说 返回值为int 需要判断
void delete(对象) 这样效率好 代码少

总结: 增加 更新 删除 都是无返回值 编译速度块 执行效率高

mybatis框架的优缺点:

优点:
(1)与jdbc相比,减少了50%以上的代码量.
(2)最简单的持久化框架,小巧并简单易学
(3)SQL代码从程序代码中彻底分离,可重用
(4)提供xml标签 支持编写动态sql
(5)提供映射标签,支持对象与数据库的ORM字段映射
缺点:
(1)SQL语句编写工作量大,对开发人员有一定要求
(2)数据库移植性差

mybatis专注于SQL本身,是一个足够灵活的Dao层解决方案,适用于性能要求较高或者需求多变的互联项目

MyBatis的开发步骤:

1.下载mybatis.jar包并导入工程
2.编写MyBatis核心配置文件(configuration.xml)
3.创建实体类 --entity
4.dao层-SQL映射文件(mapper.xml)***
5.创建测试类
读取核心配置文件mybatis-config.xml
创建SqlSessionFactory对象,读取配置文件
创建SqlSession对象
调用mapper文件进行数据操作
提交事物(可选)

三者的作用域:

SqSessionFactoryBuilder

  • 用过即丢,推荐作用范围:方法体内
    SqlSessionFactory
  • 最佳作用范围:应用的全局作用域
  • 生命周期与应用的生命周期相同
    SqlSession
  • 线程级
  • 一个request请求期间

面试题: jdbc hibernate mybatis 区别

jdbc: 优点: sql语句非常灵活 可移植性最强(相对来说).
缺点: 代码量多 冗余 java代码和sql耦合在一起 不利用代码维护.
hibernate: 优点:完全面向对象写法 利用HQL语句 完全脱离java代码和sql.
缺点: 全封装的框架 底层代码出问题 不好调试 可移植性差.
mybatis: 优点: 半封装的框架 脱离java代码和sql 可移植性非常强 应用非常灵活.
缺点:大量写sql语句(不包含java代码 ) 代码量多.

Mybatis框架中最重要的是就是子配置文件中的SQL语句
List<T> 返回值就是T 默认对象存到数组([])
List<Map<String,Object>> 返回值就是第一个泛型的类型 集合类默认存集合({})
展示sql使用log4g

主配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC"-//[mybatis.org//DTD](http://mybatis.org//DTD) Config 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-config.dtd"];>
<configuration>
    <properties resource="db.properties"/>
    <!--起别名  -->
     <typeAliases>
        <typeAlias alias="Dept" type="com.lanou.entity.Dept"/>
         <typeAlias alias="user" type="com.lanou.entity.User"/>
    </typeAliases>
    <!-- 与数据库的连接 -->
    <environments default="development">  -----默认的运行id
        <environment id="development">---运行id
            <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="com/lanou/entity/DeptMapper.xml" />
        <mapper resource="com/lanou/entity/UserMapper.xml" />
        
    </mappers>
</configuration>

子配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC"-//[mybatis.org//DTD](http://mybatis.org//DTD) Mapper 3.0//EN"
"[http://mybatis.org/dtd/mybatis-3-mapper.dtd"];>
<mapper namespace="com.lanou.dao.DeptDao">
<!-- id  是接口中的方法名  parameterType接口中参数 是全类名 resultType 返回值类型
  占位符:#{字段名}  等同于?
  注意事项: 任何SQL语句不要加分号 ;
  命名空间:接口的全类名
-->
    <insert id="add" parameterType="com.lanou.entity.Dept"  > -----添加
        insert into dept(dname,loc) values(#{dname},#{loc})
    </insert>
    <select id="findAll" resultType="com.lanou.entity.Dept">-----查询
       select * from dept
    </select>
    <select id="findById" parameterType="Integer" resultType="com.lanou.entity.Dept">----通过id查询
      select * from dept where deptno=#{id}
    </select>
    
    <update id="update" parameterType="com.lanou.entity.Dept">----更新
      update dept set dname=#{dname},loc=#{loc} where deptno=#{deptno}
    
    </update>
    <delete id="delete" parameterType="com.lanou.entity.Dept">-----删除
      delete from dept where deptno=#{deptno}
    </delete>
    
    <select id="findDnameByLoc" parameterType="String" resultType="com.lanou.entity.Dept">---查询  通过loc查dname
     select * from dept where loc=#{loc}
    </select>
    
    <select id="findDnameByLoc2" parameterType="String" resultType="Map">--同上    返回值不同 List<Map<String,Object>>
     select * from dept where loc=#{loc}
    </select>
    
    <!--动态sql  类似模糊查询 -->
    <select id="find2" resultType="com.lanou.entity.Dept">
      select  * from dept
      <where>
     <if test="dname!=null">
          and dname=#{dname}
     </if>
     <if test="loc!=null">
       and loc=#{loc}
     </if>
     </where>
     </select>
    </mapper>

数据库中字段和实体类中的属性不一致 写SQL要起别名 都是在子配置文件
第一种方法
select u.id u_id,u.name u_name,u.age u_age from user u
id name age数据库中字段名
u_id u_name u_age 是实体类中的属性
第二种方法

<resultMap type="user" id="map">
  <!-- 指定主键 -->
  <id column="id" property="u_id"/>
  <!--  普通字段-->
  <result column="name" property="u_name"/>
  <result column="age" property="u_age"/>
</resultMap>
<select id="find2" resultType="map">
select * from user u
</select>

表关系

首先,建立三张表 user info book
建立实体类

public class Book {
    private Integer b_id;
    private String b_nanme;
    private Info info;

public class Info {
    private int i_id;
    private String i_work;

public class User {
   private int id;
   private String name;
   private int age;
 
   //对一
   private Info info;
   //   对多
   private Set<Book> book;
  

省略上面的set get方法以及toString方法

对一关系

在UserMapper.xml中

<!-- 对一 -->
<!-- <resultMap type="com.lanou.entity.User" id="u">
user表
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="age" property="age"/>

  info 对一关系:association
            property 对象中的属性
            javaType:指定对象与对象之间的关系
            id标签:声明表中的主键
            result标签:声明表中普通字段

  <association property="info" javaType="com.lanou.entity.Info">
   <id column="i_id" property="i_id"/>
   <result column="i_work" property="i_work"/>
  </association>
</resultMap>
<select id="find" resultMap="u">
select u.id ,u.name,u.age,i.i_id,i.i_work from user u left join info i on u.i_id=i.i_id
</select>

测试

//@Test
    public void testsel() throws IOException{
        //加载主配置文件
                Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
                //创建SqlSessionFactoryBuilder
                SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
                //创建session工厂
                SqlSessionFactory sessionFactory=sessionFactoryBuilder.build(reader);
                //利用工厂开始session
                SqlSession session=sessionFactory.openSession();
                List<User> list=session.selectList("user.find");
                System.out.println(list);
        
    }

对多关系

<resultMap type="com.lanou.entity.User" id="boo">
<!--  user表-->
<id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="age" property="age"/>
  <!--book  -->
<collection property="book" ofType="com.lanou.entity.Book">
<id column="b_id" property="b_id"/>
<result column="b_name" property="b_nanme"/>
</collection>
</resultMap>
<select id="findall" resultMap="boo">
select u.id ,u.name,u.age,b.b_id,b.b_name from user u left join book b on u.id=b.u_id
</select>

测试

@Test
    public void testsel1() throws IOException{
        //加载主配置文件
                Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
                //创建SqlSessionFactoryBuilder
                SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
                //创建session工厂
                SqlSessionFactory sessionFactory=sessionFactoryBuilder.build(reader);
                //利用工厂开始session
                SqlSession session=sessionFactory.openSession();
                List<User> list=session.selectList("user.findall");
                System.out.println(list);
        
    }

模糊查询语句

<!-- 模糊查询 语法:'%'||#{模糊字段}||'%',其中||代表"连接符" -->
<select id="queryLike" resultType="com.lanou.entity.Emp" parameterType="String">
select * from emp where ename like '%'||#{ename}||'%'
</select>

mybatis框架就是连接数据库,做增删改查,我觉得最重要的就是sql语句,只要sql语句正确,其他的问题也就都不是问题了,在ssm项目中都不用单独建立mybatis的配置文件,之间在Spring的配置文件中写就可以,Spring中可以很好的整合mybatis框架. 重点是mapper文件 重点是mapper文件重点是mapper文件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容