一、注意规范
注意:(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 ListfindUserList(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 Listlist=mapper.findUserList(userQueryVo);44 System.out.println(list);45 sqlSession.commit();46 sqlSession.close();47 }48 }
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 }
2.2 输出 pojo 对象和 pojo 列表:单个或列表,在 mapperType 类型是一样的,在 mapper.java 中返回值不一样
2.2.1 方法返回值区别示例
public interface UserMapper { /** 根据ID查询用户信息 */ // 返回单个 public User findUserById(int id); /** 根据用户名称模糊查询用户信息 */ // 返回列表 public ListfindUserByName(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 }
2.3 用 resultType 进行输出映射时,只有查询出来的列名和 pojo 中的属性名一致,该列才可以映射成功。如果不一致,可以通过定义一个 resultType 对列名和 pojo 属性名之间作为一个映射关系
四、
1.动态SQL:mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对SQL进行拼接、组装
UserMapper.xml、Junit测试代码示例:
1 5
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 Listlist=mapper.findUserList(userQueryVo);14 //测试动态sql,属性的非空判断测试15 // List list=mapper.findUserList(null);16 System.out.println(list);17 sqlSession.commit();18 sqlSession.close();19 }
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 Listids;15 16 public List getIds() {17 return ids;18 }19 20 public void setIds(List ids) {21 this.ids = ids;22 }23 }
3.2 mapper.xml :实现两条不同sql示例
1 4
1 4 5
3.3 UserMapper.java 示例
1 public interface UserMapper {2 //ids查询用户数据3 public ListfindUserByIds(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 Listids=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 }
最后:这两篇随笔参考和引用了传智播客的资料和代码,尤其是(二),写的时候比较匆忙。写这两篇仅仅是为了便于自己以后查阅而已。