Mybatis框架总结

姓名 连嘉玮 学号 16040120089

转自:http://www.jianshu.com/p/4509cb9d266f?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=qq

有删节

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

【嵌牛鼻子】:增加 更新 删除 都是无返回值 编译速度块 执行效率高

【嵌牛提问】: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阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容