Mybatis簡單上手

一曙旭、搭建MySQL環(huán)境

  • 創(chuàng)建maven項(xiàng)目

  • 導(dǎo)入maven依賴

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
  • 配置xml和properties文件的掃描方式
    <build>
        <resources>
            <!--配置資源掃描-resources包下面的xml文件和properties文件都可以被掃描到-->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

            <!--配置資源掃描-java包下面的xml文件和properties文件都可以被掃描到-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
  • 完整pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yaco</groupId>
    <artifactId>mybatis</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mybatis01</module>
        <module>mybatis02</module>
        <module>mybatis03</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    
    <build>
        <resources>
            <!--配置資源掃描-resources包下面的xml文件和properties文件都可以被掃描到-->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

            <!--配置資源掃描-java包下面的xml文件和properties文件都可以被掃描到-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

二恃逻、實(shí)現(xiàn)簡單的增刪改查

1均践、創(chuàng)建數(shù)據(jù)庫

創(chuàng)建一個簡單的用戶表,表中含有三個屬性坛吁,用戶id劳殖,用戶名和用戶密碼

CREATE DATABASE mybatis;
USE mybatis;

# 創(chuàng)建表
CREATE TABLE `user`(
    `id` INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(30) DEFAULT NULL,
    `pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

# 插入數(shù)據(jù)
INSERT INTO `user`(`id`,`name`,`pwd`) VALUES
(1,'張三','123456'),
(2,'李四','123456'),
(3,'狂神','123456')

2、創(chuàng)建mybatis-config.xml配置文件

主要配置數(shù)據(jù)連接的相關(guān)信息拨脉,包括驅(qū)動器哆姻、url、連接數(shù)據(jù)庫的用戶名和密碼玫膀、是否啟動數(shù)據(jù)庫連接池等信息

使用mapper配置userMapper.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>

    <!--配置別名-->
    <typeAliases>
        <typeAlias alias="User" type="com.yaco.pojo.User"></typeAlias>
    </typeAliases>

    <!--配置環(huán)境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?              useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;failOverReadOnly=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="com/yaco/dao/UserMapper.xml"/>
    </mappers>

</configuration>

3矛缨、創(chuàng)建對應(yīng)的數(shù)據(jù)庫中的實(shí)體類

實(shí)體類對應(yīng)數(shù)據(jù)庫中User表中的字符名,此處與表中字段名完全一致帖旨,也可以不一致

public class User {

    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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 String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

創(chuàng)建UserMapper的持久層接口

public interface UserMapper {

    // 查
    List<User> getUserList();

    // 增
    int addUser(User user);

    // 刪
    void deleteById(int id);

    // 該
    int update(User user);

    // 查找一個
    User findById(int id);

    // 根據(jù)用戶名和密碼查詢箕昭,使用map
    User findByNameAnsPwd(Map<String, Object> map);

    // 模糊查詢
    List<User> findUserLike(String value);
}

4、創(chuàng)建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="com.yaco.dao.UserMapper">

    <update id="update" parameterType="User">
        update user set name=#{name}, pwd=#{pwd}  where id = #{id}
    </update>

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

    <select id="getUserList" resultType="User">
        select * from user
    </select>

    <select id="findById" resultType="User" parameterType="int">
        select * from user where id = #{id}
    </select>

    <select id="findByNameAnsPwd" resultType="User" parameterType="map">
        select * from user where name=#{name} and pwd=#{pwd}
    </select>

    <select id="findUserLike" resultType="User">
        select * from user where name like #{value}
    </select>

    <insert id="addUser" parameterType="User">
        insert into user (id, name, pwd) values (#{id},#{name},#{pwd})
    </insert>

</mapper>

5解阅、創(chuàng)建一個MybatisUtil工具類

MybatisUtil工具類用于獲取執(zhí)行映射文件中的sql語句的SqlSession

public class MybatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        // 獲取SqlSessionFactory對象
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

6落竹、測試類

在test文件下做測試,保證包名與所測試的類包結(jié)構(gòu)一致

public class UserDaoTest {

    @Test
    public void testList() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userDao.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

    @Test
    public void testFindOne() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        User user = userDao.findById(1);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    public void testInsert() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(5);
        user.setName("hj");
        user.setPwd("123456");
        int res = userDao.addUser(user);
        if(res > 0) {
            System.out.println("插入成工");
        }
        System.out.println(user);
        // 插入要提交事務(wù)
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testUpdate() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(5);
        user.setName("yaco");
        user.setPwd("123456");
        int res = userDao.update(user);
        if(res > 0) {
            System.out.println("更新成功");
        }
        System.out.println(user);
        // 插入要提交事務(wù)
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testDelete() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        userDao.deleteById(5);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testMap() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "張三");
        map.put("pwd","123456");
        User user = userDao.findByNameAnsPwd(map);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    public void testLike() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        List<User> users = userDao.findUserLike("%李%");
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

三瓮钥、使用Mybatis實(shí)現(xiàn)多對一查詢

1筋量、搭建數(shù)據(jù)表結(jié)構(gòu)

創(chuàng)建兩張表烹吵,分別式學(xué)生表和老師表,一個學(xué)生對應(yīng)一個老師桨武,一個老師可以對應(yīng)多名學(xué)生肋拔。

CREATE TABLE student(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(30) DEFAULT NULL
    tid INT(20) DEFAULT NULL,
    CONSTRAINT FOREIGN KEY(tid) REFERENCES teacher(id)
)ENGINE = INNODB DEFAULT CHARSET utf8

CREATE TABLE teacher(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(20),
)ENGINE = INNODB DEFAULT CHARSET utf8

添加一些數(shù)據(jù)

2、搭建實(shí)體類及映射環(huán)境

  • 實(shí)體類
public class Student {

    private int id;
    private String name;
    private Teacher teacher;

    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 Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", teacher=" + teacher +
                '}';
    }
}

public class Teacher {

    private int id;
    private String name;

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

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
  • StudentMapper持久層接口呀酸,查詢學(xué)生凉蜂,實(shí)現(xiàn)多對一的功能
public interface StudentMapper {

    List<Student> selectStudentList();

    List<Student> selectStudentList2();

    Teacher selectTeacherById(int id);
}

3、使用嵌套查詢完成多對一查詢

    <!--多對一的第一種方式: 使用嵌套查詢-->
    <resultMap id="studentTeacher" type="Student">
        <result property="id" column="sid" />
        <result property="name" column="sname"/>
        <association property="teacher" javaType="Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>

    <select id="selectStudentList" resultMap="studentTeacher">
        select s.id as sid, s.name as sname, t.id as tid, t.name as tname from student s, teacher t where s.tid = t.id
    </select>

4性誉、使用子查詢完成多對一查詢

    <!--多對一的第二種方式窿吩,使用子查詢-->
    <resultMap id="studentTeacher2" type="Student">
        <result property="id" column="id" />
        <result property="name" column="name"/>
        <association property="teacher" javaType="Teacher" select="selectTeacherById" column="tid"></association>
    </resultMap>

    <select id="selectStudentList2" resultMap="studentTeacher2">
        select * from student
    </select>

    <select id="selectTeacherById" resultType="Teacher">
        select * from teacher where id = #{id};
    </select>

5、測試

public class MybatisTest {

    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = mapper.selectStudentList();
        for (Student student : students) {
            System.out.println(student);
        }
        sqlSession.close();
    }

    @Test
    public void test2() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> students = mapper.selectStudentList2();
        for (Student student : students) {
            System.out.println(student);
        }
        sqlSession.close();
    }
}

測試輸出

// 嵌套查詢結(jié)果
Student{id=1, name='小明', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=2, name='小紅', teacher=Teacher{id=2, name='語文老師'}}
Student{id=3, name='小蘭', teacher=Teacher{id=3, name='英語老師'}}
Student{id=4, name='小宋', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=5, name='小麗', teacher=Teacher{id=2, name='語文老師'}}
Student{id=6, name='小叮', teacher=Teacher{id=3, name='英語老師'}}

// 子查詢結(jié)果
Student{id=1, name='小明', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=2, name='小紅', teacher=Teacher{id=2, name='語文老師'}}
Student{id=3, name='小蘭', teacher=Teacher{id=3, name='英語老師'}}
Student{id=4, name='小宋', teacher=Teacher{id=1, name='數(shù)學(xué)老師'}}
Student{id=5, name='小麗', teacher=Teacher{id=2, name='語文老師'}}
Student{id=6, name='小叮', teacher=Teacher{id=3, name='英語老師'}}

四错览、使用Mybatis實(shí)現(xiàn)一對多查詢

1纫雁、搭建實(shí)體類及映射環(huán)境

在上面多對一的情況下,學(xué)生實(shí)體類中有一個對應(yīng)得老師實(shí)體引用倾哺,一對多得情況轧邪,老師實(shí)體類也要有一個學(xué)生得引用,因?yàn)槭且粚Χ嗟藐P(guān)系羞海,這里用List存放學(xué)生集合

public class Student {

    private int id;
    private String name;

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

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

public class Teacher {

    private int id;
    private String name;
    List<Student> students;

    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 List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", students=" + students +
                '}';
    }
}
  • 創(chuàng)建持久層TeacherMapper接口
public interface TeacherMapper {

    List<Teacher> selectTeacherById(@Param("tid") int tid);
}

2忌愚、使用嵌套查詢完成一對多查詢

<?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.yaco.dao.TeacherMapper">

        <select id="selectTeacherById" resultMap="teacherStudent">
            select t.id tid,t.name tname,s.id sid,s.name sname
            from student s,teacher t
            where s.tid = t.id and t.id = #{tid};
        </select>

    <resultMap id="teacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
        </collection>
    </resultMap>

</mapper>

3、測試

public class MybatisTest {

    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        List<Teacher> teachers = mapper.selectTeacherById(1);
        for (Teacher teacher : teachers) {
            System.out.println(teacher);
        }
    }
}

用例輸出

Teacher{id=1, name='數(shù)學(xué)老師', students=[Student{id=1, name='小明'}, Student{id=4, name='小宋'}]}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末却邓,一起剝皮案震驚了整個濱河市硕糊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腊徙,老刑警劉巖简十,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昧穿,居然都是意外死亡勺远,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門时鸵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胶逢,“玉大人,你說我怎么就攤上這事饰潜〕踝梗” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵彭雾,是天一觀的道長碟刺。 經(jīng)常有香客問我,道長薯酝,這世上最難降的妖魔是什么半沽? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任爽柒,我火速辦了婚禮,結(jié)果婚禮上者填,老公的妹妹穿的比我還像新娘浩村。我一直安慰自己,他們只是感情好占哟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布心墅。 她就那樣靜靜地躺著,像睡著了一般榨乎。 火紅的嫁衣襯著肌膚如雪怎燥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蜜暑,我揣著相機(jī)與錄音铐姚,去河邊找鬼。 笑死肛捍,一個胖子當(dāng)著我的面吹牛谦屑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篇梭,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酝枢!你這毒婦竟也來了恬偷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帘睦,失蹤者是張志新(化名)和其女友劉穎袍患,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竣付,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诡延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了古胆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肆良。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逸绎,靈堂內(nèi)的尸體忽然破棺而出惹恃,到底是詐尸還是另有隱情,我是刑警寧澤棺牧,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布巫糙,位于F島的核電站,受9級特大地震影響颊乘,放射性物質(zhì)發(fā)生泄漏参淹。R本人自食惡果不足惜醉锄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浙值。 院中可真熱鬧恳不,春花似錦、人聲如沸亥鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽负蚊。三九已至神妹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間家妆,已是汗流浹背鸵荠。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伤极,地道東北人蛹找。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像哨坪,于是被迫代替她去往敵國和親庸疾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354