mybatis入门篇1 --- 编写入门小程序

首先简单说一下为什么使用mybatis,我们上一个项目使用的JDBC,所有的sql语句都是写在java程序中,这样的就会使sql语句与java程序高度耦合,不符合我们的高内聚,低耦合情况,我们只希望你给我一个接口并且返回指定类型的程序,具体如何实现我不管,这样才会更好的进行操作,Hibernate跟mybatis都属于这种情况,hibernate属于全自动框架,mybatis属于半自动框架,什么意思?hibernate对于简单的数据库操作很方便,但是一旦涉及到复杂的数据库操作或者想要对sql语句优化就会很乏力,无法处理,因为sql是内部产生的,mybatis解决了这个问题。我们常听说的sql语句优化,就是这种情景。Mybatis是一款半自动化的持久性框架,他支持定制化sql,存储过程以及高级映射的优秀的持久性框架。

mybatis的入门程序也可以看:https://mybatis.org/mybatis-3/getting-started.html

首先第一步下载我们所需的jar包,直接去github:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.3,下载最新版的,我这个不知道为啥下载失败,因此使用的是网上中的3.4.6,但都差不多。

如果后续不想要写javabean的get,set方法,可以下载lombok包,同时把junit包加进去,我没有起项目,直接就是一般的java程序,下面截图是主要的代码

首先看一下我们引用的第三方包,者mybatis基础上增加了一个mysql连接包,junit测试包,以及lombok包

首先我们看一下配置文件,SqlMappingConfig.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>

    <!--这个目前还是需要的,后续spring整合之后,会使用spring的连接池-->
    <environments default="development">
        <environment id="development">
            <!--声明使用JDBC的事务管理-->
            <transactionManager type="JDBC"/>
            <!--数据库连接吃的配置操作-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定映射文件,一般这个文件跟我们的映射类放在同一级目录下-->
    <mappers>
        <mapper resource="com/yang/domain/Customer.xml"/>
    </mappers>
</configuration>

接下来我们需要定义一个javabean与数据库对应,Customer

package com.yang.domain;

import lombok.Getter;
import lombok.Setter;

// 引用lombok中的get,set方法,自动为我们生成getattr,setattr方法,这个就是数据库的映射表,字段要与数据库一致
//@Getter @Setter
// 我这里还是搞上set get方法
public class Customer {
    private Integer id;
    private String username;
    private String job;
    private String phone;
    private String email;

    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 getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    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;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", username=‘" + username + ‘\‘‘ +
                ", job=‘" + job + ‘\‘‘ +
                ", phone=‘" + phone + ‘\‘‘ +
                ", email=‘" + email + ‘\‘‘ +
                ‘}‘;
    }
}

我们在同级目录下定义我们这个customer的映射表,注意resultType不要写成resultMap,我一开始就写错了,mybatis报错也没有定位,有一点错误就会报出来,找了半天错误。。。。。

<?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="myCustomer">
    <!--根据id查询-->
    <select id="queryCustomerById" parameterType="java.lang.Integer" resultType="com.yang.domain.Customer">
        SELECT * FROM `customer` WHERE id = #{id}
    </select>
    <!--查询所有-->
    <select id="queryAllCustomer" resultType="com.yang.domain.Customer">
        SELECT * FROM `customer`
    </select>
    <!--添加-->
    <insert id="insertCustomer" parameterType="com.yang.domain.Customer">
        /*这个获取返回id,并且赋值给我们返回的对象,如果没有这个那么返回的customer对象中id就会为空*/
        <selectKey keyColumn="id" keyProperty="id" resultType="Integer" order="AFTER">
            select last_insert_id()
        </selectKey>
        insert into `customer`(username, job, phone, email) values (#{username}, #{job}, #{phone}, #{email})
    </insert>
    <!--更新-->
    <update id="updateCustomer" parameterType="com.yang.domain.Customer">
        update `customer` set username=#{username} where id=#{id}
    </update>
    <!--删除-->
    <delete id="deleteCustomer" parameterType="com.yang.domain.Customer">
        delete from `customer` where id=#{id}
    </delete>

</mapper>

因为我们这个有增删改查,因此在获取操作数据库的session会话做了一个工具类的封装,MyBatisUtil

package com.yang.util;

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.InputStream;

// 为了方便测试,我们封装一个获取连接对象的工具类
public class MyBatisUtil {

    // 声明session工厂
    public static final SqlSessionFactory sessionFactory;

    static {
        // 加载配置文件
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = null;
        try {
            // 读取配置文件
            inputStream = Resources.getResourceAsStream("SqlMappingConfig.xml");
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 获取session工厂
        sessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }

    // 获取连接对象
    public static SqlSession openSession() {
        return sessionFactory.openSession();
    }
}

最终看一下我们的测试文件

package com.yang.test;

import com.yang.domain.Customer;
import com.yang.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class TestCustomer {

    // 查询单个用户
    @Test
    public void test() {
        // 获取session连接对象(会话)
        SqlSession sqlSession = MyBatisUtil.openSession();
        // 执行sql语句,查询查询一条数据使用selectOne
        Customer customer = sqlSession.selectOne("queryCustomerById", 1);
        System.out.println(customer);  // Customer{id=1, username=‘yang‘, job=‘射手‘, phone=‘13499887733‘, email=‘[email protected]‘}
        // 完毕之后需要关闭会话
        sqlSession.close();
    }

    // 查询所有用户
    @Test
    public void testList() {
        SqlSession sqlSession = MyBatisUtil.openSession();
        List<Customer> customers = sqlSession.selectList("queryAllCustomer");
        for (Customer customer : customers) {
            System.out.println(customer); // Customer{id=1, username=‘yang‘, job=‘射手‘, phone=‘13499887733‘, email=‘[email protected]‘}  ....
        }
        sqlSession.close();
    }

    // 插入操作
    @Test
    public void insert() {
        SqlSession sqlSession = MyBatisUtil.openSession();
        Customer customer = new Customer();
        customer.setUsername("yang");
        customer.setPhone("18122222222");
        Integer id = sqlSession.insert("insertCustomer", customer);
        // 当改变数据库时,我们需要手动提交
        sqlSession.commit();
        System.out.println(customer);  // Customer{id=12, username=‘yang‘, job=‘null‘, phone=‘18122222222‘, email=‘null‘}
        System.out.println(id);  // 1 这个是影响的行数,想要id直接去返回的结果集中去拿
        sqlSession.close();
    }

    // 更新操作
    @Test
    public void update() {
        SqlSession sqlSession = MyBatisUtil.openSession();
        Customer customer = sqlSession.selectOne("queryCustomerById", 1);
        customer.setUsername("yang");
        System.out.println(customer);  // Customer{id=1, username=‘yang‘, job=‘射手‘, phone=‘13499887733‘, email=‘[email protected]‘}
        sqlSession.update("updateCustomer", customer);
        System.out.println(customer);  // Customer{id=1, username=‘yang‘, job=‘射手‘, phone=‘13499887733‘, email=‘[email protected]‘}
        sqlSession.commit();
        sqlSession.close();
    }

    // 删除
    @Test
    public void delete() {
        SqlSession sqlSession = MyBatisUtil.openSession();
        Customer customer = sqlSession.selectOne("queryCustomerById", 3);
        System.out.println(customer);
        sqlSession.delete("deleteCustomer", customer);
        sqlSession.commit();
        sqlSession.close();
    }
}

通过编写代码,已经对mybatis有了基本的认识,我们具体看一下mybatis的执行流程图,可以采用debug模式一步一步看:

原文地址:https://www.cnblogs.com/yangshixiong/p/12243372.html

时间: 2024-10-08 20:04:23

mybatis入门篇1 --- 编写入门小程序的相关文章

java-第四章-机票价格受到淡季旺季的影响,编写的小程序

import java.util.Scanner; public class A02 { /**  * @param args  */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new  Scanner (System.in); System.out.println("请输入月份:1~12"); int choice=input.nextInt(

从入门到上线一个天气小程序

作者:wuwhs segmentfault.com/a/1190000017388333 前言 学习了一段时间小程序,大致过了两遍开发文档,抽空做个自己的天气预报小程序,全当是练手,在这记录下.小程序开发的安装.注册和接入等流程就不罗列了,在小程序接入指南已经写得很清楚了,以下只对开发过程常用到得一些概念进行简单梳理,类比 Vue 加强记忆,最后选取个人项目天气小程序中要注意的几点来说明. 欢迎扫码体验: 源码请戳这里,欢迎start~ 初始化项目目录结构 安装好开发者工具,填好申请到的 App

高效编写微信小程序

原文:https://isux.tencent.com/high-performance-wechat-app-development.html 前言 微信小程序是一个工程,就和盖房子一样,打好了地基,才能保证后续工程师建立在可靠牢固的基础上. 笔者需要经常新建项目,每次都要重复"修改项目结构 -> 从老项目中复制粘贴文件 -> 删除一些老项目中代码"这样的过程,实在是-费心费力. 另一个痛点是:每次新建小程序页面要生成三个文件名相同的文件 ( .wxml..wxss 和

用易语言编写的小程序——电子表

在写软件测评的时候想到了易语言,这个我高中用来写小程序玩的编程软件,正好编了一个小程序分享一下,电子表. 如图所示,这就是一个exe文件,可以直接打开. 打开后如题,我设置分为中国时间和美国时间,可供选择. 如图分别为中国时间显示和美国时间显示. 其中时间是可以动态变化的,用到了时间周期.当中国时间显示时,屏蔽美国时间周期,当美国时间显示时,屏蔽中国周期,从而达到不会显示混乱的目的. 另附此小软件下载地址(个人网址,放心访问,还可以听音乐o(∩_∩)o ):http://hgcrown.amnu

Python程序编写购物小程序

购物车要求: 用户名和密码存放于文件中 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' 用户名和密码存放于文件中 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许

spring入门篇10 --- springMVC入门小程序

继续昨晚没有完成的这个小demo,完成这个,我们基本上算入门 首先,这个demo继续使用注解方式,源码地址github 首先看一下这个,这个就是maven起的项目结构,使用SpringMVC起项目,webapp就会与src同级,但是我们一般把src当作源码目录,所以做好可以做到同级,但这个就是为了练习. 首先明确一下,DispatcherServlet是实现servlet接口,Dispatcher使用Spring配置文件告知spring他需要请求反射,视图解析,异常处理等,而我们项目一般是跑在t

什么是接口(入门篇)——使你的程序功能丰富

重复劳动 在一个主项目中,经常会放置多个子功能的入口,这些入口有可能是按钮,有可能是下拉菜单. 初始开发起来,肯定很轻松,在界面上放置一个按钮,给它一个名字,然后到他的Click事件中编写一段代码,让子功能的界面弹出. 但是随着子功能的不断变多,这个毫不起眼的几个小工作,我们在不停重复的进行. 最头疼的是,突然有一天,你的PM跟你说,这个界面不要了,或者是这个子功能的入口换成另一个窗体的时候,你已经不记得这不起眼的几行代码在哪里了. 问题出在哪? 这样的设计模式,也是初学者最容易走的开发方式.

Java应用基础微专业-入门篇-第1章用程序来做计算

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px "PingFang SC" } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Helvetica } p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px "PingFang SC" } p.p2 { margin: 0.0px 0.0px 0.0px

怎么样通过编写Python小程序来统计测试脚本的关键字

通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数.业务函数需要修改,那么势必要找出那些引用过这个被修改函数的地方,有些IDE支持全文查找和引用查找,而有些简单的可能就没有,因为日后要用到统计功能.和一些其它的需求,所以写了一个脚本.除了跟目录下全文查找引用过的文件外,还是支持统计查找到的数量,一次可以查找多个关键字,支持按主关键字来归类. #encoding: utf-8 import os import sys import re   r