接触mybatis使用

一、mybatisjava

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

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

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

二、mybatis框架sql

三、最主要的配置文件SqlMapConfig.xml数据库

配置数据库链接等。数组

映射文件mybatis

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

 

全局配置文件内容以下:框架

properties(属性):能够将链接数据库的值编写在另外一个配置文件中,如db.properties,而后再加载该配置文件。

settings(全局配置参数)

typeAliases(类型别名):在mapperxml定义了不少的statement,ParameterType和resultType的名字比较长,可使用别名从新定义

typeHandlers(类型处理器)

ObjectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

     environment(环境子属性对象)

          transactionManager(事务管理)

          dataSource(数据源)

mappers(映射器):能够单个加载映射文件(resource),也能够经过mapper接口加载映射文件

四、实例演示

功能: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,也能够实现映射(输入输出)。

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

五、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来知足不一样的业务方法的需求。

六、输出映射

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

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

七、动态SQL

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

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

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

(2)引用片断

八、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语句拼接: