Mybatis框架入门

Posted 阿瞒有我良计15

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis框架入门相关的知识,希望对你有一定的参考价值。

1.先说一下传统JDBC的劣势:

  • 1.数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能。
  • 2.SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则。
  • 3.用PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。
  • 4.JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。

2.MyBatis框架解决JDBC编程劣势的对应方案如下:

  • 1.在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
  • 2.MyBatis将SQL语句配置在MyBatis的映射文件中,实现了与Java代码的分离。
  • 3.MyBatis自动将Java对象映射至SQL语句,通过Statement中的parameterType定义输入参数的类型。
  • 4.MyBatis自动将SQL执行结果映射至Java对象,通过Statement中的resultType定义输出结果的类型。

3.Mybatis入门程序编写(实现根据id查询用户信息的操作)

1.创建好maven工程

2.引入mysql驱动包,Junit测试包,MyBatis的核心包等相关依赖

pom.xml如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>_20230328_2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
    </dependencies>

</project>

3.创建数据库db_test1;

4. 在resources目录下创建db.properties

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/db_test1?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=666666

5.在resources目录下创建mybatis-config.xml(把db.properties给配置到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>
    <!-- 环境配置 -->
    <!-- 加载类路径下的属性文件 -->
    <properties resource="db.properties"/>

    <!-- 数据库连接相关配置 ,db.properties文件中的内容-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="$mysql.driver"/>
                <property name="url" value="$mysql.url"/>
                <property name="username" value="$mysql.username"/>
                <property name="password" value="$mysql.password"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

6.在数据库db_test1中创建user表并插入数据

7.根据user表结构创建实体类User(生成get,set,toString方法)

package cn.hdc.pojo;

public class User 
    private int id;
    private String username;
    private String password;

    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                '';
    

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

8.根据User实体类在resources路径下创建mapper,mapper文件夹下在创建UserMapper.xml(用来放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="cn.hdc.pojo.User">
    <select id="findById" parameterType="int" resultType="cn.hdc.pojo.User">
        select * from user where id = #id
    </select>
</mapper>

9.UserMapper.xml我们已经写好了,现在配置一下mybatis-config.xml(让mybatis-config.xml获取一下mapper文件夹下的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>
    <!-- 环境配置 -->
    <!-- 加载类路径下的属性文件 -->
    <properties resource="db.properties"/>

    <!-- 数据库连接相关配置 ,db.properties文件中的内容-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="$mysql.driver"/>
                <property name="url" value="$mysql.url"/>
                <property name="username" value="$mysql.username"/>
                <property name="password" value="$mysql.password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--        配置xxxMapper.xml文件的位置-->
        <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

10.利用junit创建一个测试类

package cn.hdc.test;

import cn.hdc.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class UserTest 
    @Test
    public void findById() throws IOException 
        //1.获取核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.创建sqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.创建sqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        //4.执行sql语句,sql语句的唯一标识:namespace.statementId
        User user = session.selectOne("cn.hdc.pojo.User.findById", 1);
        System.out.println(user);
        //5.释放资源
        session.close();
    

11.项目路径如下:

12.运行结果:

MyBatis工作原理

MyBatis框架在操作数据库时,大体经过了8个步骤。下面结合MyBatis工作原理图对每一步流程进行详细讲解,具体如下。

  • ( 1 ) MyBatis读取核心配置文件mybatis-config.xml : mybatis-config.xml核心配置文件主要配置了MyBatis的运行环境等信息。
  • ( 2)加载映射文件Mapper.xml : Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。
  • ( 3)构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory,用于创建SqlSession。 
  • (4)创建会话对象︰由会话工厂SqlSessionFactory创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
  • ( 5)创建执行器︰会话对象本身不能直接操作数据库,MyBatis底层定义了一个Executor接口用于操作数据库,执行器会根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存地维护。
  • (6)封装SQL信息:SqlSession内部通过执行器Executor操作数据库,执行器将待处理的SQL信息封装到MappedStatement对象中。
  • (7)操作数据库∶根据动态生成的SQL操作数据库。
  • (8 )输出结果映射∶执行SQL语句之后,通过MappedStatement对象将输出结果映射至Java对象中。

mybatis框架入门

初识mybatis

对原生jdbc程序(单独使用jdbc开发)问题总结
mybatis框架原理
mybatis入门程序
用户的增删查改
mybatis开发dao两种方法
原始dao开发方法(程序需要编写dao接口和dao实现类)
mybatis的mapper接口(相当于dao接口)代理开发方法
mybatis配置文件SqlMapConfig.xml
mybatis核心
mybatis输入映射
mybatis输出映射
mybatis的动态sql
第二天
订单商品的数据分析
改机映射(一对一、一对多、多对多)
mybatis延迟加载
mybatis查询缓存(一级缓存、二级缓存)
mybatis和spring进行整合
mybatis的逆向工程
----------------------------

原生态jdbc中的问题总结

环境:
java环境:jdk1.8
eclipse:2010

使用jdbc查询MySQL数据库中用户表的记录
问题总结:
数据库的连接,使用时就创建,不使用立即释放,对数据库进行频繁的连接开启和关闭,造成数据库资源浪费,影响数据库性能。
解决方案:使用数据库的连接池管理数据库的连接
将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。
解决方案:将sql语句配置到xml配置文件中,不需要对java代码进行重新编译
向preparedastatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护
设想:将sql语句及占位符号和参数全部配置在xml中
从resutset中遍历结果数据时存在硬编码。将要获取的表的字段进行硬编码,不利于系统维护。
设想:将查询的结果集,映射成java对象。

mybatis框架原理
下载地址:https://github.com/mybatis/mybatis-3/releases
mybatis是什么?
mybatis是持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到GitHub下。
mybatis让程序员将主要经历放在sql上,通过mybatis提供的映射方式,自由灵活(半自动化,大部分需要程序员编写sql)生成满足需要的sql语句。
mybatis可以将向preparedastatement输入的参数自动进行输入映射,将查询结果集灵活的映射出java对象(输出映射)

mybatis框架

入门程序:
需求:
根据用户ID查询用户信息
根据用户名称模糊查询用户信息
添加用户
删除用户
更新用户

sqlMapConfig.xml
配置mybatis的运行环境
------------------------------------------------------------------------
<?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>
<!--和spring整合之后就将废除-->
<environments default="development">
<environment id="development">
<!--使用jdbc事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!--数据库连接池 -->
<dataSource type="POOLEd">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_day1" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>

 

根据用户ID查询用户信息
映射文件()
xxxMapper.xml
在映射文件中配置sql语句
<!--namespace命名空间,作用就是对sql进行分类化管理 sql隔离 -->
<!--注意使用mapper代理方法开发,namespace有特殊重要的作用-->
<mapper namespace="test">
<!--在映射文件中配置很多sql语句-->
<!--需求:通过id查询用户记录-->
<!--通过select执行数据库的查询
id:用于标识映射文件的sql,称为statement得id
将sql语句封装到mappedStatement对象中-->
<!--#{}表示一个占位符:其中id表示id接收输入的参数,参数名称就是id
如果输入参数是简单类型,#{}中的参数名可以任意,
可以是value或其他名称都行
parameterType:指定输入参数的类型,这里指定int类型
resultType:指定sql输出结果的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象-->

<select id="findUserById" parameterType="int" resultType="com.ytzl.mybatis.po.User">
select * from user where uid=#{uid}
</select>
</mapper>
在sqlMapConfig.xml中加载映射配置文件信息
<!--加载配置文件 -->
<mappers>
<mapper resource="SqlMap/User.xml" />
</mappers>
程序的编写
根据用户名称模糊查询用户信息
总结:
parameterType
在映射文件中通过parameterType指定输入参数类型
resultType
在映射文件中通过resultType指定输出结果的类型
#{}和${}
#{}:表示一个占位符,接收输入参数,类型可以是简单类型、pojo、Hashmap
如果接收简单类型,#{}中可以写成value或者其他名称。
#{}接收pojo对象值,通过ognl读取对象中的属性值,通过属性.属性.属性..的方式获取对象属性值
${}:表示一个拼接符号,会引起sql注入,所以不建议使用,可以写成简单类型、pojo、hashmap 。
如果接收简单类型,${}中只能写成value
${}接收pojo对象值,通过ognl读取对象中的属性值,通过属性.属性.属性..的方式获取对象属性值,不建议使用
selectOne 和 selectList
selectOne:表示查询出一条记录进行映射,如果使用selectOne可以实现,使用selectList也可以实现(list中只有一条数据)
selectList:表示查询出一个列表(多条记录)进行映射。
添加用户:
映射文件
在user.xml中配置添加用户的statement
<!--添加用户
parameterType:指定输入参数类型是pojo(包括用户信息)
#{}:中指定pojo的属性名,接收到pojo对象的属性值mybatis通过ognl获取对象的属性值
-->
<insert id="insertUser" parameterType="com.ytzl.mybatis.po.User">
insert into user(uname,uage,upassword)values(#{uname},#{uage},#{upassword})

</insert>

程序代码
//测试插入数据
@Test
public void insertUser() throws Exception
{
//获取配置文件信息
String resource = "SqlMapConfig.xml";
//加载配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlsessionfactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlsession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
User user=new User();
user.setUname("王豆子");
user.setUage(10);
user.setUpassword("123456");
int num=sqlSession.insert("test.insertUser", user);
//提交事务
sqlSession.commit();
sqlSession.close();
}

自增主键返回
MySQL自增主键,执行insert提交之前,自动生成一个自增主键,通过一个函数获取到刚刚提交的插入记录的自增主键
last_insert_id();
是在insert之后调用
<insert id="insertUser" parameterType="com.ytzl.mybatis.po.User">
<!--将插入数据的主键返回,返回到user对象中
select last_insert_id():得到刚insert进去记录的主键值,只使用与自增主键
keyProperty:将查询到主键设置到keyProperty指定的对象的那个属性
order: select last_insert_id()执行顺序,相对于insert语句来说他的执行顺序-->
<selectKey keyProperty="uid" order="AFTER">
select last_insert_id()
</selectKey>
insert into user(uname,uage,upassword)values(#{uname},#{uage},#{upassword})
</insert>
非自增主键的返回
使用MySQL的UUID()函数生成主键,需要修改表中id字段的类型为String,长度设置为35位
执行思路:
先通过UUID()查询到主键,将主键输入到sql语句中
执行UIID()相对于insert语句之前
删除用户(根据id)
<!--删除用户-->
<delete id="deleteUser" parameterType="java.long.Integer">
delete from user where uid=#{id}
</delete>
更新用户:
<!--更新用户
分析:需要传入用户id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意id必须存在
-->
<delete id="updateUser" parameterType="com.ytzl.mybatis.po.User">
update user set uname=#{uname},uage=#{uage} where uid=#{id}
</delete>
hibernate和mybatis本质区别和应用场景
hibernate:是一个标准的orm框架(对象关系映射)入门门槛较高,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化修改比较困难
应用场景:适用于需求变化不多的中小型 项目,比如:后台管理系统,erp、orm、oa..
mybatis:专注的是sql本身,需要程序员自己编写sql语句,sql修改,优化比较方便。mybatis是一个不完全的orm框架,虽然程序员自己写sql, mybatis也可以实现映射(输入映射,输出映射)
应用场景:主要适用于需求变化较多的项目,比如互联网项目


mybatis开发dao的方法
sqlSession使用范围
sqlSessionFactoryBuilder
将sqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理sqlSessionFactoryBuilder。

sqlSessionFactory
通过sqlSessionFactory创建sqlsession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)
将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory

sqlSession是一个面向用户(程序员)的接口
sqlSession提供了很多操作数据库的方法:
sqlSession是线程不安全的。
sqlSession最佳应用场合在方法体内,定义成局部变量。
原始dao开发方法(程序员需要写dao接口和dao实现类)
思路:
需要向dao实现类中注入sqlSessionFactory,在方法体内通过sqlSessionFactory创建sqlSession。
dao接口
dao解耦实现类
总结原始开发问题:
dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量
调用sqlsession 时将statement的id硬编码了
调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量的额类型传入错误,在编译阶段也不报错,不利于程序员开发
mapper代理方法(程序员只需要mapper接口(相当于dao接口))
思路:
程序员还需要编写mapper.xml映射文件
程序员只需要写mapper接口(相当于dao接口)需要按照一些开发规范,可以自动生成mapper接口实现类代理对象。

开发规范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中的statement的id一致
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement中的prameterType指定的类型一致。
4、mapper.java接口中的方法返回值参数类型和mapper.xml中statement中的resultType指定的类型一致。
// 根据用户id查询用户信息
public User findUserById(int uid) throws Exception;

总结:以上开发规范主要是对下边的代码进行统一生成
测试
@Test
public void testFindUserById() throws Exception {
// 得到sqlsession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建UserMapper对象,mybatis自动创建mapper代理对象
UserMapper mapper= sqlSession.getMapper(UserMapper.class);
User user=mapper.findUserById(4);
}

代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库
mapper接口方法参数只能有一个是否影响系统开发
mapper接口方法参数只能有一个,系统是否不利于扩展维护。
系统框架中,dao层代码是被业务层共用的
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
注意:持久层中方法的参数可以用包装类型,service方法中建议不使用这些包装类型。(不利于我们业务层的维护)

 

SqlMapConfig.xml
mybatis的一个全局配置文件
properties属性:
需求:将数据库的连接参数单独的配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。
在SqlMapConfig.xml中就不需要对数据库中的参数进行硬编码了,方便对参数进行统一管理,其他xml可以引用
db.properties文件
jdbc.driver= com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/maven_ssh
jdbc.user = root
jdbc.password = root
特性
注意:mybatis将按照下面的顺序加载属性
在properties元素体内定义的属性首先被读取
然后会读取properties元素中的resource或URL加载的属性,他会覆盖已读取的同名属性
最后读取parmeterType传递的属性,它会覆盖已读取的同名属性
建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中
在properties文件中定义属性名要有一定的特殊性
setting全局的参数配置
mybatis框架在运行时可以调整一些运行参数。
比如:开启二级缓存/开启延迟加载
typeAliases(别名)**
需求:在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型,需要resultType指定输出结果的映射类型
如果在指定类型时输入类型的全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中
通过typeAliases来定义
<!--别名定义 -->
<typeAliases>
<!--针对单个别名的定义
type:类型的路径
alias:别名-->
<typeAlias type="com.ytzl.mybatis.po.User" alias="user" />

<!--批量别名定义
指定包名:mybatis自动扫描包中的po类,自动定义别名,别名就是类名,首字母大写或者小写都可以-->
<package name=""/>
</typeAliases>

typeHandlers:类型处理器
mybatis中通过typeHandlers完成jdbc类型和java类型的转换。
一般不需要自定义


mappers(映射配置)
<!--加载配置文件 -->
<mappers>
<!--通过resource接口加载映射文件-->
<mapper resource="mapper/UserMapper.xml" />
<!-- 通过mapper接口加载映射文件
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名保持一致,且在一个目录
-->
<!-- <mapper class="com.ytzl.mybatis.mapper.UserMapper"/> -->
<!--批量加载:
指定mapper接口的包名,mybatis自动扫描下边所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名保持一致,且在一个目录-->
<package name=""/>
</mappers>

mapper.xml
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型
传递pojo的包装对象
需求:完成用户信息的综合查询(用户信息、商品、订单)
针对上边的需求,建议使用自定义的包装类型的pojo
在包装类型的pojo中
在userMapper.xml中定义用户信息的综合查询(查询条件复杂,通过高级查询进行)
<!--用户信息综合查询 -->
<selcet id="findUserList" parameterType="com.ytzl.mybatis.po.UserQueryVo"
resultType="com.ytzl.mybatis.po.UserCustom">
select * from user where user.uid=#{userCustom.uid} and user.uname like
‘%${userCustom.uname}%‘
</selcet>
mapper.java
// 用户信息的综合查询
public UserCustom findUserList(UserQueryVo userQueryVo) throws Exception;
输出映射:
resultType:
使用resultType作为输出映射,只有查询出来的列名和pojo的属性名一致,列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
输出简单类型用户信息的综合查询列表总数,通过查询总数和上边用综合查询列表才可以实现分页
输出pojo对象和pojo列表
不管是输出的pojo单个对象,还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。
在mapper.java指定的方法返回值是单个对象类型
输出单个pojo对象,防范返回值是单个对象类型
输出pojo对象list,方法返回值是list<Pojo>

生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象)还是selectList(返回有个集合)

resultMap
mybatis中使用resultmap完成高级输出结果映射
使用方法:如果查询出来的列名和pojo的属性名不一致,通过定义一个resultmap对列名和pojo属性名之间做一个映射关系
定义resultmap
使用resultMap作为statement的输出映射类型
需求:将下边的sql使用UserCustom完成映射
select uid uid_ uname uname_ from user where uid=#{value}
UserCistom类中属性名和上边查询列名不一致


定义resultMap
<!--定义resultMap
将 select uid uid_ uname uname_ from user where uid=#{value} 和user类正的属性做一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识
-->
<resultMap type="com.ytzl.mybatis.po.User" id="userResultMap">
<!--id表示查询结果集中唯一的标识
coumn:查询出来的列名
property:type指定的pojo类型的属性名
最终resultMap和 property column 做一个映射关系(对应关系)-->
<id property="uid" column="uid_"></id>
<!--result:对普通名映射定义-->
<result property="uname" column="uname_"></result>
</resultMap>
使用resultMap

<!--使用resultMap进行输出映射-->
<select id="findUserByResultMap" parameterType="int" resultMap="userResultMap">
select uid uid_ uname uname_ from user where uid=#{value}
</select>
mapper.java
// 根据id查询用户信息,使用resultMap
public User findUserByResultMap(int id) throws Exception;
动态sql
什么是动态sql
mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接,组装等等
需求:
用户信息的综合查询列表和用户信息列表信息查询列表总数这两个statement的定义使用动态sql
对查询的参数进行判断,如果输入的参数不为空才进行查询条件拼接。
sql片段:

mapper.xml中定义sql片段
引用sql片段

foreach
向sql传递数组或list,mybatis使用foreach解析
在用户查询列表和查询总数的statement中增加多个id输入查询
两种方法
select * from user where id=1 or id=10 or id=10
select * from user id in(1,10,16)







































































































































































































































































































































































以上是关于Mybatis框架入门的主要内容,如果未能解决你的问题,请参考以下文章

Java框架篇---Mybatis 入门

mybatis框架——入门级

Java持久层框架Mybatis入门

MyBatis框架入门到精通-入门必备的学习笔记

框架—Mybatis入门

持久层框架 Mybatis快速入门