mybatis 基本用法

最近跟着视频教程练习了一下 mybatis 的用法,感觉还是不太难的,不过还没运用到项目实战,这里只是这个框架的最基本用法,相信在实际项目中用法更加灵活多变。
我把所有的测试方法都放在一个类中了,看起来可能有点乱,见谅!仅供参考!

一、搭建环境

(1)导入 jar 包

先下载 jar 包 如何下载
其实只要加入mybatis-3.4.6.jar 框架包和 mysql-connector-java-5.1.13-bin.jar mysql驱动包就够基本用法了

(2)写 mybatis 的配置文件,这里放在 src 下;下图是我的目录结构:

本次练习目录结构
下面是 mybatis-conf.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>

    <properties resource="db.properties" ></properties>

    <typeAliases>
        <!-- <typeAlias type="com.xiao.test.User" alias="_user"/> -->
        <package name="com.xiao.test"/>
    </typeAliases>

    <!-- development:开发环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/xiao/test/userMapper.xml" />
        <mapper class="com.xiao.test.UserAnnotation" />  <!-- 基于注解 -->
        <mapper resource="com/xiao/test/teacherMapper.xml" /> <!-- 处理字段名与属性名不一致的Demo -->
        <mapper resource="com/xiao/test/courseMapper.xml" /> <!-- 一对一 和 一对多 -->
    </mappers>

</configuration>
(3)在mysql 数据库中建立一个 user 表,加入两条数据,并创建对应的实体类

user表
实体类 User.java

package com.xiao.test;

public class User {
    private int id;
    private String name;
    private int age;
    public User(int id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = 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;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
    }

}
(4)映射文件 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 namespace="com.xiao.test.userMapper">
    <!-- 根据 id 查询一个对象 
         大括号里的 id 是占位符,可以写其他的变量-->
    <select id="getUserById" parameterType="int" resultType="com.xiao.test.User">
        select * from user where id = #{id}
    </select>

    <!-- 参数中的 name 和 age 必须与 User 实体类中的属性一样 -->
    <insert id="addUser" parameterType="com.xiao.test.User">
        insert into user(name, age) values(#{name}, #{age})
    </insert>

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

    <update id="updateUser" parameterType="com.xiao.test.User">
        update user set name = #{name}, age = #{age} where id = #{id}
    </update>

    <select id="getAll" resultType="com.xiao.test.User">
        select * from user
    </select>

</mapper>
注意:

<1>实体类中要有 getter setter方法用于取值赋值,有参构造用于插入数据
<2>映射文件中的 sql 语句末尾不要分号
<3>一开始写 curd 测试的时候没有用类型别名,所以写参数类型时都用的全类名
<4>写好的映射文件要在配置文件中注册(见mybatis-conf.xml中的mappers标签)

(5)最后就是写测试类了,我放在了最后面。

另外,映射除了可以通过配置映射文件,还可以基于注解。写一个接口类,写上crud方法,并分别在方法上做好相应的注解,注意测试方法与配置映射文件的测试方法有区别

基于注解
package com.xiao.test;

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;

/**
 * 这是一个接口,不用实现
 * 注意:因为该类与userMapper.xml在同一目录位置,该类就别用UserMapper.java命名了,否则会冲突找不到
 */
public interface UserAnnotation {

    @Insert("insert into user(name, age) values(#{name}, #{age})")
    int addUser(User user);

    @Delete("delete from user where id = #{id}")
    int deleteById(int id);

    @Update("update user set name = #{name}, age = #{age} where id = #{id}")
    int updateUser(User user);

    @Select("select * from user where id = #{id}")
    User getUserById(int id);

    @Select("select * from user")
    List<User> getAll();
}

二、基本用法

下面把我用的表贴出来参考
teacher表course表这里写图片描述

(1)表字段与实体类属性名不一致的情况
package com.xiao.test;

//老师类
public class Teacher {
    private int tid;
    private String tname;

    public Teacher() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Teacher(int tid, String tname) {
        super();
        this.tid = tid;
        this.tname = tname;
    }
    //getter、setter、toString方法

映射文件 teacherMapper.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="com.xiao.test.teacherMapper">

    <!-- 表字段与实体类属性名不一致的情况
        (1)把查出的表字段取别名为属性名
        (2)查询结果映射
    -->

    <select id="getTeacherById1" parameterType="int" resultType="Teacher">
        select t_id tid, t_name tname from teacher where t_id = #{id}
    </select>

    <select id="getTeacherById2" parameterType="int" resultMap="getTeacherMapper">
        select * from teacher where t_id = #{id}
    </select>
    <resultMap type="Teacher" id="getTeacherMapper">
        <id property="tid" column="t_id"/>
        <result property="tname" column="t_name"/>
    </resultMap>

</mapper>

在配置文件注册、见配置文件,测试类见最后面。

(2)一对一、一对多、模糊查询

假设一门课程对应一个老师,一门课程对应多个学生
实体类(上面的Teacher.java,Course.java,Students.java)记得加上无参构造(重要)

package com.xiao.test;

import java.util.List;

//课程类
public class Course {
    private int cid;
    private String cname;

    private Teacher teacher;  //传入老师对象
    private List<Students> list;  //对应多个学生

    public Course() {
        super();
    }

    public Course(int cid, String cname, Teacher teacher, List<Students> list) {
        super();
        this.cid = cid;
        this.cname = cname;
        this.teacher = teacher;
        this.list = list;
    }
    //getter、setter、toString方法
package com.xiao.test;

public class Students {
    private int sid;
    private String sname;

    public Students() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Students(int sid, String sname) {
        super();
        this.sid = sid;
        this.sname = sname;
    }
    //getter、setter、toString方法

模糊查询需要一个 条件实体类

package com.xiao.test;

public class Conditions {
    private int minTeacherId;
    private int maxTeacherId;
    private String name;

    public Conditions(int minTeacherId, int maxTeacherId, String name) {
        super();
        this.minTeacherId = minTeacherId;
        this.maxTeacherId = maxTeacherId;
        this.name = name;
    }
    //getter、setter方法

映射文件 courseMapper.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="com.xiao.test.courseMapper">

    <!-- 模糊查询:需要一个 条件实体类 -->
    <select id="getCourseByLike" parameterType="Conditions" resultType="Course">
        select c_id cid, c_name cname from course where 
        <if test="name != '%null%'">
            c_name like #{name} and
        </if>
        c_teacher_id between #{minTeacherId} and #{maxTeacherId}
        <!-- 后面可以加其他条件 -->
    </select>

    <!-- 一对多: 假设一门课程值对应多个学生 -->
    <!-- 根据 id 查询一个 course 对象(附带选择这门课程的多个 students 对象)
        (1)select * from course c,students s where c.c_id = s.s_course_id and c.c_id = 1
        (2)select * from students where s_course_id = (select c_id from course where c_id = 1)
    -->
    <select id="getCourseById3" parameterType="int" resultMap="getCourseMapper3">
        select * from course c,students s where c.c_id = s.s_course_id and c.c_id = #{id}
    </select>
    <resultMap type="Course" id="getCourseMapper3">
        <id property="cid" column="c_id"/>
        <result property="cname" column="c_name"/>
        <collection property="list" ofType="Students">
            <id property="sid" column="s_id"/>
            <result property="sname" column="s_name"/>
        </collection>
    </resultMap>

    <select id="getCourseById4" parameterType="int" resultMap="getCourseMapper4">
        select * from course where c_id = #{id}
    </select>
    <select id="getStudents" parameterType="int" resultType="Students">
        select s_id sid, s_name sname from students where s_course_id = #{id}
    </select>
    <resultMap type="Course" id="getCourseMapper4">
        <id property="cid" column="c_id"/>
        <result property="cname" column="c_name"/>
        <collection property="list" column="c_id" select="getStudents"></collection>

    </resultMap>

    <!-- 一对一: 假设一门课程值对应一个老师 -->
    <!-- 根据 id 查询一个 course 对象(附带一个 teacher 对象)
        (1)select * from course c,teacher t where c.c_teacher_id = t.t_id and c_id = 1
        (2)select * from teacher where t_id = (select c_teacher_id from course where c_id = 1)
    -->
    <select id="getCourseById1" parameterType="int" resultMap="getCourseMapper1">
        select * from course c,teacher t where c.c_teacher_id = t.t_id and c.c_id = #{id}
    </select>
    <resultMap type="Course" id="getCourseMapper1">
        <id property="cid" column="c_id"/>
        <result property="cname" column="c_name"/>
        <association property="teacher" javaType="Teacher">
            <id property="tid" column="t_id"/>
            <result property="tname" column="t_name"/>
        </association>
    </resultMap>

    <select id="getCourseById2" parameterType="int" resultMap="getCourseMapper2">
        select * from course where c_id = #{id}
    </select>
    <select id="getTeacher" parameterType="int" resultType="Teacher">
        select t_id tid, t_name tname from teacher where t_id = #{id}
    </select>
    <resultMap type="Course" id="getCourseMapper2">
        <id property="cid" column="c_id"/>
        <result property="cname" column="c_name"/>
        <association property="teacher" column="c_teacher_id" select="getTeacher"></association>
    </resultMap>

</mapper>
下面是所有用法的测试类
package com.xiao.test;

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

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

public class MainTest {
    public static void main(String[] args) {

        InputStream is = MainTest.class.getClassLoader().getResourceAsStream("mybatis-conf.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    //  SqlSession session = factory.openSession(true);  //自动提交
        SqlSession session = factory.openSession();

        //模糊查询
        String name = "m";
        Conditions parameter = new Conditions(1, 2, "%" + name + "%");
        String statement = "com.xiao.test.courseMapper.getCourseByLike";
        List<Course> list = session.selectList(statement, parameter);
        System.out.println(list);

        //一对多
    //  String statement = "com.xiao.test.courseMapper.getCourseById4";
    //  Course course = session.selectOne(statement, 2);
    //  System.out.println(course);

        //一对一
    //  String statement = "com.xiao.test.courseMapper.getCourseById2";
    //  Course course = session.selectOne(statement, 1);
    //  System.out.println(course);

        //处理字段名与属性名不一致的Demo
    //  String statement = "com.xiao.test.teacherMapper.getTeacherById2";
    //  Teacher teacher = session.selectOne(statement, 1);
    //  System.out.println(teacher);

    //  String statement = "com.xiao.test.userMapper.getUserById";
    //  User u = session.selectOne(statement, 1);
    //  System.out.println(u);

    //  String statement = "com.xiao.test.userMapper.addUser";
    //  int i = session.insert(statement, new User(-1, "tom", 21)); //id 是自增的
    //  session.commit();   //需要手动提交才能保存到数据库
    //  System.out.println(i);

    //  String statement = "com.xiao.test.userMapper.updateUser";
    //  int i = session.update(statement, new User(1, "test", 21)); // 把 id=1的 xiao 改成了 test
    //  session.commit();
    //  System.out.println(i);

    //  String statement = "com.xiao.test.userMapper.deleteById";
    //  int i = session.delete(statement, 2); // 把 id=2的 admin 删除
    //  session.commit();
    //  System.out.println(i);

    //  String statement = "com.xiao.test.userMapper.getAll";
    //  List<User> allUser = session.selectList(statement);
    //  System.out.println(allUser);

        //基于注解
    //  UserAnnotation mapper = session.getMapper(UserAnnotation.class);
    //  List<User> allUser = mapper.getAll();
    //  System.out.println(allUser);

        session.close();

    }
}

我把以上的源代码放到了我的百度云,供参考 mybatis练习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值