MyBatis学习笔记之一

1.MyBatis

在这里插入图片描述
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。

2.第一个MyBatis测试程序

1.导入包
在这里插入图片描述
2.配置mybatis-config.xml文件
在这里插入图片描述
配置文件内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/webdemo?serverTimezone=GMT" />
    <property name="username" value="root" />
    <property name="password" value="stoneSml@123" />
   </dataSource>
  </environment>
 </environments>
 <mappers>
  <mapper resource="org/mybatis/example/BlogMapper.xml" />
 </mappers>
</configuration>

3.编写需要测试的类

public class Employee {
 private Integer id;
 private String lastName;
 private String email;
 private String gender;
 /**省略get和set方法*/
}

测试类

class MyBatisTest {
 @Test
 void test() throws Exception{
  String resource = "mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  SqlSession openSessioin=sqlSessionFactory.openSession();  
  try {
   Employee employee=openSessioin.selectOne("com.atguigu.mybatis.EmployeeMapper.selectEmp",1);
   System.out.println(employee);
  }finally {
   openSessioin.close();
  }
 }
}

编写sql文件

<?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">
<mapper namespace="com.atguigu.mybatis.EmployeeMapper"><!--随便起的名字-->
<!--id:标签的唯一标识-->
 <select id="selectEmp" resultType="com.atguigu.mybatis.bean.Employee">
   select id,last_name lastName,email from tb1_employee where id = #{id}
  </select>
</mapper> 

配置mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="com.mysql.cj.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/mybaties?serverTimezone=GMT" />
    <property name="username" value="root" />
    <property name="password" value="stoneSml@123" />
   </dataSource>
  </environment>
 </environments>
 <mappers>
  <mapper resource="EmployeeMapper.xml" />
 </mappers>
</configuration>

测试运行结果如下:

DEBUG 07-01 21:25:56,018 ==>  Preparing: select id,last_name lastName,email from tb1_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 07-01 21:25:56,045 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 07-01 21:25:56,069 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee [id=1, lastName=tom, email=tom@atguigu, gender=null]
3.MyBatis测试程序的修改版本

1.创建接口类

public interface EmployeeMapper {
 public Employee getEmpById(Integer id);
}

2.创建与接口相对应的sql查询文件

<?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">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"><!--指定为接口的全类名-->
<!--id:Mapper接口中对应的函数方法名-->
 <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
   select id,last_name lastName,email from tb1_employee where id = #{id}
  </select>
</mapper>   

3.测试方法

 @Test
 public void test01() throws Exception{
  String resource = "mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  SqlSession openSession=sqlSessionFactory.openSession();  
  EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);//代理类
  Employee employee=mapper.getEmpById(1);
  System.out.println(employee);
 }

SqlSesson代表和数据库的一次会话:用完必须关闭。
SqlSession和connection一样都是非线程安全的。
mapper接口没有实现类,但是mybatis会为接口生成一个代理对象。

4.全局配置文件中的标签

1.mybaits可以使用properties来引入外部properties配置文件的内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <!--配置文件信息-->
 <properties resource="dbconfig.properties" ></properties>
 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
   </dataSource>
  </environment>
 </environments> 
 <mappers>
  <mapper resource="EmployeeMapper.xml" />
 </mappers>
</configuration>

dbconfig.properties配置文件中的配置如下:

jdbc.driver:com.mysql.cj.jdbc.Driver
jdbc.url:jdbc:mysql://localhost:3306/mybaties?serverTimezone=GMT
jdbc.username:root
jdbc.password:stoneSml@123
5.设置驼峰命名和数据表结构的映射
 <settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
 </settings>
6.别名处理器

配置文件

 <typeAliases>
  <typeAlias type="com.atguigu.mybatis.bean.Employee"/>
 </typeAliases>

默认别名是类名小写:employee,别名不区分大小写,alias指定新的别名
sql文件中进行配置

<?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">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"><!--指定为接口的全类名-->
<!--id:标签的唯一标识-->
 <select id="getEmpById" resultType="employee">
   select * from tb1_employee where id = #{id}
  </select>
</mapper> 

批量起别名代码按如下方式编写

 <typeAliases>
  <package name="com.atguigu.mybatis.bean"/>
 </typeAliases>

会出现命名冲突,可以采用在类上面添加注解的方式来进行名称指定。
@Alias(“emp”)
全部代码为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <properties resource="dbconfig.properties" ></properties>
 <settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
 </settings>
 <typeAliases>
  <package name="com.atguigu.mybatis.bean"/>
 </typeAliases>
 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
   </dataSource>
  </environment>
 </environments> 
 <mappers>
  <mapper resource="EmployeeMapper.xml" />
 </mappers>
</configuration>

最终还是希望大家使用全类名的方式来写sql查询语句。

7.MyBatis默认起的别名

基本数据类型是在前面加上下划线。
其他类型是首字符小写。

8.typeHandlers

主要作用是将数据库中的类型和java中的类进行映射

9.插件

plugins
四大对象
Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)

10.environment环境配置

enviroment:配置一个具体的环境信息,必须有两个标签,id代表当前环境的唯一标识
----transactionManager:配置事务管理器
--------type:事务管理器的类型,JDBC(JdbcTransactionFactory)和MANAGED(JEE容器的方式实现事务的控制,ManagedTransactionFactory)
自定义事务管理器实现TransactionFactory接口,type指定为全类名
----dataSource:数据源
--------type:UNPOOLED|POOLED|JNDI
也可以使用自定义的连接池,实现DataSourceFactory接口,type指定为全类名
通过配置environments中default指定的值可以实现测试和运行环境的切换

 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC" />
   <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
   </dataSource>
  </environment>
 </environments> 
11.如何支持多数据厂商

databaseIdProvider:支持多数据厂商的type=“DB_VENDOR”,VendorDatabaseIdProvider
使用的得到数据库厂商的标识(驱动getDatabaseProductName()),MySQL,Oracle,SQL Server,xxxx
配置信息如下:

 <databaseIdProvider type="DB_VENDOR">
  <property name="MySQL" value="mysql"/>
  <property name="Oracle" value="oracle"/>
  <property name="SQL Server" value="sqlserver"/>
 </databaseIdProvider>

查询数据库的配置如下:

<?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">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"><!--指定为接口的全类名-->
<!--id:标签的唯一标识-->
 <select id="getEmpById" resultType="employee" databaseId="mysql">
   select * from tb1_employee where id = #{id}
  </select>
</mapper>
12.mappers标签
 <mappers>
 <!--
  mapper:注册一个sql映射
  resource:引用类路径下的sql映射文件
  url:引用网络路径或者磁盘路径下的sql映射文件
  注册接口
  class:引用(注册)接口
  1.有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下:
  2.没有sql映射文件,所有的sql都是利用直接写在接口里的方法上
  @Select("select * from tb1_employee where id=#{id}")
  推荐:
   比较重要的Dao接口,我们来写sql映射文件
   不重要,简单的Dao接口为了开发快速可以使用注解。
 -->
  <mapper resource="EmployeeMapper.xml" />
 </mappers>

批量注册:

在这里插入图片描述

13.增删改查测试案例

接口内容

public interface EmployeeMapper {
 public Employee getEmpById(Integer id);
 public boolean addEmp(Employee employee);
 public void updateEmp(Employee employee);
 public void deleteEmpById(Integer id);
}

sql配置文件内容

<?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">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"><!--指定为接口的全类名-->
<!--id:标签的唯一标识-->
 <select id="getEmpById" resultType="employee" databaseId="mysql">
   select * from tb1_employee where id = #{id}
  </select>
 <!--
  parameterType参数类型,可以省略
  mysql支持自增主键:自增主键的获取,mybatis也是利用statement.getGenreatedKeys();
  useGeneratedKeys="true",使用自增主键获取主键值策略
  keyProperty:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个主键封装给javaBean的哪个属性
 -->
  <insert id="addEmp" parameterType="com.atguigu.mybatis.bean.Employee" useGeneratedKeys="true" keyProperty="id">
   insert into tb1_employee(last_name,email,gender)
   values(#{lastName},#{email},#{gender})
  </insert>
  <update id="updateEmp">
   update tb1_employee
   set last_name=#{lastName},email=#{email},gender=#{gender}
   where id=#{id}
  </update>
  <delete id="deleteEmpById">
   delete from tb1_employee where id=#{id}
  </delete>
</mapper> 

测试代码

@Test
 public void test02() throws Exception{
  String resource = "mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  SqlSession openSession=sqlSessionFactory.openSession();  
  EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);//代理类
  Employee employee=new Employee(1,"jerry","jerry@atguigu.com","1");
  //mapper.addEmp(employee);
  //mapper.updateEmp(employee);
  mapper.deleteEmpById(2);
  openSession.commit();
  System.out.println(employee);
 }

说明:
1.Mybatis允许增删改直接定义一下类型的返回值
Integer、Long、Boolean、void
2.
SqlSession openSession=sqlSessionFactory.openSession();需要设置手动提交
SqlSession openSession=sqlSessionFactory.openSession(true);需要设置自动提交
3.在oracle中使用
在这里插入图片描述
在这里插入图片描述

14.mybatis参数处理

1.单个参数传值:mybatis不做特殊处理
#{参数名}:取出参数
2.传递多个参数的时候:mybatis会做特殊处理
多个参数会被封装成一个map
key:param1…paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值
例子:
接口中编写如下代码

public interface EmployeeMapper {
 public Employee getEmpByIdAndLastName(Integer id,String lastName);
}

sql配置文件中编写如下代码:

<?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">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"><!--指定为接口的全类名-->
 <select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tb1_employee where id = #{param1} and last_name=#{param2}
 </select>
</mapper> 

还可以做命名参数的处理
把接口类中的代码修改成如下的代码:

 public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("lastName")String lastName);
sql修改成如下的代码:
 <select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tb1_employee where id = #{id} and last_name=#{lastName}
 </select>
15.POJO传值的取值

如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo
#{属性名}:取出传入的pojo的属性值

16.Map

如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便,我们可以传入map
#{key}:取出map中对应的值
接口中的代码如下:

 public Employee getEmpByMap(Map<String,Object> map);

sql配置文件语句如下:

 <select id="getEmpByMap" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tb1_employee where id = #{id} and last_name=#{lastName}
 </select>

测试代码如下:

@Test
 public void test02() throws Exception{
  String resource = "mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  SqlSession openSession=sqlSessionFactory.openSession();  
  EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);//代理类
  Map<String,Object> map=new HashMap<String,Object>();
  map.put("id",1);
  map.put("lastName", "Tom");
  Employee employee=mapper.getEmpByMap(map);
  System.out.println(employee);
 }

如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写要给TO(Transfer Object)数据传输对象

Page{
 int index;
 int size;
}
17.思考如下代码的取值

public Employee getEmp(@Param(“id”)Integer id,String lastName);
取值:id==>#{id/param1} lastName==>#{param2}
public Employee getEmp(Integer id,@Param(“e”)Employee emp);
取值:id==>#{param1} lastName==>#{param2.lastName/e.lastName}
public Employee getEmpById(List ids);
取值:取出第一个id的值:#{list[0]}
特别注意:如果是Collection(List、Set)类型或者是数组
也会特殊处理。也是把传入的list或这数组封装在map中
key:Collection(collection),如果是List还可以使用key(list)
数组(array)

18.源码处理

public Employee getEmpByIdAndLastName(@Param(“id”)Integer id,@Param(“lastName”)String lastName);
ParamNameResolver解析参数封装map的:
1.names:{0=id,1=lastName}
获取每个标了param注解的参数的@Param的值,id,lastName
每次解析一个参数给map中保存信息,(key:参数索引,value:name值)。name的值:标注了param注解:注解的值。没有标注:①全局配置:useActualParamName(jdk1.8):name=参数名②name=map.size();相当于当前元素的索引

 public ParamNameResolver(Configuration config, Method method) {
    final Class<?>[] paramTypes = method.getParameterTypes();
    final Annotation[][] paramAnnotations = method.getParameterAnnotations();
    final SortedMap<Integer, String> map = new TreeMap<Integer, String>();
    int paramCount = paramAnnotations.length;
    // 获取每个标了param注解的参数的@Param的值
    for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {
      if (isSpecialParameter(paramTypes[paramIndex])) {
        // skip special parameters
        continue;
      }
      String name = null;
      for (Annotation annotation : paramAnnotations[paramIndex]) {
        if (annotation instanceof Param) {
          hasParamAnnotation = true;
          name = ((Param) annotation).value();
          break;
        }
      }
      if (name == null) {
        // @Param was not specified.
        if (config.isUseActualParamName()) {
          name = getActualParamName(method, paramIndex);
        }
        if (name == null) {
          // use the parameter index as the name ("0", "1", ...)
          // gcode issue #71
          name = String.valueOf(map.size());
        }
      }
      map.put(paramIndex, name);
    }
    names = Collections.unmodifiableSortedMap(map);
  }
public Object getNamedParams(Object[] args) {
    final int paramCount = names.size();
 //1.参数为null直接返回
    if (args == null || paramCount == 0) {
      return null;
 //2.如果只有一个元素,并且没有Param注解
    } else if (!hasParamAnnotation && paramCount == 1) {
      return args[names.firstKey()];
    } else {
  //多个元素
      final Map<String, Object> param = new ParamMap<Object>();
      int i = 0;
   //遍历names集合{id=args[0]:1,lastName=args[1]:Tom}
      for (Map.Entry<Integer, String> entry : names.entrySet()) {
        param.put(entry.getValue(), args[entry.getKey()]);
        // add generic param names (param1, param2, ...)
  //额外的将每一个参数也保存到mao中,使用新的key:param1...paramN
  //效果:有Param注解可以#{指定的key},或者#{param1}
        final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
        // ensure not to overwrite parameter named with @Param
        if (!names.containsValue(genericParamName)) {
          param.put(genericParamName, args[entry.getKey()]);
        }
        i++;
      }
      return param;
    }
  }
19.参数的取值

#{}:可以获取map中的值或者pojo对象属性的值
${}:可以获取map中的值或者pojo对象属性的值

select * from tb1_employee where id = ${id} and last_name=#{lastName}

Preparing:select * from tb1_employee where id=2 and last_name=?
区别:
#{}:是以预编译的形式将数据设置到sql语句中:PreparedStatement;防止sql注入
KaTeX parse error: Expected 'EOF', got '#' at position 48: …下,我们去参数的值都应该去使用#̲{} 原生的jdbc不支持占…{}进行取值
比如分表:按照年份分表拆分

 select * from ${year}_salary where xxx;
 select * from tb1_employee order by ${f_name} ${order}
20.#{}:更丰富的用法:

规定参数的一些规则:
javaType、jdbcType、mode(存储过程)、numericScale、resultMap、typeHandler、jdbcTypeName
jdbcType通常需要在某种特定的条件写被设置:
在我们数据为null的时候,有些数据库可能不能识别mybaits对null的默认处理,比如Oracle(报错)
可能报错如下:
JdbcType OTHER:无效的类型,因为mybatis对所有的null都映射的是原生的Jdbc OTHER,oracle不能正确处理;

 <select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">
  <selectKey keyProperty="id" order="BEFORE" resultType="Integer">
   select EMPLOYESS_SEQ.nextval from dual
  </selectKey>
  insert into employees(EMPLOYEE_ID,LAST_NAME,EMALI)
  values(#{id},#{lastName},#{email,jdbcType=NULL})
 </select>

另一种解决办法,在配置文件中进行配置。

 <setting>
  <setting name="jdbcTypeForNull" value="NULL"/>
 </setting>
21.查询返回为list集合类型
public List<Employee> getEmpsByLastNameLike(String lastName);

sql配置文件如下:

 <select id="getEmpsByLastNameLike" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tb1_employee where last_name like #{lastName}
 </select>
 @Test
 public void test02() throws Exception{
  String resource = "mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  SqlSession openSession=sqlSessionFactory.openSession();  
  EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);//代理类
  List<Employee> empsByLastNameLike=mapper.getEmpsByLastNameLike("%jerry%");
  System.out.println(empsByLastNameLike.size());
  for(Employee employee:empsByLastNameLike) {
   System.out.println(employee);
  }
 }
22.查询返回的map:key就是列名,值就是对应的值

接口中配置的方法:

public Map<String,Object> getEmpByIdReturnMap(Integer id);

sql配置如下:

 <select id="getEmpByIdReturnMap" resultType="map">
  select * from tb1_employee where id=#{id}
 </select>

测试中主要调用方法:

Map<String,Object> map=mapper.getEmpByIdReturnMap(1);
  System.out.println(map);

运行结果如下:

DEBUG 07-02 16:07:55,029 ==>  Preparing: select * from tb1_employee where id=?   (BaseJdbcLogger.java:145) 
DEBUG 07-02 16:07:55,029 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 07-02 16:07:55,032 <==      Total: 1  (BaseJdbcLogger.java:145) 
{gender=1, last_name=jerry, id=1, email=jerry@atguigu.com}
23.返回多条记录封装一个map:Map<Integer,Employee>:键是这条记录的主键,值是记录封装后的java

在接口中申明方法

 @MapKey("id")
 public Map<Integer,Employee> getEmpByLastNameLikeReturnMap(String lastName);

sql查询如下

 <select id="getEmpByLastNameLikeReturnMap" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tb1_employee where last_name like #{lastName}
 </select>

主要的测试代码如下:

  Map<Integer,Employee> map=mapper.getEmpByLastNameLikeReturnMap("%jer%");
  System.out.println(map);

测试结果如下:

{1=Employee [id=1, lastName=jerry, email=jerry@atguigu.com, gender=1], 3=Employee [id=3, lastName=jerry, email=jerry@atguigu.com, gender=1]}
24.自动映射

不开启驼峰命名法进行映射
接口代码如下

public interface EmployeeMapperPlus {
 public Employee getEmpById(Integer id);
}

对应的sql中的文件如下

<?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">
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapperPlus">
 <!-- 自定义某个javaBean的封装规则 -->
 <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmp">
  <!-- 指定主键 列的封装规则
   id:定义主键会在底层优化规则
   column:指定哪一列
   property:指定对应的javaBean属性
  -->
  <id column="id" property="id"/>
  <result  column="last_name" property="lastName"></result>
  <!--其他不指定的列会自动封装,我们只要写resultMap就把全部的映射规则都写上-->
  <result column="email" property="email"></result>
  <result column="gender" property="gender"></result>
 </resultMap>
 <select id="getEmpById"  resultMap="MyEmp">
  select * from tb1_employee where id=#{id}
 </select>
</mapper>
25.联合查询:级联属性封装结果集

接口的代码如下

public Employee getEmpAndDept(Integer id);

sql查询语句如下

<resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDifEmp">
<id column="id" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="gender" property="gender"></result>
<!-- 
<result column="did" property="dept.id"></result>
<result column="dept_name" property="dept.departmenName"></result>
-->
<association property="dept" javaType="com.atguigu.mybatis.bean.Department">
 <id column="did" property="id"></id>
 <result column="dept_name" property="departmenName"></result>
</association>
</resultMap>
<select id="getEmpAndDept" resultMap="MyDifEmp">
SELECT e.*,d.dept_name
from tb1_dept d,tb1_employee e
where d.id=e.d_id and e.id=1
</select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值