1、mybatis

mybatis是一个自定义sql、存储过程和高级映射的持久层框架,是Apache下的顶级项目。

mybatis可以让程序员将主要精力放在sql上,通过mybatis提供的映射方式。自由灵活生成满足需要的sql。

mybatis可以将向prepareStatement中的输入参数自动进行输入映射,将查询结果集自动映射成Java对象。

2、mybatis框架

3、最主要的配置文件SqlMapConfig.xml

配置数据库连接等。

映射文件

映射文件命名方式(来自ibatis命名),mapper代理开发映射文件名称叫xxxMapper.xml,在映射文件中配置sql。

全局配置文件内容如下:

properties(属性):可以将连接数据库的值编写在另一个配置文件中,如db.properties,然后再加载该配置文件。

settings(全局配置参数)

typeAliases(类型别名):在mapperxml定义了很多的statement,ParameterType和resultType的名字比较长,可以使用别名重新定义

typeHandlers(类型处理器)

ObjectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器):可以单个加载映射文件(resource),也可以通过mapper接口加载映射文件

4、实例演示

功能:MySQL中有一个user表,通过ID来查询user和通过name来模糊查询user。

(1)配置SqlMapConfig.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
    <!--和spring整合后environment配置将废除  -->
    <environments default="development">
        <environment id=development>
        <!-- 使用jdbc事务管理,事务控制由mybatis -->
            <transactionManager type="JDBC"></transactionManager>
        <!-- 数据库连接池,由mybatis管理 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/databasename"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql"/>
            </dataSource>    
        </environment>
    </environments>
        <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="resources/mapper/UserMapper.xml" />
    </mappers>
</configuration>

(2)配置UserMapper.xml。各种sql的使用都在这里来映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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" >
<!--namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 不同表可以施工不同的命名空间
注意:使用mapper代理方法开发,namespace就有特殊重要的作用
 -->
<mapper namespace="test" >
    <!--在映射文件中配置很多sql语句  -->
    <!--通过select执行数据库查询
    ID:标识映射文件中的sql,将sql语句封装到mapperStatement对象中,所以id就是statement的id
    parameterType:指定输入参数类型,这个根据数据库字段类型来的
    #():标识一个占位符
    #(id):其中id表示接收输入参数。参数名称就是id,如果输入参数是简单类型,#()中的参数名词可以任意,可以是value或者其他
    resultType:指定sql输出结果集所映射的Java对象。
      -->
      <select id="findById" parameterType="int" resultType="com.hust.wt.model.User">
        select * from user where id=#();
      </select>
        <!--
      resultType指定的就是单条记录所映射的Java对象类型
      ${}:表示拼接sql串,将接收到参数的内容不叫任何修饰【拼接在sql中。使用${}会引起sql注入
      ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能是value
        -->
      <select id="findByName" parameterType="java.lang.String" resultType="com.hust.wt.model.User">
        select * from user where name like ‘%${value}%’;
      </select>
</mapper>

(3)测试程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestOne {
 
    @Test
    public void findByIdTest() throws IOException{
        //mybatis的配置文件
        String resource = "conf/SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SQlSession来操作数据库
        //第一个参数statement:映射文件statement的id,等于=命名空间+‘。’+statement的id,
        //第二个参数Parameter指定和映射文件中所匹配的ParameterType类型的参数
        //返回的结果就是映射文件中的resultType类型的对象
        User user=sqlSession.selectOne("test.findById"1);
        System.out.println(user);
 
        //释放资源
        sqlSession.close();
    }
}

整个执行过程就可以使用debug来走一遍。

对于第二个select,就是另一个不同的需求,可以在写一个test方法来测试,这里忽略。

(4)小结

  • parameterType:输入参数类型

  • resultType:指定输出结果的类型

  • #{}:#{}代表占位符,类型可以是简单类型,model(pojo类)、HashMap。使用其接受pojo对象值是通过OGNL读取对象中的属性值。如果pojo中还有pojo类,那么就是user.user.username来读取属性值,即属性.属性。

  • ​${}是拼接符号,拼接sql语句,但是这会引起sql注入

  • selectOne表示查询出一条记录进行映射,如果使用selectOne那么也可以使用selectList(列表记录为1条)

  • selectList表示查询出一个列表(多条记录)进行映射。但不能使用selectOne来替代。

(5)扩展功能

添加用户:在UserMapper.xml中添加insert

1
2
3
4
<!-- 添加用户 parameterType为model类型是复杂对象  -->
      <insert id="insertUser" parameterType="com.hust.wt.model.User" >
        insert into user(id,name,password,age) value(#{id},#{name},#{password},#{age})
      </insert>

在测试程序中需要 提交事务sqlSession.commit();

删除用户和更新用户:在UserMapper.xml中添加

1
2
3
4
5
6
7
<delete id="deleteUser" parameterType="java.lang.Integer">
       delete from user where id=#{id}
     </delete>
      
     <update id="updateUser" parameterType="com.hust.wt.model.User">
       update user set name=#{name}, password=#{password},age=#{age},where id=#{id}
     </update>

(6)hibernate和mybatis的区别

hibernate:是一个标准ORM框架(对象关系映射)入门门槛较高,不需要写sql语句,自动生成sql语句。对sql的优化和修改会比较困难

使用场景:适用需求变化不多的中小型项目,比如ERP,ORM,OA等。

mybatis:专注的是sql本身,需要程序员自己去编写sql语句,便于语句的优化和修改。mybatis可以裂解成一个不完全的ORM框架,虽然程序员可以自己写sql,也可以实现映射(输入输出)。

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

5、mapper代理开发dao

使用mapper代理开发则需要编写mapper.xml映射文件和mapper.java接口,还需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

开发规范:

(1)在mapper.xml中namespace等于mapper接口地址。

1
2
3
4
<!--namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 不同表可以施工不同的命名空间
注意:使用mapper代理方法开发,namespace就有特殊重要的作用,namespace等于mapper接口地址
 -->
<mapper namespace="com.hust.wt.mapper.UserMapper" >

(2)mapper.java接口中的方法名和mapper.xml中的statement的id一致

(3)mapper.java接口中的方法输入参数类型和mapper.xml中的statement的ParameterType一致

(4)mapper.java接口中的方法输入参数类型和mapper.xml中的statement的resultType一致

所有的开发规范就是对一些重复代码的封装,进行统一的生成:

User user=sqlSession.selectOne("test.findById", id);

sqlSession.insert("test.insertUser", user);

使用mapper代理的方式就不需要再写dao的实现类了。只需实现mapper接口就行。

就相当于dao接口,dao接口的方法定义满足mapper的开发规范要求,然后在mapper中namespace设置成dao的地址即可。

所有的mapper.xml文件都要在总的配置文件中SqlMapConfig.xml加载。

mapper接口方法参数只能有一个,这并不会影响系统的开发,可以使用包装类型的pojo来满足不同的业务方法的需求。

6、输出映射

resultType:需要列名和属性名一致

resultMap:当查询出的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系。

7、动态SQL

对sql语句的灵活使用。where和if标签的灵活使用可以让sql语句拼接起来。如下表示,如果userCustom不为null则将条件user.sex=#{userCustom.sex}加入select语句中,如果为null则不在查询条件内。

我们还可以将上边的sql判断代码段抽取出来,组成一个sql片段,这样其他的statement中就可以引用该sql片段。

(1)定义sql片段(mapper.xml)

(2)引用片段

8、foreach

如果需要向sql中传递数组或list时,就需要使用到foreash。

例如用户查询列表中增加多个id输入查询。

select * from user where id=1 or id=2 or id=3...(id in(1,2,3))

(1)在输入参数类型中添加List<Integer>ids传入多个id。在输入参数的Vo中,添加List属性:

(2)修改mapperxml

实现sql语句拼接

实现sql语句拼接:

接触mybatis使用的更多相关文章

  1. MyBatis学习笔记(一)入门

    首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001    没事看看 - MyBatis工具:www.mybatis.t ...

  2. 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  3. mybatis 配置返回集合collection时只有一条记录

    查询语句配置如下: <select id="selectCustomerList" resultMap="CustomerDtoMap" paramete ...

  4. Mybatis.Net 整合 ODP.NET Managed

    初步接触MyBatis.Net的朋友,请先移步 MyBatis.Net 学习手记 1. 项目中先添加Oracle.ManagedDataAccess.dll程序集引用 2. MyBatis.Net 中 ...

  5. 初识Mybatis框架,实现增删改查等操作

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  6. mybatis与spring的整合(使用接口实现crud)

    本人刚刚接触mybatis,今天把它和spring整合起来用了一个上午==. 一开始是通过配置文件来配置,后来尝试用了一下注解,觉得mybatis的注解真的有点恶心...一大坨的,所以我还是建议使用配 ...

  7. mybatis入门配置和调试

    欢迎转载http://www.cnblogs.com/jianshuai520/p/8669177.html大家一起努力,如果看的时候有图片半边遮挡起来的话,右键查看图片,就可以观看完整的图片,具体怎 ...

  8. MyBatis动态sql之${}和#{}区别

    前言 ​ 接触mybatis也是在今年步入社会之后,想想也半年多了,缺没时间去系统的学习,只知道大概,也是惭愧. ​ 不知道有多少刚毕业的同学和我一样,到现在还没仔仔细细去了解你每天都会见到使用到的框 ...

  9. MyBatis正在爬的坑

    换了份工作,开始接触Mybatis,开一篇文章记录一下自己遇到的坑 2018-06-20 今天遇到了一个问题,编好的sql语句在数据库可以执行但是写到程序里边就GG,什么问题呢?一直纠结在程序哪里写错 ...

随机推荐

  1. SpringBoot入门篇--使用Thymeleaf模板引擎进行页面的渲染

    在做WEB开发的时候,我们不可避免的就是在前端页面之间进行跳转,中间进行数据的查询等等操作.我们在使用SpringBoot之前包括我在内其实大部分都是用的是JSP页面,可以说使用的已经很熟悉.但是我们 ...

  2. cs 更新

    CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...

  3. 显式锁(三)读写锁ReadWriteLock

    前言:   上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock.    ...

  4. 微信通过openID发送消息/后台post、get提交并接收数据

    控制器:下面是post发送消息(微信不支持从前台发送数据,之前试过,报错,需要跨域,跨域的问题解决后还不行,最后发现之后后端提交 WXApi类: #region 验证Token是否过期 /// < ...

  5. uva-10050-模拟水题

    一个社会研究组织决定通过一组简单的参数来模拟国家政党的行为.第一个参数一个正整数h(叫做罢工参数),用于指示在对应的政党在俩个连续休假之间的平均天数.虽然这个参数太简单了,它不是最完美的参数.但是它还 ...

  6. leetcode942

    public class Solution { public int[] DiStringMatch(string S) { var len = S.Length; ; var max = len; ...

  7. clip-path的任意元素的碎片拼接动效

    看了张大神的这篇文章后自己写的,兼容性不好clip-path要加-webkit- css #test img{position: absolute;} .active .clip{ will-chan ...

  8. Mysql 事件event_scheduler是OFF

    1 在查询窗口执行: SHOW VARIABLES LIKE 'event_scheduler' 查看是OFF 还是ON; 方式1: 修改.int配置文件 添加一行: event_scheduler ...

  9. 10 python 封装----@property的用法

    1.基本概念 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A ...

  10. vue深入了解组件——组件注册

    一.组件名 在注册一个组件的时候,我们始终需要给它一个名字.比如在全局注册的时候我们已经看到了: Vue.component('my-component-name', { /* ... */ }) J ...