MyBatis实例四:student的增删查改(通过接口方式)

1、Student类

package me.xiaoxiao.domain;

/**
 * 
 * @author xiaoxiao
 *  数据库中Student表所对应的实体类及其属性(id,name,age)
 */
public class Student {
    private int id;
    private String name;
    private int age;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    public String toString(){
        return "Student[id="+id+",name="+name+",age="+age+"]"+"\n";
    }
}

2、定义xml映射文件:studentMapper.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:包路径+sql映射文件名 -->
<mapper namespace="me.xiaoxiao.mapping.StudentMapper">    
    
     <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,
                  id属性值必须是唯一的,不能够重复,唯一标识这条记录信息;
                  parameterType属性指明查询时使用的参数类型;
                  resultType属性指明查询返回的结果集类型。
    resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
    User类就是users表所对应的实体类
    -->
    
    <!-- 查询学生信息 -->
    <select id="getStudent" parameterType="int" resultType="me.xiaoxiao.domain.Student">
          select * from student where id = #{id}
    </select>
    
    <!-- 为什么查询学生中parameterType参数值为int,而新增学生确实me.xiaoxiao.domain.Student -->
    <!-- 新增学生 -->
    <insert id="addStudent" parameterType="me.xiaoxiao.domain.Student">
          <!-- insert into student(id,name,age) value(3,"肖文飞",4) -->
          insert into student(id,name,age) value(#{id},#{name},#{age})
    </insert>
    
    <update id="updateStudent" parameterType="me.xiaoxiao.domain.Student">
          update student set name=#{name},age=#{age} where id=#{id}
    </update>
    
    <delete id="deleteStudent" parameterType="me.xiaoxiao.domain.Student">
          delete from student where id=#{id}
    </delete>
    
    <select id="getAllStudent" resultType="me.xiaoxiao.domain.Student">
          select * from student
    </select>
</mapper>

3、定义映射接口:StudentMapper

package me.xiaoxiao.mapping;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import me.xiaoxiao.domain.Student;

public interface StudentMapper {
    //如果仅仅定义接口方法,其名称必须与xml文件中  唯一标识该语句的id名称一致
//    @Insert("insert into student(name,age) values(#{name},#{age})")
    public void addStudent(Student student);
    
//    @Delete("delete from student where id=#{id}")
    public void deleteStudent(Student student);
    
//    @Select("select * from student where id=#{id}")
    public Student getStudent(int id);

//    @Select("select * from student")
    public List<Student> getAllStudent();
    
//    @Update("update student set name=#{name},age=#{age} where id=#{id}")
    public void updateStudent(Student student);
}

4、定义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:包路径+sql映射文件名 -->
<mapper namespace="me.xiaoxiao.mapping.StudentMapper">    
    
     <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,
                  id属性值必须是唯一的,不能够重复,唯一标识这条记录信息;
                  parameterType属性指明查询时使用的参数类型;
                  resultType属性指明查询返回的结果集类型。
    resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
    User类就是users表所对应的实体类
    -->
    
    <!-- 查询学生信息 -->
    <select id="getStudent" parameterType="int" resultType="me.xiaoxiao.domain.Student">
          select * from student where id = #{id}
    </select>
    
    <!-- 为什么查询学生中parameterType参数值为int,而新增学生确实me.xiaoxiao.domain.Student -->
    <!-- 新增学生 -->
    <insert id="addStudent" parameterType="me.xiaoxiao.domain.Student">
          <!-- insert into student(id,name,age) value(3,"肖文飞",4) -->
          insert into student(id,name,age) value(#{id},#{name},#{age})
    </insert>
    
    <update id="updateStudent" parameterType="me.xiaoxiao.domain.Student">
          update student set name=#{name},age=#{age} where id=#{id}
    </update>
    
    <delete id="deleteStudent" parameterType="me.xiaoxiao.domain.Student">
          delete from student where id=#{id}
    </delete>
    
    <select id="getAllStudent" resultType="me.xiaoxiao.domain.Student">
          select * from student
    </select>
</mapper>

 

5、util工具类获取SqlSessionFactory

package me.xiaoxiao.util;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import me.xiaoxiao.util.Util;

public class Util {
    public static SqlSessionFactory getSqlSessionFactory(){
        
        /**
         *  获取SqlSessionFactory
         *  @return  SqlSesionFactory
         */
        String resource = "conf.xml";
        InputStream is = Util.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        return factory;
    }
    
    /**
     * 获取 SqlSession
     * @return SqlSession
     */
    public static SqlSession getSqlSession(){
        return getSqlSessionFactory().openSession();
    }
    
    /**
     *  获取SqlSession
     * @param isAutoCommit
     *        true: 表示创建的SqlSession对象在执行完成SQL之后会自动提交事务
     *        false: 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务
     * @return SqlSession
     */
    public static SqlSession getSqlSession(boolean isAutoCommit){
        return getSqlSessionFactory().openSession(isAutoCommit);
    }
}

6、数据库编辑:

 

 7、测试

package me.xiaoxiao.test;

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

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import me.xiaoxiao.domain.Student;
import me.xiaoxiao.mapping.StudentMapper;
import me.xiaoxiao.util.Util;

/**
 * 
 * @author xiaoxiao
 *   CRUD主要被用于在描述软件系统中数据库 或者持久层的基本的增删查改操作
 */
public class StudentTest {
    
    /**
     * 查询学生信息
     */
//    @Test
    public void queryStudent(){
        String resource = "conf.xml";
        InputStream is = StudentTest.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sessionFactory.openSession();
       
        String statement="me.xiaoxiao.mapping.studentMapper.getStudent"; //映射sql语句的标识字符串
        Student student=session.selectOne(statement,1);
        System.out.println(student);
        
        Student student2=session.selectOne(statement,2);
        System.out.println(student2);
        
    }
    
    /**
     * 新增学生
     */
    @Test
    public void addStudent(){
        SqlSession sqlSession = Util.getSqlSession(true); //这里为什么可以使用Util.getSqlSession(可直接引用该类)
        String statement="me.xiaoxiao.mapping.StudentMapper.addStudent";
        Student student=new Student();
        student.setId(6);
        student.setName("亚丽");
        student.setAge(20);
        int result =sqlSession.insert(statement,student);
        System.out.println(result);
        sqlSession.close();
    }
    
    /**
     * 修改学生信息
     */
//    @Test
    public void updateStudent(){
        SqlSession sqlSession = Util.getSqlSession(true);
        String statement = "me.xiaoxiao.mapping.StudentMapper.updateStudent";
        Student student = new Student();
        student.setId(5);
        student.setName("姜大小姐是姜兰");
        student.setAge(22);
        int result = sqlSession.update(statement,student);
        System.out.println(result);
        sqlSession.close();
    }
    
    @Test
    public void testSelecAll(){
        SqlSession sqlSession = Util.getSqlSession();
        StudentMapper  sMapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students=new ArrayList<>();
        students = sMapper.getAllStudent();
        sqlSession.close();
        System.out.println(students);
    }
}

控制台输出:

 

 注意:

1、statement=“me.xiaoxiao.mapping.StudentMapper.addStudent”中的名称与接口StudentMapper以及方法一致

 2、me.xiaoxiao.mapping.StudentMapper.java中的方法名必须与  studentMapper.xml中的唯一标识该条语句的id名一致

 

posted @ 2018-05-23 18:56  人类能走多远  阅读(1890)  评论(0)    收藏  举报