博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis教程(二):概念总结
阅读量:4983 次
发布时间:2019-06-12

本文共 11978 字,大约阅读时间需要 39 分钟。

一、注意规范

注意:(1).XXXmapper.xml 文件中的 namespace 等于mapper 接口地址

           (2).XXXmapper.java 接口中的方法输入参数和 mapper.xml 中statement的parameterType指定的  类型一致。

           (3) .mapper.java 接口中的方法的返回值类型和mapper.xml中statement的resultType指定的类型一致

 

二、配置文件及标签介绍

1. properties 介绍

可以将数据连接单独配置在 db.properties 中改善硬编码,其他配置文件引用该文件。内容示例:

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.password=root

 

2.核心配置 SqlMapConfig.xml 标签介绍

标签种类:

        1. properties(属性)

      2. settings(全局配置参数): 可以调整一些运行参数:开启二级缓存、开启延迟加载等。会影响mybatis的运动行为

      3. typeAiases(类型别名):指定输入输出类型较不方便,可以针对 parameterType、resourceType 指定的类型定义一些别名

      3.1 默认支持的别名

别名 _byte _long _short _int _integer _double _float _boolean string byte
类型 byte long short int int doouble float boolean String Byte
别名 long short int integer double float boolean data decimal bigdecimal
类型 Long Short Integer Integer Double Float Boolean Data BigDecimal BigDecimal

      3.2 自定义别名

        4. typeHandlers(类型处理器):完成 jdbc 类型和 java 类型的转换

        5. objectFactory(对象工厂)

        6. plugins(插件)

        7. environments(环境集合属性对象)mappers(映射器)

                 7.1 environment (环境子属性对象)

                 7.2 transactionManager(事务管理)

                7.3 datasource(数据源)

        8.mapper(映射器)

 

三、输入、输出 映射

1.输入映射:通过 parameterType 指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型

        如需要查询的条件较复杂,可以使用自定义的包装类型 pojo ,将复杂的查询条件包含进去

1.1 复杂的包装类 UserQueryVo 示例

public class UserQueryVo {     //这里包装其它的查询条件     //用户查询条件     private UserCustom userCustom;      public UserCustom getUserCustom() {         return userCustom;     }      public void setUserCustom(UserCustom userCustom) {         this.userCustom = userCustom;     }  }

 

1.2 再复杂一下 UserCustom.java 示例

public class UserCustom extends User{    //可以扩展用户的信息}

 

1.3 配置文件 UserMapper.xml 定义综合查询示例

 

1.4 UserMapper.java 示例

public interface UserMapper {    // 用户信息综合查询    public List
findUserList(UserQueryVo userQueryVo);}

 

1.5  Junit 测试代码

1 ackage com.mybatis.dao.test; 2  3 import java.io.InputStream; 4 import java.util.Date; 5 import java.util.List; 6  7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory;10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;11 import org.junit.Before;12 import org.junit.Test;13 14 import com.mybatis.entity.User;15 import com.mybatis.entity.UserCustom;16 import com.mybatis.entity.UserQueryVo;17 import com.mybatis.mapper.UserMapper;18 19 public class UserMapperTest {20 21     private SqlSessionFactory sqlSessionFactory;22 23     // 此方法是在执行findUserByIdTest之前执行24     @Before25     public void setUp() throws Exception {26         String resource = "SqlMapConfig.xml";27         InputStream inputStream = Resources.getResourceAsStream(resource);28         // 创建SqlSessionFcatory29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);30     }31     32     @Test33     public void testFindUserList() {34         SqlSession sqlSession = sqlSessionFactory.openSession();35         //创造查询条件36         UserQueryVo userQueryVo = new UserQueryVo();37         UserCustom userCustom = new UserCustom();38         userCustom.setSex("2");39         userCustom.setUsername("小");40         userQueryVo.setUserCustom(userCustom);41         // 创建Usermapper对象,mybatis自动生成mapper代理对象42         UserMapper mapper = sqlSession.getMapper(UserMapper.class);43         List
list=mapper.findUserList(userQueryVo);44 System.out.println(list);45 sqlSession.commit();46 sqlSession.close();47 }48 }
UserMapperTest

 

 

2.输出映射:只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功

    (如果查询出来的列名和 pojo 中属性名只要有一个一致,就会创建 pojo 对象,只有全部不一样才会不创建对象)

2.1 输出简单类型:只有输出的结果只有一行一列才可以使用

2.1.1 UserMapper.xml 

 

2.1.2 UserMapper.java

public interface UserMapper {     //用户信息综合查询总数     public int findUserCount(UserQueryVo userQueryVo); }

 

2.1.3 junit 测试

1 package com.mybatis.dao.test; 2  3 import java.io.InputStream; 4 import java.util.Date; 5 import java.util.List; 6  7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory;10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;11 import org.junit.Before;12 import org.junit.Test;13 14 import com.mybatis.entity.User;15 import com.mybatis.entity.UserCustom;16 import com.mybatis.entity.UserQueryVo;17 import com.mybatis.mapper.UserMapper;18 19 public class UserMapperTest {20 21     private SqlSessionFactory sqlSessionFactory;22 23     // 此方法是在执行findUserByIdTest之前执行24     @Before25     public void setUp() throws Exception {26         String resource = "SqlMapConfig.xml";27         InputStream inputStream = Resources.getResourceAsStream(resource);28         // 创建SqlSessionFcatory29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);30     }31     32     @Test33     public void findUserCountTest() {34         SqlSession sqlSession = sqlSessionFactory.openSession();35         //创造查询条件36         UserQueryVo userQueryVo = new UserQueryVo();37         UserCustom userCustom = new UserCustom();38         userCustom.setSex("2");39         userCustom.setUsername("小");40         userQueryVo.setUserCustom(userCustom);41         // 创建Usermapper对象,mybatis自动生成mapper代理对象42         UserMapper mapper = sqlSession.getMapper(UserMapper.class);43         int count=mapper.findUserCount(userQueryVo);44         System.out.println(count);45         sqlSession.commit();46         sqlSession.close();47     }48 }
UserMapperTest

 

2.2 输出 pojo 对象和 pojo 列表:单个或列表,在 mapperType 类型是一样的,在 mapper.java 中返回值不一样

2.2.1 方法返回值区别示例

public interface UserMapper {         /** 根据ID查询用户信息 */    // 返回单个     public User findUserById(int id);     /** 根据用户名称模糊查询用户信息 */    // 返回列表     public List
findUserByName(String username); }

 

2.2.2 使用 resoultMap 作为输出映射类型

        定义 resoultMap

 

        使用 resoultMap 

 

        UserMapper.java示例

public interface UserMapper {    /** 根据ID查询用户信息,使用resultMap进行输出 */    public User findUserByIdResultMap(int id);}

 

        Junit 测试示例

1 package com.mybatis.dao.test; 2  3 import java.io.InputStream; 4 import java.util.Date; 5 import java.util.List; 6  7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory;10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;11 import org.junit.Before;12 import org.junit.Test;13 14 import com.mybatis.entity.User;15 import com.mybatis.entity.UserCustom;16 import com.mybatis.entity.UserQueryVo;17 import com.mybatis.mapper.UserMapper;18 19 public class UserMapperTest {20 21     private SqlSessionFactory sqlSessionFactory;22 23     // 此方法是在执行findUserByIdTest之前执行24     @Before25     public void setUp() throws Exception {26         String resource = "SqlMapConfig.xml";27         InputStream inputStream = Resources.getResourceAsStream(resource);28         // 创建SqlSessionFcatory29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);30     }31     32     @Test33     public void testFindUserByIdResultMap() {34         SqlSession sqlSession = sqlSessionFactory.openSession();35         // 创建Usermapper对象,mybatis自动生成mapper代理对象36         UserMapper mapper = sqlSession.getMapper(UserMapper.class);37         User user = mapper.findUserByIdResultMap(1);38         System.out.println(user);39         sqlSession.close();40     }41 }
UserMapperTest

 

2.3 用 resultType 进行输出映射时,只有查询出来的列名和 pojo 中的属性名一致,该列才可以映射成功。如果不一致,可以通过定义一个 resultType 对列名和 pojo 属性名之间作为一个映射关系

 

四、

1.动态SQL:mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对SQL进行拼接、组装

        UserMapper.xml、Junit测试代码示例:

1 
5
UserMapper.xml

 

1 @Test 2     public void testFindUserList() { 3         SqlSession sqlSession = sqlSessionFactory.openSession(); 4         //创造查询条件 5         UserQueryVo userQueryVo = new UserQueryVo(); 6         UserCustom userCustom = new UserCustom(); 7 //        userCustom.setSex("2"); 8         //这里使用动态sql,如果不设置某个值,条件不会拼接sql中 9         userCustom.setUsername("小");10         userQueryVo.setUserCustom(userCustom);11         // 创建Usermapper对象,mybatis自动生成mapper代理对象12         UserMapper mapper = sqlSession.getMapper(UserMapper.class);13         List
list=mapper.findUserList(userQueryVo);14 //测试动态sql,属性的非空判断测试15 // List
list=mapper.findUserList(null);16 System.out.println(list);17 sqlSession.commit();18 sqlSession.close();19 }
testFindUserList

 

 

2. SQL片段:抽取动态sql,组成一个sql片段,方便重复调用

2.1 定义sql片段

and sex=#{userCustom.sex}
and username=#{userCustom.username}

 

2.2 在 mapper.xml 中定义的 statement 中引用sql片段

 

 

3. foreach:向 sql 传递数组或 list 时,mybatis 使用 foreach 解析

3.1 传入多个id的

1 package com.mybatis.entity; 2  3 import java.util.List; 4  5 /** 6  *  7  * @ClassName: UserQueryVo 8  * @Description: TODO(包装类型) 9  * @author warcaft10  * 11  */12 public class UserQueryVo {13 14     public List
ids;15 16 public List
getIds() {17 return ids;18 }19 20 public void setIds(List
ids) {21 this.ids = ids;22 }23 }
UserQueryVo .java

 

3.2 mapper.xml :实现两条不同sql示例

1 
4
mapper.xml
1 
4 5
mapper.xml

 

3.3 UserMapper.java 示例

1  public interface UserMapper {2      //ids查询用户数据3      public List
findUserByIds(UserQueryVo userQueryVo);4 }

3.4 Junit 测试代码示例

1 @Test 2     public void findUserByIdsTest() { 3         SqlSession sqlSession = sqlSessionFactory.openSession(); 4         // 创建Usermapper对象,mybatis自动生成mapper代理对象 5         UserMapper mapper = sqlSession.getMapper(UserMapper.class); 6         //创造查询条件 7         UserQueryVo userQueryVo = new UserQueryVo(); 8         //传入多个id 9         List
ids=new ArrayList
();10 ids.add(1);11 ids.add(2);12 ids.add(3);13 //将ids通过userQueryVo传入statement中14 userQueryVo.setIds(ids);15 //调用userMapper的代码16 List
userList= mapper.findUserList(userQueryVo);17 System.out.println(userList);18 sqlSession.close();19 }
findUserByIdTest.java

 

最后:这两篇随笔参考和引用了传智播客的资料和代码,尤其是(二),写的时候比较匆忙。写这两篇仅仅是为了便于自己以后查阅而已。

转载于:https://www.cnblogs.com/Lemon-i/p/8393537.html

你可能感兴趣的文章