使用jdbc操作数据库有以下缺点    

  |--数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁开启和关闭,造成数据源资源浪费,影响数据库性能。        

    设想:使用数据库连接池管理数据库连接。    

  |--将sql语句硬编码到Java代码中,如果sql语句修改,需要重新编译Java源码,不利于系统维护。        

    设想:将sql语句配置在xml文件中,即使sql变化,不需要对Java代码进行重新编译    

  |--向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码,不利于系统维护。        

    设想:将sql语句和占位符号和参数 全部配置在xml文件中    

  |--从resultSet中遍历结果集resultSet时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。        

    设想:将查询的结果集,自动映射成Java对象。

1.mybaits是什么?    

  1.1 mybatis是一个持久层框架,是Apache下的顶级框架。后来托管到googlecode下面,再后来托管到github下。    

  1.2 mybatis让程序员主要把精力放在sql上,通过mybaits提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql) 满足需求的sql语句。    

  1.3 mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象(输出映射)。

2.mybaits原理    

  2.1 SqlMapConfig.xml(是mybatis的全局配置文件,名称是不固定的)         

    配置了数据源、事务等mybaits环境         

    配置映射文件(配置sql语句)  mapper.xml  mapper.xml ....    

  2.2 SqlSessionFactory(会话工厂),根据配置文件创建工厂         

    作用:创建SqlSession    

  2.3 SqlSession(会话):是一个接口,面向用户(程序员)的接口         

    作用:操作数据库(发出sql 增、删、改、查)    

  2.4 Executor(执行器):是一个接口(基本执行器、缓存执行器)         

    作用:SqlSession通过执行器操作数据库    

  2.5 mapper statement(底层封装对象)         

    作用:对操作数据库进行存储封装,包括sql语句、输入参数、输出结果类型。           

      --输入参数类型: Java简单类型、hashmap、pojo自定义           

      --输出结果类型:  java简单类型、hashmap、pojo自定义    

  2.6 数据库

3. mybaits的jar包 3.2.7版本

https://github.com/mybatis/mybatis-3/releases

  lib下: 依赖包  log4j日志包   cglib.jar(动态代理的jar包)

   mybaits-3.2.7.jar : 核心包

数据库驱动包

示例代码

1. sql-map-config.xml

<configuration>

  <!--和Spring整合以后,environments配置将废除-->

  <environments default="development">

    <environment id="development">

      <!--使用jdbc事物管理,事务由mybatis控制-->

      <transactionManager type="JDBC">

     <!--数据库连接池,由mybatis控制-->

      <dataSource type="POOLED">

        <property name="driver" value="com.mysql.jdbc.Driver"/>

        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>

        <property name="username" value="root"/>

        <property name="password" value="root"/>

          </dataSource>

    </environment>

  <environments>

  <!--加载配置文件mapper.xml-->

  <mappers>

    <mapper resource="sqlmap/user.xml"/>

    <mapper resource="sqlmap/user-mapping.xml"/>

  </mappers>

</configuration>

2. user-mapping.xml

  namespace命名空间,作用就是对sql进行分类管理,理解sql隔离

  注意:使用mapper代理方法开发,namespace有着特殊重要的作用

<mapper namespace="test">

  <!--  在映射文件中配置很多的sql语句

    需求:通过id查询用户表的记录  通过select语句执行数据库查询

        id:标识映射文件中的sql  将sql语句封装到mapperStatement中去,所以将id称为statement的id

        parameterType;指定输入参数的类型,这里指定int类型

      #{}表示一个占位符号

      #{id}:其中的id表示接收输入的参数,参数名称就是id,如果输入参数是简单数据类型,参数名称可以任意命名,比如value或者其他名称。

      resultType:指定sql输出结果的所映射的Java对象类型,select指定resultMap表示将单条记录映射成java对象。  -->

  <select id="findUserById" parameterType="int" resultType="cn.itcast.po.User">

      select * from user where id = #{id}

  </select>

  <!--  需求:根据用户名称迷糊查询用户信息,可能返回多条

      resultType:指定就是单条记录所映射的java对象类型

      ${}: 表示拼接sql串,将接收到参数的内容不添加任何修饰,拼接在sql中   ==>${}拼接sql,就会引起一个问题,sql注入

      ${value}:接收输入参数的类型,如果传入类型是简单类型,${}中只能使用value.  -->

  <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.po.User">

      select * from user where name like '%${value}%'

  </select>

  <!--  添加用户,返回插入数据的主键值(MySQL/Oracle)

      parameterType:指定输入参数pojo数据类型(包括用户信息)

      #{}: 指定pojo的属性名,接收到pojo的对象的属性值。mybatis通过OGNL获取对象的属性值  -->

      <insert id="insertUser" parameterType="cn.itcast.po.User">

        <!--1. MySQL 自增主键返回 -->

        <!--将插入数据的主键返回,返回到User对象中

          Select LAST_INSERT_ID():得到刚刚insert进去记录的值,只适用于mysql自增主键

          keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性

          order: Select LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序

          resultType:指定Select LAST_INSERT_ID()的结果类型   -->

        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">

            Select LAST_INSERT_ID();

        </selectKey>

        insert into user(name, age, sex, birthday)

              values(#{name}, #{age}, #{sex}, #{birthday})

      <!--2. MySQL 非自增主键返回:使用mysql的uuid()生成主键

        执行过程:首先通过uuid()得到主键,将主键设置到user对象的id属性中

             其次在insert执行之前,从user对象中取出id的属性值   -->

        <!--   <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">

              Select UUID();

           </selectKey>

             insert into user(id, name, age, sex, birthday)

                 values(#{id}, #{name}, #{age}, #{sex}, #{birthday})   -->

       <!--3. ORACLE 主键返回:通过oracle的序列生成主键

         执行过程:首先通过 序列名.nextVal 得到主键,将主键设置到user对象的id属性中

              其次在insert执行之前,从user对象中取出id的属性值   -->

       <!--   <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">

              Select 序列名.nextval;

          </selectKey>

          insert into user(id, name, age, sex, birthday)

                  values(#{id}, #{name}, #{age}, #{sex}, #{birthday})   -->

           </insert>

  <!--  根据id删除用户  -->

  <delete id="deleteUserById" parameterType="java.lang.Integer">

    delete from user where id = #{id}

  </delete>

  <!--  根据id更新用户  分析:需要传入用户的id

      需要传入用户的更新信息

      parameterType: 指定user对象,包括id和更新信息,注意:id 必须存在

      #{id} : 从输入user对象中获取id属性值  -->

  <update id="updateUserById" parameterType="cn.itcast.po.User">

      update user

      set name = #{name}, age = #{age}, sex = #{sex}, birthday = #{birthday}

      where id = #{id}

  </update>

</mapper>

3. 测试代码

  1 public void findUserByIdTest(){
2 //mybatis配置文件
3 String resource = "sqlMapConfig.xml";
4
5 //得到配置文件流
6 InputStream inputStream = Resources.getResourceAsStream(resource);
7
8 //创建会话工厂,传入mybatis的配置文件信息
9 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(inputStream);
10
11 //通过工厂得到sqlSession
12 SqlSession sqlSession = sqlSessionFactory.openSession();
13
14 //通过sqlSession操作数据库
15 //第一个参数:映射文件中statement的id,命名规则: namespace + "." + statement的id
16 //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
17 //sqlSession.selectOne结果是与映射文件中匹配的resultType类型的对象
18 User user = sqlSession.selectOne("test.findUserById", 1);
19
20 System.out.println(user);
21
22 //释放资源
23 sqlSession.close();
24 }
25
26
27 public void findUserByNameTest(){
28 //mybatis配置文件
29 String resource = "sqlMapConfig.xml";
30
31 //得到配置文件流
32 InputStream inputStream = Resources.getResourceAsStream(resource);
33
34 //创建会话工厂,传入mybatis的配置文件信息
35 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(inputStream);
36
37 //通过工厂得到sqlSession
38 SqlSession sqlSession = sqlSessionFactory.openSession();
39
40 //通过sqlSession操作数据库
41 //list中的User和映射文件中resulType所指定的类型一致
42 List<User> users = sqlSession.selectList("test.findUserByName", "小明");
43
44 System.out.println(users);
45
46 //释放资源
47 sqlSession.close();
48 }
49
50
51 public void insertUserTest(){
52 //mybatis配置文件
53 String resource = "sqlMapConfig.xml";
54
55 //得到配置文件流
56 InputStream inputStream = Resources.getResourceAsStream(resource);
57
58 //创建会话工厂,传入mybatis的配置文件信息
59 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(inputStream);
60
61 //通过工厂得到sqlSession
62 SqlSession sqlSession = sqlSessionFactory.openSession();
63
64 //插入用户对象
65 User user = new User();
66 user.setName("小明");
67 user.setAge(24);
68 user.setSex("女");
69 user.setBirthday(new Date());
70
71 sqlSession.insert("test.insertUser", user);
72
73 //提交事务
74 sqlSession.commit();
75
76 //获取用户信息主键
77 System.out.println(user.getID());
78
79 //释放资源
80 sqlSession.close();
81 }
82
83 public void deleteUserTest(){
84 //mybatis配置文件
85 String resource = "sqlMapConfig.xml";
86
87 //得到配置文件流
88 InputStream inputStream = Resources.getResourceAsStream(resource);
89
90 //创建会话工厂,传入mybatis的配置文件信息
91 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(inputStream);
92
93 //通过工厂得到sqlSession
94 SqlSession sqlSession = sqlSessionFactory.openSession();
95
96 //根据用户id删除用户
97 sqlSession.delete("test.deleteUserById", 4);
98
99 //提交事务
100 sqlSession.commit();
101
102 //释放资源
103 sqlSession.close();
104 }
105
106
107 public void updateUserTest(){
108 //mybatis配置文件
109 String resource = "sqlMapConfig.xml";
110
111 //得到配置文件流
112 InputStream inputStream = Resources.getResourceAsStream(resource);
113
114 //创建会话工厂,传入mybatis的配置文件信息
115 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder.build(inputStream);
116
117 //通过工厂得到sqlSession
118 SqlSession sqlSession = sqlSessionFactory.openSession();
119
120 User user = new User();
121 user.setId(21);
122 user.setName("小明");
123 user.setAge(24);
124 user.setSex("女");
125 user.setBirthday(new Date());
126
127
128 //根据用户id更新用户信息
129 sqlSession.update("test.updateUserById", user);
130
131 //提交事务
132 sqlSession.commit();
133
134 //释放资源
135 sqlSession.close();
136 }

4.  总结

  4.1 parameterType: 在映射文件中通过parameterType指定输入参数的类型。

  4.2 resultType: 在映射文件中通过parameterType指定输入结果的类型。

  4.3 #{}: 表示一个占位符号    #{}接收输入参数,类型可以是简单类型、pojo、hashmap

       如果是简单类型,#{}可以写成value或者其他名称

      #{}如果接收pojo对象值,通过OGNL读取对象的属性值,通过属性.属性.属性...方式获取对象属性值。

  4.4 ${}: 表示一个拼接符号,会引起sql注入问题,不建议使用

      ${}接收输入参数,类型可以是简单类型、pojo、hashmap

        如果是简单类型,${}只可以写成value

        ${}如果接收pojo对象值,通过OGNL读取对象的属性值,通过属性.属性.属性...方式获取对象属性值。

  4.5 selectOne:表示查询出一条记录进行映射。如果使用selectList也可以实现(list中只有一条记录)

  4.6 selectList:表示查询出一个列表(多条记录)进行映射。

   4.7 添加用户主键返回MySQL 、Oracle

 1 --MySQL 主键自增,执行insert提交之后自动生成一个自增主键。
2 --通过mysql的函数获取到刚刚插入记录的自增主键。
3 LAST_INSERT_ID();是insert之后调用此函数。
4 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
5 Select LAST_INSERT_ID();
6 </selectKey>
7 insert into user(name, age, sex, birthday)
8 values(#{name}, #{age}, #{sex}, #{birthday})
9
10 --MySQL 非自增主键返回(使用uuid())
11 --通过mysql的UUID()查询到主键,修改表中的id字段类型为String,长度设置为35位。
12 --执行思路:先通过uuid()查询到主键,将主键输入到sql语句中。
13 --执行uuid()语句顺序,是相对于insert语句之前执行。
14 <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
15 Select UUID();
16 </selectKey>
17 insert into user(id, name, age, sex, birthday)
18 values(#{id}, #{name}, #{age}, #{sex}, #{birthday})
19
20 --oracle主键返回: 通过oracle的序列生成主键
21 --执行思路: 先通过 序列名.nextval 得到主键,将主键输入到sql语句中。
22 --执行 序列名.nextval 语句顺序,是相对于insert语句之前执行。
23 <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
24 Select 序列名.nextval;
25 </selectKey>
26 insert into user(id, name, age, sex, birthday)
27 values(#{id}, #{name}, #{age}, #{sex}, #{birthday})

5. mybatis和Hibernate的本质区别和应用场景      

    Hibernate:是一个标准的ORM框架(对象关系映射),入门门槛较高,不需要程序员写sql,sql语句自动生成了。                  

          对sql语句进行优化和修改比较困难。      

      应用场景:适用于需求变化不多的中小型项目,比如:后台管理系统、erp、oa、orm。

     Mybatis:专注于sql本身,需要程序员自己写sql语句,sql修改和优化比较方便。                 

        Mybatis是一个不完全的ORM框架,虽然程序员自己写sql,但是可以实现映射(输入映射、输出映射)     

     应用场景:适用于需求变化较多的项目,比如:互联网项目。

  

mybatis3.2.7 原理和入门程序的更多相关文章

  1. 1.struts2原理和入门程序

    Struts2是一个MVC的Web应用框架,是在Struts1和WebWork发展起来的,以WebWork为核心,采取拦截器机制来处理用户请求. 原理图: 分析步骤: 1.用户发送一个请求 2.请求的 ...

  2. springmvc(一) springmvc框架原理分析和简单入门程序

    springmvc这个框架真的非常简单,感觉比struts2还更简单,好好沉淀下来学习~ --WH 一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解 ...

  3. Mybatis入门程序

    作为一个java的学习者,我相信JDBC是大家最早接触也是入门级别的数据库连接方式,所以我们先来回忆一下JDBC作为一种用于执行SQL语句的Java API是如何工作的.下面的一段代码就是最基本的JD ...

  4. MyBatis - 介绍、简单入门程序

    JDBC编程中的问题     1. 将SQL语句硬编码到Java代码,不利于系统维护.         设想如何解决:将SQL单独抽取出来,在配置文件(xml方式.properties文件)进行配置. ...

  5. JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明

    1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...

  6. 01-java前言、入门程序、变量、常量

    今日目标 能够计算二进制和十进制数之间的互转 能够使用常见的DOS命令 理解Java语言的跨平台实现原理 jvm是运行java程序的假想计算机,所有的java程序都运行在它上面.java编写的软件可以 ...

  7. SpringMVC学习(一)———— springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  8. springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  9. mybatis由浅入深day01_4入门程序_4.6根据用户id(主键)查询用户信息

    4 入门程序 4.1 需求 根据用户id(主键)查询用户信息 根据用户名称模糊查询用户信息 添加用户 删除 用户 更新用户 4.2 环境 java环境:jdk1.7.0_72 eclipse:indi ...

随机推荐

  1. 批量修改datafram中某一列

    如要对df中列名为“values”的值做修改,大于等于50改为1,小于50改为0,可用apply函数来实现: def fun(x): if x >= 50: return 1 else: ret ...

  2. 严谨与特色并行——WSDM 2015大会见闻记

    2015大会见闻记" title="严谨与特色并行--WSDM 2015大会见闻记"> 第8届ACM网络搜索与数据挖掘会议(ACM International Co ...

  3. CentOS7使用firewalld管理防火墙与端口

    firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status fir ...

  4. 金矿还是大坑 VR创业真有那么美好?

    VR创业真有那么美好?"> 近段时间,一个段子在疯狂流传:彩票中奖的1000万,其实是存放在银行里,而彩民每次花两块钱买彩票,其实就是去输一次密码,只要够坚持,总会取出那1000万-- ...

  5. JavaScript 语言精粹笔记3

    方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...

  6. 从Instagram“宁静、规则”的成功 看国内APP发展之路

    看国内APP发展之路" title="从Instagram"宁静.规则"的成功 看国内APP发展之路"> Instagram在全球获得的巨大成功 ...

  7. 从赴美IPO绝迹 看那些烧成泡沫的互联网企业

    曾经,赴美上市是很多中国企业的终极梦想.然而在当下,随着中概股在美国股市股价的不断走低.中国赴美上市企业私有化速度的加快,大众才发现,原来美国股市并不是那么好混的.但不管怎样,赴美上市始终是一种荣耀. ...

  8. 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用

    你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...

  9. Web 通信技术 ——跨文档信息传输(JavaScript)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.html * 作者:常轩 * 微信公众号:Worldh ...

  10. CSS——NO.4(继承、层叠、特殊性、重要性)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...