MyBatis配置示例&MyBatis核心API操作过程分解

1.下载指定版本mybatis用户指南pdf的方法
(1)进入mybatis官方文档mybatis官方文档
(2)点击首页的“项目的Git代码库”按钮进入项目git代码页面
在这里插入图片描述
(3)点击mybatis-3
在这里插入图片描述
(4)跳转页面滑动到README.md部分,然后点击“Download Latest”
在这里插入图片描述
(5)找到项目中需要用到的mybatis版本,然后点击下载zip文件
在这里插入图片描述
(6)解压缩后即可得到对应的pdf文件。
2.mybatis配置
(1)mybatis主配置文件
在项目resources下新建mybatis.xml,然后进入mybatis3.2.7.pdf的Getting Started章节,复制如下配置内容:

<?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="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

配置文件详解:
configuration:配置信息
environments:当前的开发环境集合
<environment id="development”>:当前的某一个开发环境
<transactionManager type=“JDBC”/>:事物管理,使用默认的JDBC管理
<dataSource type=“POOLED”>:数据源,POOLED代表使用默认的数据库连接池
<property name=“driver” value=” d r i v e r ” / &gt; : 数 据 库 连 接 驱 动 &lt; p r o p e r t y n a m e = &quot; u r l &quot; v a l u e = &quot; {driver}”/&gt;:数据库连接驱动 &lt;property name=&quot;url&quot; value=&quot; driver/><propertyname="url"value="{url}”/>:数据库连接url
<property name=“username” value=” u s e r n a m e ” / &gt; : 数 据 库 连 接 用 户 名 &lt; p r o p e r t y n a m e = &quot; p a s s w o r d &quot; v a l u e = &quot; {username}”/&gt;:数据库连接用户名 &lt;property name=&quot;password&quot; value=&quot; username/><propertyname="password"value="{password}”/>:数据库连接密码
mappers:映射配置文件的路径
(2)创建数据库&表&加数据

(3)项目中创建实体类

  • 变量的定义
  • 变量对应的set及get方法
  • 额外的toString方法;
    代码如下:
import java.util.Date;
import java.util.List;
public class Users {

    private Integer id;                 // 用户编号
    // private String username;            // 登录账号
    private String name;                // 登录账号
    private String userpass;            // 登录密码
    private String nickname;            // 用户昵称
    private Integer age;                // 用户年龄
    private String gender;              // 用户性别
    private String email;               // 用户邮箱
    private String phone;               // 联系方式
    private Date createTime;            // 创建时间
    private Date updateTime;            // 账号最后修改时间
    private Date lastLogin;             // 用户最后登录时间
    private Integer userStatus;         // 用户账号状态 0 正常 1 锁定 2 删除
    private String remark;              // 用户备注信息
    private List<Address> addresses;    // 用户地址信息【地址列表,有一个是默认地址】

    public Users() {
    }

    public Users(Integer id) {
        this.id = id;
    }

    public Users(String name, String userpass, String nickname, Integer age, String gender, String email, String phone) {
        this.name = name;
        this.userpass = userpass;
        this.nickname = nickname;
        this.age = age;
        this.gender = gender;
        this.email = email;
        this.phone = phone;

    }

    public Users(Integer id, String nickname, Integer age, String gender, String email, String phone, Date updateTime, String remark) {
        this.id = id;
        this.nickname = nickname;
        this.age = age;
        this.gender = gender;
        this.email = email;
        this.phone = phone;
        this.updateTime = updateTime;
        this.remark = remark;
    }

    public Users(String name, String userpass, String nickname, Integer age, String gender, String email, String phone, Date createTime, Date updateTime, Date lastLogin, Integer userStatus) {
        this.name = name;
        this.userpass = userpass;
        this.nickname = nickname;
        this.age = age;
        this.gender = gender;
        this.email = email;
        this.phone = phone;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.lastLogin = lastLogin;
        this.userStatus = userStatus;
    }

    public Users(Integer id, String nickname, Integer age, String gender, String email, String phone, String remark) {
        this.id = id;
        this.nickname = nickname;
        this.age = age;
        this.gender = gender;
        this.email = email;
        this.phone = phone;
        this.remark = remark;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    /*public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }*/

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUserpass() {
        return userpass;
    }

    public void setUserpass(String userpass) {
        this.userpass = userpass;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public Date getLastLogin() {
        return lastLogin;
    }

    public void setLastLogin(Date lastLogin) {
        this.lastLogin = lastLogin;
    }

    public Integer getUserStatus() {
        return userStatus;
    }

    public void setUserStatus(Integer userStatus) {
        this.userStatus = userStatus;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public List<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }


    @Override
    public String toString() {
        return "Users{" +
                       "id=" + id +
                       ", name='" + name + '\'' +
                       ", userpass='" + userpass + '\'' +
                       ", nickname='" + nickname + '\'' +
                       ", age=" + age +
                       ", gender='" + gender + '\'' +
                       ", phone='" + phone + '\'' +
                       ", email='" + email + '\'' +
                       ", createTime=" + createTime +
                       ", updateTime=" + updateTime +
                       ", lastLogin=" + lastLogin +
                       ", userStatus=" + userStatus +
                       ", remark='" + remark + '\'' +
                       ", addresses=" + addresses +
                       '}';
    }
}

(4)resources下新建mapper文件夹,在mapper文件夹下新建mapper映射文件usersMapper.xml(命名规则:实体类名称+Mapper.xml),内容参考mybatis3.2.7.pdf–Getting Started章节–Exploring Mapped SQL Statements部分:

<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

讲解:
mapper:用于定义一个映射配置文件的根节点
namespace属性:用来配置命名空间,主要进行session级别的缓存管理(命名空间默认情况下,使用我们当前操作的实体类的全路径)
select中的id:查询的名称
select中的resultType:返回值类型
select中的
实际代码如下:

<?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.damu.entity.Users">

    <!--<select id="findUsers" resultType="com.damu.entity.Users">-->
    <select id="findUsers" resultMap="forUsers">
        select * from users

        <if test="id != null">
            where id = #{id}
        </if>
    </select>

    <!-- 自定义映射关系集合:主要包含对于一些自定义操作的配置,如不一致的属性和字段 -->
    <resultMap id="forUsers" type="com.damu.entity.Users">
        <!-- 绑定id主键 -->
        <id property="id" column="id"></id>
        <!-- result配置,主要配置普通属性,column表示配置的是数据库字段名称 property配置的是实体类的属性名称 -->
        <result column="username" property="name"></result>

        <collection property="addresses" column="id" ofType="com.damu.entity.Address" select="getAddress"></collection>
    </resultMap>

    <select id="getAddress" resultType="com.damu.entity.Address">
        select * from address where userid = #{id}
    </select>



    <sql id="user_fields">
        username, userpass, nickname, age, gender, email, phone, createTime, updateTime, lastLogin, userstatus, remark
    </sql>

    <insert id="addUser" useGeneratedKeys="true" keyProperty="id">
        insert into users( <include refid="user_fields"></include>)
        values(#{name},#{userpass}, #{nickname}, #{age}, #{gender}, #{email}, #{phone}, #{createTime}, #{updateTime}, #{lastLogin}, #{userStatus}, #{remark})
    </insert>

    <update id="updateUser">
        update users
        <set>
            <if test="name != null">username = #{name},</if>
            <if test="userpass != null">userpass = #{userpass},</if>
            <if test="nickname != null">nickname = #{nickname},</if>
            <if test="age != null">age = #{age},</if>
            <if test="gender != null">gender = #{gender},</if>
            <if test="email != null">email = #{email},</if>
            <if test="phone != null">phone = #{phone},</if>
            <if test="createTime != null">createTime = #{createTime},</if>
            <if test="updateTime != null">updateTime = #{updateTime},</if>
            <if test="lastLogin != null">lastlogin = #{lastLogin},</if>
            <if test="userStatus != null">userStatus = #{userStatus},</if>
            <if test="remark != null">remark = #{remark},</if>
        </set>
          where id = #{id}
    </update>

    <delete id="delUser">
        delete from users where id = #{id}
    </delete>
</mapper>

(5)新建测试类,通过junit进行测试
查询junit的依赖包(maven引用的方式)
https://mvnrepository.com/artifact/junit/junit/4.12
在这里插入图片描述
在pom.xml中添加依赖如下:

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

测试类代码如下:

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.InputStream;
import java.util.List;

public class TestDemo {
    /*
    通过junit进行测试
     */
    @Test
    public void testDemo1(){
        //初始化mybatis配置环境
        String resource = "mybatis.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

        //打开和数据库之间的会话
        SqlSession session = factory.openSession();

        //进行数据处理
        List<Users> ulist = session.selectList("userList");//userList为usersMappers.xml中select部分的id

        for (Users user: ulist
             ) {
            System.out.println(user);
        }

        //关闭会话
        session.close();
    }
}

(6)运行测试类即可看到结果。
3.mybatis核心API操作过程分解
(1)读取mybatis主配置文件以及实体映射配置文件:

  • mybatis.xml

  • 实体类名称+Mapper.xml
    (2)构建一个和数据库之间的会话

  • 这个过程主要是由SqlSessionFactoryBuilder来进行处理

  • SqlSessionFactoryBuilder结合配置文件,构建出来SqlSessionFactory工厂类(这个工厂类,整个程序中只需要构建一次)

  • 通过SqlSessionFactory,open出一个SqlSession,即和数据库的一个会话

  • 通过绘画的执行器,即Executor,来执行sql语句(要执行的sql语句,提前配置到了实体类名称+Mapper.xml配置文件中)

  • 执行器,在执行映射配置文件时,需要参数(HashMap String\Integer POJO),参数可缺省

  • 通过映射规则Mapped Statement来进行数据操作,即从数据库中查询数据或进行增删改的操作

  • 获取结果数据,对结果数据进行处理
    在这里插入图片描述
    4.Mybatis架构分解
    接口层提供了如下接口:

  • 数据查询接口

  • 数据新增接口

  • 数据更新接口

  • 数据删除接口

  • 获取配置接口
    对于封装,mybatis主要执行了四个步骤:

  • 参数映射

  • SQL解析

  • SQL执行

  • 结果映射
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个优秀的 ORM 框架,提供了许多方便的配置和使用方式。下面是一个简单的 MyBatis 配置文件示例: ```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="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> ``` 其,`environments` 元素定义了环境,可以包含多个环境,通过 `default` 属性指定默认环境。`environment` 元素定义了环境的具体配置,包括事务管理器和数据源。在上面的示例,使用了 `JDBC` 类型的事务管理器和 `POOLED` 类型的数据源。 `mappers` 元素定义了映射器,可以包含多个映射器,通过 `resource` 属性指定映射器文件的路径。在上面的示例,使用了 `com.example.mapper.UserMapper.xml` 文件作为映射器。 如果在配置文件出现错误,MyBatis 会在启动时抛出异常。常见的错误包括: - `org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration`:XML 文件格式错误或者 MyBatis 版本不兼容。 - `org.apache.ibatis.exceptions.PersistenceException: Error getting driver instance for jdbc driver`:数据库驱动类名错误或者数据库驱动未加载。 - `org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)`:映射器文件的路径错误或者映射器文件的语句 ID 错误。 这些错误都可以通过仔细检查配置文件和相关代码来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值