Mybatis入门案例超详细

Posted 会洗碗的CV工程师

tags:

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

目录

前言

一、查询所有用户

1. 持久层添加查询所有方法

2. 在UserMapper.xml映射文件添加查询语句

3. 测试方法

4. 运行结果

二、MyBatis核心对象及工作流程

1. MyBatis核心对象

2. MyBatis工作流程

3. 使用SqlSession操作数据库

三、添加其他常见方法

1. Mybatis新增用户

2. Mybatis用户更改

3. Mybatis删除用户

4. Mybatis根据用户id查询


前言

        在原来上一篇的基础上,我们需要新建一个数据库mybatis,在该数据库下新建一个user表,并插入数据,如下图所示!

        还要新建一个实体类User

package com.mybatisstudy.pojo;

public class User 
    private int id;
    private String username;
    private String sex;
    private String address;

    public User(String programmer, String man, String shangHai) 
        this.username = programmer;
        this.sex = man;
        this.address = shangHai;
    

    public User(int i, String programmer_1, String woman, String shenzhen) 
        this.id = i;
        this.username = programmer_1;
        this.sex = woman;
        this.address = shenzhen;
    

    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 getSex() 
        return sex;
    

    public void setSex(String sex) 
        this.sex = sex;
    

    public String getAddress() 
        return address;
    

    public void setAddress(String address) 
        this.address = address;
    

    @Override
    public String toString() 
        return "User[ " +
                "id=" + id +
                ", username='" + username + '\\'' +
                ", sex='" + sex + '\\'' +
                ", address='" + address + '\\'' +
                " ]";
    

一、查询所有用户

1. 持久层添加查询所有方法

// 查询所有用户
    List<User> findAll();

2. 在UserMapper.xml映射文件添加查询语句

<select id="findAll" resultType="com.mybatisstudy.pojo.User">
        select * from user
</select>

3. 测试方法

        在test包下新建一个测试类TestUserMapper.java,注意测试类需要插入一个Junit依赖

import com.mybatisstudy.mapper.UserMapper;
import com.mybatisstudy.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.After;
import org.junit.Before;
import org.junit.Test;


import java.io.InputStream;
import java.util.List;

public class TestUserMapper 

    InputStream is = null;
    SqlSession session = null;
    UserMapper userMapper = null;

    //前置方法,不必重复代码
    @Before
    public void before() throws Exception 
        System.out.println("前置方法执行·············");
        // (1)读取核心配置文件
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        // (2)创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // (3)SqlSessionFactoryBuilder对象获取SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(is);
        // (4)SqlSessionFactory对象获取SqlSession对象
        session = factory.openSession();
        // (5)SqlSession对象获取代理对象
        userMapper = session.getMapper(UserMapper.class);
    

    //后置方法,释放资源
    @After
    public void after() throws Exception 
        System.out.println("后置方法执行·············");
        session.close();
        is.close();
    
    // 测试查询所有用户的方法
    @Test
    public void testFindAll() throws Exception
        // 代理对象执行方法
        List<User> all = userMapper.findAll();
        all.forEach(System.out::println);

4. 运行结果

        OK,下面我们来详细解释一下前置方法,前置方法也是MyBatis核心对象和工作流程

二、MyBatis核心对象及工作流程

1. MyBatis核心对象

SqlSessionFactoryBuilder

SqlSession工厂构建者对象,使用构造者模式创建SqlSession工厂对象。

SqlSessionFactory

SqlSession工厂,使用工厂模式创建SqlSession对象。

SqlSession

该对象可以操作数据库,也可以使用动态代理模式创建持久层接口的代理对象操作数据库。

Mapper

持久层接口的代理对象,他具体实现了持久层接口,用来操作数据库。

2. MyBatis工作流程

创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder对象构建了SqlSessionFactory对象: 构造者模式

SqlSessionFactory对象生产了SqlSession对象:工厂模式

SqlSession对象创建了持久层接口的代理对象:动态代理模式

代理对象操作数据库

3. 使用SqlSession操作数据库

        除了代理对象能够操作数据库,SqlSession也能操作数据库。只是这种方式在开发中使用的较少,接下来我们使用SqlSession操作数据库:

// SqlSession直接操作数据库
    List<User> users = session.selectList("com.itbaizhan.mapper.UserMapper.findAll");
    users.forEach(System.out::println);

         这样也可以的,上面的是我们用的是调用接口方法执行。

三、添加其他常见方法

1. Mybatis新增用户

持久层添加新增用户方法

// 添加用户
    void add(User user);

映射文件新增标签

    <insert id="add" parameterType="com.mybatisstudy.pojo.User">
        insert into user(username,sex,address) values(#username,#sex,#address)
    </insert>

在测试类新增方法测试一下

        注意:这里一定要执行提交事务方法

// 测试新增用户方法
    @Test
    public void testAdd() throws Exception 
        User user = new User("programmer","man","ShangHai");
        userMapper.add(user);

        //提交事务
        session.commit();
    

2. Mybatis用户更改

持久层添加用户信息更改方法

// 更新用户
    void update(User user);

映射文件新增标签

    <update id="update" parameterType="com.mybatisstudy.pojo.User">
        update user set
        username = #username,
        sex = #sex,
        address = #address
        where id = #id
    </update>

在测试类新增方法测试一下

        注意:这里一定要执行提交事务方法

// 测试更新用户方法
    @Test
    public void testUpdate() throws Exception
        User user = new User(7,"programmer_1","woman","Shenzhen");
        userMapper.update(user);

        //提交事务
        session.commit();
    

3. Mybatis删除用户

持久层添加删除用户方法

// 删除用户
    void delete(int userId);

映射文件新增标签

    <delete id="delete" parameterType="int">
        delete from user where id = #id
    </delete>

在测试类新增方法测试一下

        注意:这里一定要执行提交事务方法

// 测试删除用户方法
    @Test
    public void testDelete() throws Exception
        int userId = 7;
        userMapper.delete(userId);

        // 提交事务
        session.commit();
    

4. Mybatis根据用户id查询

持久层添加删除用户方法

// 根据ID查询用户
    User findById(int userId);

映射文件新增标签

    <select id="findById" parameterType="int" resultType="com.mybatisstudy.pojo.User">
        select * from user where id = #id
    </select>

在测试类新增方法测试一下

        注意:这里一定要执行提交事务方法

// 测试根据用户查询Id
    @Test
    public void testFindById() throws Exception
        int userId = 1;
        User user = userMapper.findById(userId);

        System.out.println(user);
    

        OK,本次Mybatis入门案例就写到这里了,感谢大家的认真浏览到这里的小伙伴,如果觉得觉得对你有帮助就三连支持一下吧!

Mybatis的多对多映射

一、Mybatis的多对多映射

  本例讲述使用mybatis开发过程中常见的多对多映射查询案例。只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见《Mybatis入门和简单Demo》和《Mybatis的CRUD案例

  完整的工程代码已上传至https://files.cnblogs.com/files/jiyukai/MyBatis.zip

  案例:查询xx同学所选择的多个不同选修课,查询xx选修课被多少同学选修

  步骤1.建表脚本,分别创建学生表,课程表,以及学生课程表,作为学生关系到课程的中间关联表。

create table students(
    sid int(5) primary key,
    sname varchar(10)
);
create table courses(
    cid int(5) primary key,
    cname varchar(10)
);
create table course_stu(
    sid int(5),
    cid int(5),
    primary key(sid,cid)    
);
insert into students(sid,sname) values(1,\'cat\');
insert into students(sid,sname) values(2,\'dog\');
insert into courses(cid,cname) values(1,\'java\');
insert into courses(cid,cname) values(2,\'net\');
insert into course_stu(sid,cid) values(1,1);
insert into course_stu(sid,cid) values(1,2);
insert into course_stu(sid,cid) values(2,1);
insert into course_stu(sid,cid) values(2,2);

  步骤2.编写课程和学生实体类,学生可选择多门课程,课程中有多个学生,因此在各自的实体类中都以集合的形式引入对方

package com.jyk.mybatis.moreTomore;

import java.util.ArrayList;
import java.util.List;

public class Course {
    private Integer id;                        //课程id
    private String name;                    //课程名称
    private List<Student> studentList = new ArrayList<Student>();    //对应的学生名称
    public Course(){}
    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 List<Student> getStudentList() {
        return studentList;
    }
    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
}
package com.jyk.mybatis.moreTomore;

import java.util.ArrayList;
import java.util.List;

public class Student {
    private Integer id;                //学生id
    private String name;            //学生姓名
    private List<Course> courseList = new ArrayList<Course>();   //选修的课程
    public Student(){}
    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 List<Course> getCourseList() {
        return courseList;
    }
    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }
}

  步骤3.编写mapper文件,在CourseMapper.xml中编写课程信息表字段与实体属性的映射关系,在StudentMapper.xml中编写学生实体和表字段的映射关系,并编写好根据学生姓名查询所有选修课程,以及根据选修课名称查询有多少学生的SQL,并将mapper文件和对应实体类的别名加入mybatis.xml(mybatis.xml的描述见Mybatis系列第一篇博客,此处由于配置type时指定了类的全路径,故无需将别名加入至mybatis.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 namespace="studentNamespace">
    <resultMap type="com.jyk.mybatis.moreTomore.Student" id="studentMap">
        <id property="id" column="sid" />
        <result property="name" column="sname"/>
    </resultMap>
    
    <!-- 查询java课程有哪些学生 -->
    <select id="findStudentByName" parameterType="string" resultMap="studentMap">
        select s.sid,s.sname
        from students s,course_stu m,courses c
        where s.sid = m.sid 
        and m.cid = c.cid
        and c.cname = #{name}
    </select>
</mapper>
<?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="courseNamespace">
    <resultMap type="com.jyk.mybatis.moreTomore.Course" id="courseMap">
        <id property="id" column="cid" />
        <result property="name" column="cname"/>
    </resultMap>
    
    <!-- 查询cat选学的课程 -->
    <select id="findCourseByName" parameterType="string" resultMap="courseMap">
        select c.cid,c.cname
        from students s,course_stu m,courses c
        where s.sid = m.sid 
        and m.cid = c.cid
        and s.sname = #{name}
    </select>
</mapper>
<?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">
    </properties>
    
    <!-- 设置类型别名 -->
    <typeAliases>

    </typeAliases>

    <!-- 设置一个默认的连接环境信息 -->
    <environments default="mysql_env">
        <!-- 连接环境信息,取一个唯一的编号 -->
        <environment id="mysql_env">
            <!-- mybatis使用的jdbc事务管理方式 -->
            <transactionManager type="jdbc">
            </transactionManager>
            
            <!-- mybatis使用连接池方式来获取链接 -->
            <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>
        <mapper resource="com/jyk/mybatis/moreTomore/CourseMapper.xml"/>
        <mapper resource="com/jyk/mybatis/moreTomore/StudentMapper.xml"/>
    </mappers>
    
</configuration>

  步骤4.编写Java代码实现该多对多查询,需要注意的是,区分于一对一查询,此处由于查询的结果有多个,是集合的形式返回,故查询的API应使用SqlSession提供的selectList接口而不再是selectOne。

package com.jyk.mybatis.moreTomore;

import java.util.List;
import org.apache.ibatis.session.SqlSession;

import com.jyk.mybatis.util.MyBatisUtil;

public class StudentCourseDao {
    /**
     * 查询cat选学的课程
     */
    public List<Course> findCourseByName(String name) throws Exception{
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtil.getSqlSession();
            return sqlSession.selectList("courseNamespace.findCourseByName",name);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }finally{
            MyBatisUtil.closeSqlSession();
        }
    }
    /**
     * 查询java课程有哪些学生
     */
    public List<Student> findStudentByName(String name) throws Exception{
        SqlSession sqlSession = null;
        try{
            sqlSession = MyBatisUtil.getSqlSession();
            return sqlSession.selectList("studentNamespace.findStudentByName",name);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }finally{
            MyBatisUtil.closeSqlSession();
        }
    }
    public static void main(String[] args) throws Exception{
        StudentCourseDao dao = new StudentCourseDao();
        List<Course> courseList = dao.findCourseByName("cat");
        for(Course c : courseList){
            System.out.println(c.getId()+":"+c.getName());
        }
        /*List<Student> studentList = dao.findStudentByName("java");
        for(Student s : studentList){
            System.out.println(s.getId()+":"+s.getName());
        }*/
    }     
}

 

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

Mybatis的多对多映射

Mybatis程序入门案例

MyBatis入门案例

MyBatis快速入门案例

MyBatis入门案例 增删改查

Mybatis入门(开发环境+入门案例)