从0搭建mybatis项目


前言

学习了 Java web创建springMVC实现简单登陆 大致的实践了springMVC之后,我们来学习一下mybatis,MyBatis是持久层的框架(SpringMVC 是Web层的框架,Spring是业务层的框架 )

mybatis依赖库:https://pan.baidu.com/s/1XuaidgvU0N7VQK8J0o5__g?pwd=1111

配置文件:https://pan.baidu.com/s/15D-kqGkaa3XHW2-qUVJlog?pwd=1111


一、mybatis是什么?

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。


二、配置一个mybatis框架

1.创建java程序

  1. 新建项目mybatisDemo

2.提供依赖jar包

  1. 右键 mybatisDemo 建立依赖库 lib
  2. 将依赖库解压移动到 lib
    在这里插入图片描述

3.将jar包构建到工程中

  1. 将 jar 包导入工程路径(右键项目 mybatisDemo,F4)
    在这里插入图片描述在这里插入图片描述
  2. 选择 lib目录,确定
    在这里插入图片描述

4.提供配置文件

  1. 建立 resources 文件夹
  2. 右键 resources , F4 ,选中为资源文件夹
    在这里插入图片描述
  3. 将配置文件解压放入resources
    在这里插入图片描述
  4. 修改 jdbc.properties 内容为自己的数据库内容
    在这里插入图片描述

5.建立数据库

  1. 建立并启动数据库(我的数据库名为dishorder
  2. 在数据库新建查询以建立user表
CREATE TABLE `user`  (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '用户id 主键自增',
  `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `realname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
  `password` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',
  `IDcard` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号',
  `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
  `email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  `paypwd` int(40) NULL DEFAULT NULL COMMENT '交易密码',
  `status` int(10) NULL DEFAULT NULL COMMENT '用户状态(0:离线   1:在线)',
  `reputation` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户信誉',
  PRIMARY KEY (`id`) USING BTREE
);

6.编写mapper

  1. src建立packagecom.gec.mapper
    在这里插入图片描述
  2. 建立 UserMapper.java 文件
package com.gec.mapper;

//UserMapper 使用用于绑定关联UserMapper.xml文件中的sql语句
public interface UserMapper {

    //关联了xml中方法名对应的sql操作语句
    public int insertUser();
    public int updateUser();
    public int deleteUser();
}

  1. 建立 UserMapper.xml 文件
<?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的命名空间   类似于包名加类名  -->
<mapper namespace="com.gec.mapper.UserMapper">

    <!-- id相当于方法名 -->
    <insert id="insertUser">
        insert into user(username, password)
        values ('zhang', '123456');
    </insert>
    <delete id="deleteUser">
        delete from user where username='zhang';
    </delete>
    <update id="updateUser">
        update user set username='liu',password='123456' where username='zhang';
    </update>

</mapper>

三、编写测试代码

1.固定输入数据到数据库

1.在com.gec创建Test.java文件

package com.gec;

import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;

public class Test {

    public static void main(String[] args) throws IOException {
        //1、加载mybatis的全局配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3、通过sqlsessionfactory来得到生成sqlsession会话对象
        SqlSession session = sqlSessionFactory.openSession();
        //4、通过会话对象得到mapper接口对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        //通过mapper对象执行操作方法
        int result = userMapper.insertUser();
        System.out.println(result);
        //添加删除修改要提交事务
        session.commit();
    }
}

执行:
在这里插入图片描述
执行结果:
在这里插入图片描述
在这里插入图片描述


2.根据主键删除数据库中的数据

TestDelete.java

package com.gec;

import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;

public class TestDelete {
    //根据主键删除
    public static void main(String[] args) throws IOException {
        //1、加载mybatis的全局配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3、通过sqlsessionfactory来得到生成sqlsession会话对象
        SqlSession session = sqlSessionFactory.openSession();
        //4、通过会话对象得到mapper接口对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        //通过mapper对象执行操作方法
        int result = userMapper.deleteUser();
        System.out.println(result);
        //添加删除修改要提交事务
        session.commit();
    }
}

执行如下:
在这里插入图片描述
检查数据库,成功删除这位zhang同学在这里插入图片描述


3.根据主键修改用户名和密码

TestUpdate.java

package com.gec;

import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;

public class TestUpdate {
    //根据主键修改用户名和密码
    public static void main(String[] args) throws IOException {
        //1、加载mybatis的全局配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3、通过sqlsessionfactory来得到生成sqlsession会话对象
        SqlSession session = sqlSessionFactory.openSession();
        //4、通过会话对象得到mapper接口对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        //通过mapper对象执行操作方法
        int result = userMapper.updateUser();
        System.out.println(result);
        //添加删除修改要提交事务
        session.commit();
    }
}

执行如下:(先执行一次Test,让数据库中有一条数据)
在这里插入图片描述
成功将zhang同学改成了liu同学在这里插入图片描述


四、动态形式注入参数

现在我们的操作是写在mapper里面的固定的输入、删除和修改,但实际上我们的操作是需要可以变化的输入、可以重复调用(比如从网页获取信息存储到数据库)。

所以我们可以新建实体类,例如User类:

  1. 创建User.java,对应数据库进行设计,并执行构造、无参构造、get and set方法、to string方法。
    在这里插入图片描述

  2. 编写UserMapper.java方法定义

package com.gec.mapper;
import com.gec.bean.User;
import java.util.List;

//UserMapper 使用用于绑定关联UserMapper.xml文件中的sql语句
public interface UserMapper {

    //关联了xml中方法名对应的sql操作语句
    public int insertUser(User user);
   // public int selectUser(User user);
   // public int updateUser(User user);
   // public int deleteUser(int id);
   // public List<User> selectUser();
}
  1. 修改UserMapper.xml(parameterType是入参的数据类型,数据的获取用#{ }表示)【操作方法的具体实现
<?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的命名空间   类似于包名加类名  -->
<mapper namespace="com.gec.mapper.UserMapper">

    <!-- id相当于方法名  parameterType入参的数据类型-->
    <insert id="insertUser" parameterType="com.gec.bean.User">
        insert into user(username, password) values (#{username}, #{password});
    </insert>
    
    <!-- 查询操作 -->
    <select id="selectUser" parameterType="com.gec.bean.User">
        select * from user;
    </select>
    
    <!-- 修改操作 -->
    <update id="updateUser" parameterType="com.gec.bean.User">
        update user
        set username=#{username},
            password=#{password}
        where id = #{id};
    </update>

    <!-- 删除操作 -->
    <update id="deleteUser" parameterType="int">
        delete
        from user
        where id = #{id};
    </update>
    
</mapper>
  1. 编写Test.java进行测试
package com.gec.test;

import com.gec.bean.User;
import com.gec.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {

    public static void main(String[] args) throws IOException {
        //1、加载mybatis的全局配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //2、生成sqlsessionfactory【会话的工厂类】【用于生成session会话】
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3、通过sqlsessionfactory来得到生成sqlsession会话对象
        SqlSession session = sqlSessionFactory.openSession();
        //4、通过会话对象得到mapper接口对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        //通过mapper对象执行操作方法
        
        //练习0:插入数据操作
        User user = new User();
        user.setUsername("tom");
        user.setPassword("123456");
        int result = userMapper.insertUser(user);
        System.out.println(result);
        
        //练习1:根据主键删除数据操作
//        int result = userMapper.deleteUser(3);
//        System.out.println(result);

        //练习2:根据主键修改用户名及密码操作
//        User user = new User();
//        user.setId(2);
//        user.setUsername("zhangsan");
//        user.setPassword("abc");
//        //
//        int result = userMapper.updateUser(user);
//        System.out.println(result);

        //查询:查询所有的数据
//        List<User> list = userMapper.selectUser();
//        for (User user : list) { System.out.println(user); }

        //添加删除修改要提交事务,不然不会存储到数据库
        session.commit();
    }
}

练习题

答案在上述代码的注释中

1. 根据主键删除数据操作

2. 根据主键修改用户名及密码操作

3. 查询所有的数据


五、结果映射

我们实际运用的时候,如果实体类中的变量和数据库中的不一致,就会无法访问,所以需要将结果一对一映射

UserMapper.xml里加入以下代码,将查询结果字段和实体类中的变量名进行一对一的映射

 <!--   定义结果集的映射    查询结果字段和实体类中的变量名进行一对一的映射 -->
    <resultMap id="UserResultMap" type="com.gec.bean.User">
        <!--    property实体类中的变量名   column查询结果字段名  -->
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="realname" column="realname"></result>
        <result property="password" column="password"></result>
        <result property="card" column="IDcard"></result>
        <result property="phone" column="phone"></result>
        <result property="email" column="email"></result>
        <result property="paypwd" column="paypwd"></result>
        <result property="status" column="status"></result>
        <result property="reputation" column="reputation"></result>
    </resultMap>

怎么以映射查询表所有数据 ?

修改UserMapper.xml以下代码:

 <!-- id相当于方法名  resultType 查询结果返回的数据类型 resultType="com.gec.bean.User" -->
    <select id="selectUser" resultMap="UserResultMap">
        select * from user;
    </select>

运行Test.java,运行结果如下:
在这里插入图片描述
可见,只需将 parameterType="com.gec.bean.User" 改成 resultMap="UserResultMap" ,就可以改变入参的数据结构。

最后

实际应用中,我们不需要进行如此复杂的建类、建方法、和映射。mybatis有逆向工程 这一概念(可以根据数据库自动建立以上的操作)点击蓝字直接跳转~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷的上官梓芸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值