Mybatis使用

1 实体别名

1.1 方式一 为每个实体类分别定义别名

1.编写User的代码如下:

package com.txw.entity;

import java.io.Serializable;
/**
 * 用户实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class User implements Serializable {
    private int id;
    private String username;   // 用户名
    private String password;   // 密码

    public User() {
    }

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

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

如图所示:在这里插入图片描述
2.编写UserDao的代码如下:

* 根据id查询用户
     * @param id
     * @return
     */
    public User selectUserById(int id);

    /**
     * 根据用户名和密码查询
     * @param name
     * @param password
     * @return
     */
    public User selectByUsernameAndPassword(@Param("name") String name,@Param("password") String password);

如图所示:在这里插入图片描述
3.修改mybatis-config.xml的代码如下:

 <!--实体类别名  type:java实体类全限定名 alias:别名-->
    <typeAliases>
        <typeAlias type="com.txw.entity.User" alias="User"  />
    </typeAliases>

如图所示:在这里插入图片描述
4.编写UserDaoMapper.xml的代码如下:

 <!--根据id查询用户-->
    <!--
        id:方法名
        resultType:返回对象的全限定名 包名.接口名
    -->
    <select id="selectUserById" resultType="User" >
        select * from t_user where id = #{id}
    </select>

    <!--根据用户名和密码查询-->
    <select id="selectByUsernameAndPassword" resultType="User" >
       select * from t_user where username = #{name} and password = #{password}
    </select>

如图所示:在这里插入图片描述
5.编写TestUserDao的代码如下:

package com.txw.test;

import com.txw.dao.UserDao;
import com.txw.entity.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.Test;
import java.io.InputStream;
import java.util.List;

/**
 * 测试
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class TestUserDao {

    /**
     * 测试根据id查询用户
     */
    @Test
    public void testSelectUserById() throws Exception{
        // 1.加载mybatis-config.xml
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.创建SQLSessionFactory工厂对象
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
        // 3.通过工厂对象获取SQLSession对象(连接)
        SqlSession sqlSession = ssf.openSession();
        // 4.通过SQLSession对象翻译mapper文件,获取到接口的实现类对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 5.调用DAO接口中的方法
        User user = userDao.selectUserById(2);
        System.out.println(user);
    }

    /**
     * 测试根据用户名和密码查询
     */
    @Test
    public void testSelectByUsernameAndPassword() throws Exception{
        // 1.加载mybatis-config.xml
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.创建SQLSessionFactory工厂对象
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
        // 3.通过工厂对象获取SQLSession对象(连接)
        SqlSession sqlSession = ssf.openSession();
        // 4.通过SQLSession对象翻译mapper文件,获取到接口的实现类对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 5.调用DAO接口中的方法
        User user = userDao.selectByUsernameAndPassword("Adair888","nicai");
        System.out.println(user);
    }
 }   

如图所示:在这里插入图片描述

1.2 方式二 为实体类所在包整体定义别名

1.修改mybatis-config.xml的代码如下:

   <!--实体类别名  name:java实体类全限定名 别名:默认实体类名(大小均可)-->
    <typeAliases>
        <package name="com.txw.entity"/>
    </typeAliases>

如图所示:在这里插入图片描述
2.编写UserDaoMapper.xml的代码如图所示:
在这里插入图片描述

1.3 方式三 前提:方式二开启后

1.修改User的代码如图所示:
在这里插入图片描述
2.修改UserDaoMapper.xml的代码如图所示:
在这里插入图片描述
注意:DAO接口不能起别名。

2 配置信息参数化 抽取小配置文件 jdbc.properties

1.抽取配置信息 小配置文件
在src目录下创建jdbc.properties的代码如下:

driver=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&uesSSL=false&serverTimezone=Asia/Shanghai

如图所示:在这里插入图片描述
2.将配置信息读取到所需的配置文件中
修改mybatis-config.xml的代码如下:

<!--读取小配置文件信息 resource:路径 相当于src-->
    <properties resource="jdbc.properties" />

如图所示:在这里插入图片描述
3.在指定位置上获取对应的配置信息 ${配置信息的key}
修改mybatis-config.xml的代码如下:

 <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>

如图所示:在这里插入图片描述

3 MybatisUtil工具类封装

如图所示:在这里插入图片描述
编写MybatisUtils的代码如下:

package com.txw.util;

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.InputStream;
/**
 * Mybatis工具类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class MybatisUtils {
    private static SqlSessionFactory ssf = null;
    private static ThreadLocal<SqlSession> t1 = new ThreadLocal<>();

    static {
        try {
            // 1.加载mybatis-config.xml
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 2.创建SQLSessionFactory工厂对象
            ssf = new SqlSessionFactoryBuilder().build(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     */
    public static SqlSession openSession(){
        // 3.通过工厂对象获取SQLSession对象(连接)
        SqlSession ss = t1.get();
        if (ss == null){
            ss = ssf.openSession();
            t1.set(ss);
        }
        return ss;
    }

    /**
     * 获取DAO的实现类
     * @param clazz
     * @return
     */
    public static Object getMapper(Class clazz){
        return openSession().getMapper(clazz);
    }

    /**
     * 关闭资源
     */
    public static void close(){
        openSession().close();
        t1.remove();
    }

    /**
     * 事务提交
     */
    public static void commit(){
        openSession().commit();
        close();
    }

    /**
     * 事务回滚
     */
    public static void rollback(){
        openSession().rollback();
        close();
    }
}

如图所示:在这里插入图片描述
编写TestUserDao的代码如下:

package com.txw.test;

import com.txw.dao.UserDao;
import com.txw.entity.User;
import com.txw.util.MybatisUtils;
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.Test;
import java.io.InputStream;
import java.util.List;
/**
 * 测试
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class TestUserDao {

    /**
     * 测试根据id查询用户
     */
    @Test
    public void testSelectUserById() throws Exception{
       UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = userDao.selectUserById(2);
        System.out.println(user);
    }

    /**
     * 测试根据用户名和密码查询
     */
    @Test
    public void testSelectByUsernameAndPassword() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = userDao.selectByUsernameAndPassword("Adair888","nicai");
        System.out.println(user);
    }

    /**
     * 测试修改
     * @throws Exception
     */
    @Test
    public void testUpdateUser() throws Exception {
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = new User(5,"Adair666","456789");
        userDao.updateUser(user);
        System.out.println(user);
        MybatisUtils.commit();
    }

    /**
     * 测试删除
     */
    @Test
    public void testDeleteUser() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        userDao.deleteUser(1);
        MybatisUtils.commit();
        System.out.println("删除成功!");
    }

    /**
     * 测试添加
     */
    @Test
    public void testInsertUser() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = new User(0,"Adair999","nicai");
        userDao.insertUser(user);
        System.out.println(user);
        MybatisUtils.commit();
    }

    /**
     * 查询所有
     */
    @Test
    public void testSelectAllUsers() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        List<User> users = userDao.selectAllUsers();
        for (User user : users) {
            System.out.println(user);
        }
        MybatisUtils.close();
    }
}

如图所示:在这里插入图片描述

四 ResultMap 结果映射

当查询结果和实体类不匹配时,需要在Mybatis中进行结果映射(就是在说明当前表【字段】和实体类【属性】之间对应关系)
1.创建数据库以及表结构的SQL语句如下:

SELECT * FROM `t_user`
drop table t_user;

create table t_user(
	t_id int primary key AUTO_INCREMENT,
	t_name varchar(100),
	t_password varchar(100),
	t_birthdat date
)
SELECT * FROM `t_user`
insert into t_user values(null,"Adair","123456",noW())
insert into t_user values(null,"Adair666","123456",noW())
insert into t_user values(null,"Adair888","123456",noW())
insert into t_user values(null,"Adair999","123456",noW())
insert into t_user values(null,"txw","123456",noW())

如图所示:在这里插入图片描述
2.编写User的代码如下:

package com.txw.entity;

import java.io.Serializable;
import java.util.Date;
/**
 * 用户实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class User implements Serializable {
    private int id;
    private String username;   // 用户名
    private String password;   // 密码
    private Date birthday;     // 生日

    public User() {
    }

    public User(int id, String username, String password, Date birthday) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.birthday = birthday;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

如图所示:在这里插入图片描述
3.编写UserDaoMapper.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">
<!--namespace:DAO接口的全限定名 包名.接口名-->
<mapper namespace="com.txw.dao.UserDao">
    <!--id:当前映射的名字 随意 type:当前要映射实体类的类型 全限定名-->
    <resultMap id="userResultMap" type="user">
        <!--property: 要映射的属性名 column:要映射数据库中字段名-->
        <id property="id" column="t_id"/>
        <result property="username" column="t_name"/>
        <result property="password" column="t_password"/>
        <result property="birthday" column="t_birthday"/>
    </resultMap>
    <!--根据id查询用户-->
    <!--
        id:方法名
        resultType:返回对象的全限定名 包名.接口名
    -->
    <select id="selectUserById" resultMap="userResultMap" >
        select * from t_user where t_id = #{id}
    </select>

    <!--根据用户名和密码查询-->
    <select id="selectByUsernameAndPassword" resultMap="userResultMap" >
       select * from t_user where t_name = #{name} and t_password = #{password}
    </select>

    <!--修改-->
    <update id="updateUser" >
        update t_user set t_name = #{username} and t_password = #{password} and t_birthday =#{birthday} where t_id = #{id}
    </update>

    <!--根据id删除-->
    <delete id="deleteUser" >
        delete from t_user where t_id = #{id}
    </delete>
    
    <!--查询所有 resultType:不写集合类型 写的是集合的类型【泛型】-->
    <select id="selectAllUsers" resultMap="userResultMap">
        select * from t_user
    </select>

    <!--添加 useGeneratedKeys="true" 开启mybatis的主键查询赋值操作
            keyProperty="id" 查询回来的主键值 放到参数对象的哪个属性中
    -->
    <insert id="insertUser" keyProperty="id" useGeneratedKeys="true" >
        insert into t_user(t_name,t_password,t_birthday) values(#{username},#{password},#{birthday})
    </insert>
</mapper>

如图所示:在这里插入图片描述
4.编写TestUserDao的代码如下:

package com.txw.test;

import com.txw.dao.UserDao;
import com.txw.entity.User;
import com.txw.util.MybatisUtils;
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.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
 * 测试
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class TestUserDao {

    /**
     * 测试根据id查询用户
     */
    @Test
    public void testSelectUserById() throws Exception{
       UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = userDao.selectUserById(2);
        System.out.println(user);
    }

    /**
     * 测试根据用户名和密码查询
     */
    @Test
    public void testSelectByUsernameAndPassword() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = userDao.selectByUsernameAndPassword("Adair888","123456");
        System.out.println(user);
    }

    /**
     * 测试修改
     * @throws Exception
     */
    @Test
    public void testUpdateUser() throws Exception {
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = new User(5,"Adair666","123456",new Date());
        userDao.updateUser(user);
        System.out.println(user);
        MybatisUtils.commit();
    }

    /**
     * 测试删除
     */
    @Test
    public void testDeleteUser() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        userDao.deleteUser(1);
        MybatisUtils.commit();
        System.out.println("删除成功!");
    }

    /**
     * 测试添加
     */
    @Test
    public void testInsertUser() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        User user = new User(0,"Adair999","nicai",new Date());
        userDao.insertUser(user);
        System.out.println(user);
        MybatisUtils.commit();
    }

    /**
     * 查询所有
     */
    @Test
    public void testSelectAllUsers() throws Exception{
        UserDao userDao = (UserDao) MybatisUtils.getMapper(UserDao.class);
        // 调用DAO接口中的方法
        List<User> users = userDao.selectAllUsers();
        for (User user : users) {
            System.out.println(user);
        }
        MybatisUtils.close();
    }
}

如图所示:在这里插入图片描述
简便方式 单表,如图所示:在这里插入图片描述

5 Mybatis关联关系处理

关联关系 : 就是一种拥有,从属关系。
关系分类 :
1对1关联关系。
1对多关联关系(包含多对1)。
多对多关联关系。
Mybatis中进行关联关系处理【针对查询】。
1.建表,如图所示:在这里插入图片描述
总结:添加外键。
2.实体,如图所示:在这里插入图片描述
总结:添加关系属性。
3.Mapper文件,如图所示:在这里插入图片描述

6 关联关系处理案例

1、 1:1关联关系处理 【Person — IDCard】
1.创建数据库以及表结构的SQL语句如下:

DROP TABLE IF EXISTS `IDCard`;
CREATE TABLE `IDCard`  (
  `id` int(11) NOT NULL,
  `number` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

INSERT INTO `IDCard` VALUES (1, '520202199602269111', '贵州省六盘水市盘州市');
INSERT INTO `IDCard` VALUES (2, '520202199602269133', '贵州省六盘水市盘州市');

SET FOREIGN_KEY_CHECKS = 1;

DROP TABLE IF EXISTS `person`;
CREATE TABLE `person`  (
  `id` int(11) NOT NULL,
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `card_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `xiaodi_ibfk_1`(`card_id`) USING BTREE,
  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`card_id`) REFERENCES `IDCard` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of person
-- ----------------------------
INSERT INTO `person` VALUES (1, 'Adair', 25, 1);
INSERT INTO `person` VALUES (2, 'TangXingWang', 24, 2);

SET FOREIGN_KEY_CHECKS = 1;

如图所示:在这里插入图片描述
2.编写Person的代码如下:

package com.txw.entity;

import java.io.Serializable;
/**
 * 个人实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class Person implements Serializable {
    private int id;
    private String name;  // 姓名
    private int age;    // 年龄

    /**
     * 添加关系属性
     */
    private IDCard card;

    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 IDCard getCard() {
        return card;
    }

    public void setCard(IDCard card) {
        this.card = card;
    }

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

如图所示:在这里插入图片描述
3.编写IDCard的代码如下:

package com.txw.entity;

import java.io.Serializable;
/**
 * 身份证实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class IDCard implements Serializable {
    private int id;
    private String number;  // 身份证号码
    private String address; // 地址

    /**
     * 添加关系属性
     */
    private Person p;

    public int getId() {
        return id;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

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

    public Person getP() {
        return p;
    }

    public void setP(Person p) {
        this.p = p;
    }

    @Override
    public String toString() {
        return "IDCard{" +
                "id=" + id +
                ", number='" + number + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

如图所示:
在这里插入图片描述
4.编写PersonDao的代码如下:

package com.txw.dao;

import com.txw.entity.Person;
/**
 * 个人持久层
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public interface PersonDAO {
    /**
     * 根据id查询Person信息
     * @param id
     * @return
     */
    public Person selectPersonById(int id);
}

如图所示:
在这里插入图片描述
5.编写PersonDao.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.txw.dao.PersonDAO">
    <!--结果映射-->
    <resultMap id="PersonResultMap" type="Person">
        <id property="id" column="person_id" />
        <result property="name" column="person_name" />
        <result property="age" column="person_age" />
        <!--映射关系属性-->
        <association javaType="IDCard"  property="card">
        <id property="id" column="idCard_id" />
        <result property="number" column="idCard_number" />
        <result property="address" column="idCard_address" />
        </association>
    </resultMap>

    <!--根据id查询Person信息-->
    <select id="selectPersonById" resultMap="PersonResultMap">
          select p.id as person_id,p.name as person_name,p.age as person_age,
         i.id as idcard_id,i.number as idcard_number,i.address as idcard_address
     from person p join IDCard i
          on p.card_id = i.id
     where p.id = #{id}
    </select>
</mapper>

如图所示:
在这里插入图片描述
6.编写PersonDaoTest的代码如下:

package com.txw.test;

import com.txw.dao.PersonDAO;
import com.txw.entity.Person;
import com.txw.util.MybatisUtils;
import org.junit.Test;
/**
 * 测试
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class PersonDaoTest {

    /**
     * 测试根据id查询Person信息
     */
    @Test
    public void testSelectPersonById(){
        PersonDAO personDAO = (PersonDAO)MybatisUtils.getMapper(PersonDAO.class);
        Person person = personDAO.selectPersonById(1);
        System.out.println(person);
    }
}

如图所示:
在这里插入图片描述
7.编写mybatis-config.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>
    <!--读取小配置文件信息 resource:路径 相当于src-->
    <properties resource="jdbc.properties" />
    <!--实体类别名  name:java实体类全限定名 别名:默认实体类名(大小均可)-->
    <typeAliases>
        <package name="com.txw.entity"/>
    </typeAliases>
    <!--连接环境 default写的是要使用连接环境的id值-->
    <environments default="mysql">
        <!--连接环境 mysql id:当前环境的名字-->
        <environment id="mysql">
            <!--事务控制的方式 JDBC:使用原始JDBC事务控制。 JAT:分布式事务管理。-->
            <transactionManager type="JDBC"></transactionManager>
            <!--连接池配置 Mybatis默认为PUBLIC 第三方连接池:dbcp c3p0 druid-->
            <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>
    <!--注册mapper文件-->
    <mappers>
        <mapper resource="com/txw/dao/impl/userDaoMapper.xml"></mapper>
    </mappers>
</configuration>

如图所示:
在这里插入图片描述
8.编写PersonDaoTest的代码如下:

package com.txw.util;

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.InputStream;
/**
 * Mybatis工具类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class MybatisUtils {
    private static SqlSessionFactory ssf = null;
    private static ThreadLocal<SqlSession> t1 = new ThreadLocal<SqlSession>();

    static {
        try {
            // 1.加载mybatis-config.xml
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 2.创建SQLSessionFactory工厂对象
            ssf = new SqlSessionFactoryBuilder().build(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     */
    public static SqlSession openSession(){
        // 3.通过工厂对象获取SQLSession对象(连接)
        SqlSession ss = t1.get();
        if (ss == null){
            ss = ssf.openSession();
            t1.set(ss);
        }
        return ss;
    }

    /**
     * 获取DAO的实现类
     * @param clazz
     * @return
     */
    public static Object getMapper(Class clazz){
        return openSession().getMapper(clazz);
    }

    /**
     * 关闭资源
     */
    public static void close(){
        openSession().close();
        t1.remove();
    }

    /**
     * 事务提交
     */
    public static void commit(){
        openSession().commit();
        close();
    }

    /**
     * 事务回滚
     */
    public static void rollback(){
        openSession().rollback();
        close();
    }
}

如图所示:在这里插入图片描述
2、1:*关联关系处理【常用 重点】
如图所示:在这里插入图片描述
1.创建数据库以及表结构的SQL语句如下:

DROP TABLE IF EXISTS `t_dep`;
CREATE TABLE `t_dep`  (
  `id` int(11) NOT NULL,
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `city` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;


INSERT INTO `t_dep` VALUES (1, '行政部', '贵州');
INSERT INTO `t_dep` VALUES (2, '研发部', '北京');

SET FOREIGN_KEY_CHECKS = 1;

DROP TABLE IF EXISTS `t_emp`;
CREATE TABLE `t_emp`  (
  `id` int(11) NOT NULL,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `salary` double NULL DEFAULT NULL,
  `dep_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `fk_emp_dep`(`dep_id`) USING BTREE,
  CONSTRAINT `fk_emp_dep` FOREIGN KEY (`dep_id`) REFERENCES `t_dep` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_emp
-- ----------------------------
INSERT INTO `t_emp` VALUES (1, 'Adair', 1000, 1);
INSERT INTO `t_emp` VALUES (2, 'Tango', 2000.05, 1);
INSERT INTO `t_emp` VALUES (3, 'LITiao', 5555.55, 2);
INSERT INTO `t_emp` VALUES (4, 'yu', 8888.66, 2);

SET FOREIGN_KEY_CHECKS = 1;

如图所示:在这里插入图片描述
2.编写Emp的代码如下:

package com.txw.entity;

/**
 * 员工实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class Emp {
    private int id;
    private String name;    // 姓名
    private double salary;  // 工资

    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 double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

如图所示:在这里插入图片描述
3.编写Dep的代码如下:

package com.txw.entity;

import java.util.List;
/**
 * 部门实体类
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class Dep {
    private int id;
    private String name;    // 姓名
    private String city;  // 地址

    /**
     * 添加关系属性
     */
    private List<Emp> emps;

    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 getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }

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

如图所示:在这里插入图片描述
4.编写DepDao的代码如下:

package com.txw.dao;

import com.txw.entity.Dep;
/**
 * 部门持久层
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public interface DepDao {

    /**
     * 根据id查询Dep信息
     * @param id
     * @return
     */
    public Dep selectDepById(int id);
}

如图所示:在这里插入图片描述
5.编写DepDao.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.txw.dao.DepDao">
    <!--结果映射-->
    <resultMap id="depResultMap" type="Dep">
        <id property="id" column="dep_id" />
        <result property="name" column="dep_name" />
        <result property="city" column="dep_city" />
        <!--映射关系属性-->
        <collection ofType="Emp" property="emps">
            <id property="id" column="emp_id" />
            <result property="name" column="emp_name" />
            <result property="salary" column="emp_salary" />
        </collection>
    </resultMap>

    <!--根据id查询Person信息-->
    <select id="selectDepById" resultMap="depResultMap">
          select d.id dep_id,d.name dep_name,d.city dep_city,
         e.id emp_id,e.name emp_name,e.salary  emp_salary
     from t_dep d join t_emp e
          on e.dep_id = e.id
     where d.id = #{id}
    </select>
</mapper>

如图所示:在这里插入图片描述
6.编写DepDaoTest的代码如下:

package com.txw.test;

import com.txw.dao.DepDao;
import com.txw.entity.Dep;
import com.txw.entity.Emp;
import com.txw.util.MybatisUtils;
import org.junit.Test;
import java.util.List;
/**
 * 测试
 * @Author Adair
 * @QQ:1578533828@qq.com
 */
@SuppressWarnings("all")   // 注解警告信息
public class DepDaoTest {

    /**
     * 测试根据id查询Person信息
     */
    @Test
    public void testSelectPersonById(){
        DepDao depDao = (DepDao)MybatisUtils.getMapper(DepDao.class);
        Dep dep = depDao.selectDepById(1);
        System.out.println(dep.getName() + "--" + dep.getCity());
        List<Emp> emps = dep.getEmps();
        for (Emp emp : emps) {
            System.out.println(emp.getName() + "--" + emp.getSalary());
        }
    }
}

如图所示:在这里插入图片描述
7.修改mybatis-config.xml的代码如图所示:
在这里插入图片描述
3、*:*关联关系处理【了解】在这里插入图片描述
多对多关联关系处理可以拆分为两个1对多。
实体中存在多个关系属性的情况,如图所示:在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值