简单搭建一个MyBatis的例子

本文档提供了一个完整的MyBatis配置及简单使用的示例,包括核心工具类MyBatisUtils的创建,主配置文件mybatis.xml的内容,以及实体类、接口和mapper文件的定义。示例展示了如何通过MyBatis进行SQL操作,如根据ID、邮箱选择学生,以及使用多种参数形式进行查询。此外,还包括测试类Mytest2,用于验证接口的正确性。

MyBatis一个简单例子配置

随便一个例子

核心部分

工具类(utils)

MyBatisUtils.java

package com.vvu2.utils;

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;

/*
 * 工具类:创建SqlSession对象
 * */
public class MyBatisUtils {

    private static SqlSessionFactory factory = null;

    static {
        String config = "mybatis.xml";
        try {
            InputStream inputStream = Resources.getResourceAsStream(config);
            factory= new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //创建方法,获取SqlSession对象
    public static SqlSession getSqlSession() {
        SqlSession session = null;
        if (factory != null) {
            session = factory.openSession();
        }

        return session;
    }
}

主配置文件(resources)

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>
    <!--设置日志-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--声明别名-->
    <typeAliases>
    <!--
        第一种语法格式
        type:java类型的全限定名称(自定义类型)
        alias:自定义别名

        优点:别名可以 自定义
        缺点:每个类型必须单独定义
    -->
<!--        <typeAlias type="com.vvu2.entity.Student" alias="stu"/>-->
<!--        <typeAlias type="com.vvu2.vo.QueryParam" alias="qp"/>-->

    <!--第二种方式
        name:包名,mybaits会把这个包中的所有类名作为别名(不区分大小写)
        优点:使用方便,一次性给多个类定义别名
        缺点:别名不能自定义,必须是类名。而且当有相同的类名出现,程序运行会出现识别错误
    -->
        <package name="com.vvu2.entity"/>

    </typeAliases>
    <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/springdb?userUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--
        指定其他mapper程序文件的位置:
        其他其他mapper程序文件目的是找到其他文件的sql语句
    -->
    <mappers>
        <!--
            使用mapper的resource属性指定mapper文件的路径。
            这个路径是从target/classes路径开启的

            使用注意:
            resource=“mapper文件的路径,使用 / 分割路径”
            一个mapper resource指定一个mapper文件
        -->
        <mapper resource="com/vvu2/dao/StudentDao.xml"/>
    </mappers>
</configuration>

其他部分

实体类(entity、vo)

Student类
私有属性、get()set()方法、toString()方法

package com.vvu2.entity;

public class Student {
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    public Student() {
    }

    public Student(Integer id, String name, String email, Integer age) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "学生实体{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

接口、mapper
StudentDao.java (student.java的接口类)

package com.vvu2.dao;

import com.vvu2.entity.Student;
import com.vvu2.vo.QueryParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface StudentDao {

    //重载方法
    Student selectById(Integer id);

    //dao接口的方法形参是一个简单类型的
    //简单类型: java基本数据类型和String
    Student selectByEmail(String email);

//    多个简单的参数
//    使用@Param命名参数,注解是mybatis提供的
//    位置:在形参定义的前面
//    属性:value 自定义的参数名称
    List<Student> selectByNameOrAge(@Param("myname") String name, @Param("myage") Integer age);

//    一个Java对象作为参数(对象有属性,每个属性有set,get方法)
    List<Student> selectByObject(Student student);

    List<Student> selectByQueryParam(QueryParam param);

//    简单类型;使用位置,获取参数
    List<Student> selectByPosition(String name,Integer age);

//    使用Map作为参数
    List<Student> selectStudentByMap(Map<String,Object> map);

//    例子:更新
    int updateStudent(Student student);

//    ${}占位符的使用
    List<Student> queryStudent(@Param("studentName") String name);

    List<Student> queryStudentOrderById();
    List<Student> queryStudentOrderByName();
}

StudentDao.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="com.vvu2.dao.StudentDao">
    <!--使用insert,update,delete,select标签写sql -->

    <!--
        parameterType:指定dao接口形参的类型,这个属性的值可以使用 java 类型的全限定名称或者 mybatis 定义的别名

        mybatis执行的sql语句: select id,name,email,age from student where id=?
        ? 是占位符,使用jdbc中的PreparedStatement执行这样的sql语句

        PreparedStatement pst = conn.preparedStatement("select id,name,email,age from student where id=?");

        给 ? 位置赋值
        参数是Integer,执行pst.setInt(1,1005);
        参数是String,执行pst.setString(1,"1005");

        第一种用法:java类型的全限定类型名称 parameterType="java.lang.Integer"
        第二种用法:mybatis定义的java类型的别名 parameterType="int"

        parameterType:mybatis通过反射机制可以获取 dao接口方法参数的类型,可以不用写
        -->

    <select id="selectById" parameterType="int" resultType="student">
        select id,name,email,age from student where id=#{studentId}
    </select>

    <!--
        dao接口是一个简单类型的参数
        mapper文件,获取这个参数值,使用 #{任意字符}
        -->
    <select id="selectByEmail" resultType="com.vvu2.entity.Student">
        select id,name,email,age from student where email=#{studentEmail}
    </select>

    <!--
        多个简单类型的参数
        当使用了@Param命名后,例如@Param("myname")。
        在mapper中,使用#{命名的参数},例如 #{myname}
        -->
    <select id="selectByNameOrAge" resultType="com.vvu2.entity.Student">
        select id,name,email,age from student where name=#{myname} or age=#{myage}
    </select>

    <!--
        一个java对象作为方法的参数,使用对象的属性作为参数值使用
        简单的语法: #{属性名}, mybatis调用此属性的getXXX()方法获取属性值
        -->
    <select id="selectByObject" resultType="com.vvu2.entity.Student">
        select id,name,email,age from student where name=#{email} or age=#{age}
    </select>

    <select id="selectByQueryParam" resultType="com.vvu2.entity.Student">
        select id,name,email,age from student where name=#{p1} or age=#{p2}
    </select>

    <!--
        使用位置获取参数值,dao接口是多个简单类型的参数
        语法: #{arg0},#{arg1}...
        -->
    <select id="selectByPosition" resultType="com.vvu2.entity.Student">
        select id,name,email,age from student where name=#{arg0} or age=#{arg1}
    </select>

    <!--
        使用Map来传递参数
        在mapper文件中,获取map的值,是通过Key获取的,语法:#{key}
        -->
    <select id="selectStudentByMap" resultType="com.vvu2.entity.Student">
        select id,name,email,age from student where name=#{myname} or age=#{myage}
    </select>

    <!--更新    -->
    <insert id="updateStudent">
        update student set name=#{name},email=#{email},age=#{age} where id=#{id}
    </insert>

    <!--${}-->
    <select id="queryStudent" resultType="com.vvu2.entity.Student">
        select * from student where name=${studentName}
    </select>

    <!--id  列排序-->
    <select id="queryStudentOrderById" resultType="com.vvu2.entity.Student">
        select * from student order by id
    </select>

    <!--name 排序-->
    <select id="queryStudentOrderByName" resultType="com.vvu2.entity.Student">
        select * from student order by name
    </select>
</mapper>

测试部分

Mytest2.java

package com.vvu;

import com.vvu2.dao.StudentDao;
import com.vvu2.entity.Student;
import com.vvu2.utils.MyBatisUtils;
import com.vvu2.vo.QueryParam;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Mytest2 {

    @Test
    public void testSelectById() {
        //1、获取SqlSession
        SqlSession session = MyBatisUtils.getSqlSession();
        //2、获取dao的代理
        StudentDao dao = session.getMapper(StudentDao.class);
        Student student = dao.selectById(1002);
        System.out.println("student = " + student);
        //4、关闭SqlSession对象
        session.close();
    }

    @Test
    public void testOneParameter() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        Student student = dao.selectByEmail("maladdy@qq.com");
        System.out.println("email = " + student);
        sqlSession.close();
    }

    @Test
    public void testselectByNameOrAge(){
        SqlSession session=MyBatisUtils.getSqlSession();
        StudentDao dao = session.getMapper(StudentDao.class);
        List<Student> students = dao.selectByNameOrAge("李四", 24);
        students.forEach(stu-> System.out.println("stu = " + stu));
        session.close();
    }

    @Test
    public void testselectByObject(){
        SqlSession session=MyBatisUtils.getSqlSession();
        StudentDao dao = session.getMapper(StudentDao.class);

        Student student=new Student();
        student.setName("里大大");
        student.setAge(35);
        student.setEmail("花花");
        List<Student> students= dao.selectByObject(student);
        students.forEach(stu-> System.out.println("stu = " + stu));
        session.close();
    }

    @Test
    public void testselectByObject2(){
        SqlSession session=MyBatisUtils.getSqlSession();
        StudentDao dao = session.getMapper(StudentDao.class);
        QueryParam param=new QueryParam();
        param.setP1("maladdy");
        param.setP2(22);
        List<Student> students=dao.selectByQueryParam(param);
        students.forEach(stu -> System.out.println("stu = " + stu));
        session.close();
    }

    @Test
    public void testselectByPosition(){
        SqlSession sqlSession=MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Student> students = dao.selectByPosition("李四", 24);
        students.forEach(stu-> System.out.println("stu = " + stu));
        sqlSession.close();
    }

    @Test
    public void testselectStudentByMap(){
        SqlSession sqlSession=MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

//        使用Map传递参数
        Map<String,Object> data=new HashMap<>();
        data.put("myname","花花");
        data.put("myage",27);
        List<Student> students = dao.selectStudentByMap(data);
        students.forEach(stu-> System.out.println("stu = " + stu));
        sqlSession.close();
    }

    @Test
    public void testupdateStudent(){
        SqlSession sqlSession=MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        Student student=new Student();
        student.setId(1001);
        student.setName("法外狂徒");
        student.setEmail("Kuang@qq.com");
        student.setAge(40);
        int rows = dao.updateStudent(student);
        sqlSession.commit();
        System.out.println("更新学生的rows= " + rows);
        sqlSession.close();

    }
}

数据库 (mysql 8.0)

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值