mybatis使用入门

1.mybatis依赖导入

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

2.db.properties数据库配置

mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://你的数据库?useSSL=false&characterEnding=utf8&serverTimezone=Asia/Shanghai
mysql.username=用户名
mysql.password=密码

3.mybatis.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"/>
    <typeAliases>
        <!--单个类取别名-->
<!--        <typeAlias type="model.User" alias="user"></typeAlias>-->
        <!--包下的所有类取别名,别名全为类名,且不再区分大小写-->
        <!--如果这里你没有配置上面一个或者下面一个时,name你的resultType和paramType则需要是你所需要返回的类的全类名;也就是完整包名+类名-->
        <package name="model"/>
    </typeAliases>
    <!--这里是自定义的一个处理器,可忽略-->
    <typeHandlers>
        <typeHandler handler="handler.PhoneNumberHandler"/>
    </typeHandlers>
    <!-- 设置⼀个默认的连接环境信息 -->
    <environments default="mysql_developer">
        <!-- 连接环境信息,取⼀个任意唯⼀的名字 -->
        <environment id="mysql_developer">
            <!-- mybatis使⽤jdbc事务管理⽅式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使⽤连接池⽅式来获取连接 -->
            <dataSource type="pooled">
                <!-- 配置与数据库交互的4个必要属性 -->
                <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>
    <!--这里需要对你所使用的接口对应的xml文件进行关联-->
        <mapper resource="mapper/UserDao.xml"/>
        <mapper resource="mapper/AddressDao.xml"/>
    </mappers>
</configuration>

4.SQLSession工具类

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.IOException;
import java.io.Reader;

/**
 * @Description:
 * @Author one world
 * @Date 2020/10/9 0009 15:59
 */
public final class MybatisUtil0 {
    private static SqlSessionFactory sqlSessionFactory = null;
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory(){
     return sqlSessionFactory;
    }

    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession==null){
            sqlSession = sqlSessionFactory.openSession();
            threadLocal.set(sqlSession);
        }
        return sqlSession;
    }

    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession!=null){
            sqlSession.close();
            //这里移除的是当前线程里的值,这里就是SqlSession
            threadLocal.remove();
        }
    }
}

5.实体类创建

表结构:

CREATE TABLE `address` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '地址编号',
  `user_id` int NOT NULL COMMENT '用户id',
  `shipping` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货地址',
  `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '收货人姓名',
  `phone` char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电话',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `FK_address_id_user_id` (`user_id`) USING BTREE,
  CONSTRAINT `FK_address_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='地址表';
import java.io.Serializable;

/**
 * @Description:
 * @Author one world
 * @Date 2020/9/23 0023 10:04
 */
public class Address implements Serializable {
    private int user_id;
    private int id;
    private String shipping;
    private String name;
    private String phone;

    public Address(int id, int user_id, String shipping, String name, String phone) {
        this.id = id;
        this.user_id = user_id;
        this.shipping = shipping;
        this.name = name;
        this.phone = phone;
    }

    public int getId() {
        return id;
    }

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

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getShipping() {
        return shipping;
    }

    public void setShipping(String shipping) {
        this.shipping = shipping;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", user_id=" + user_id +
                ", shipping='" + shipping + '\'' +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

    public Address(int user_id, String shipping, String name, String phone) {
        this.user_id = user_id;
        this.shipping = shipping;
        this.name = name;
        this.phone = phone;
    }

    public Address() {
    }
}

6.Mapper接口

import model.Address;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @Description:
 * @Author one world
 * @Date 2020/9/23 0023 10:37
 */
public interface AddressDao {

    /**
     * 分页查询所有
     * @param currentPage
     * @param limit
     * @return List
     */
    public List<Address> findAll(@Param("page") Integer currentPage, @Param("limit") Integer limit);

    /**
     * 查询所有
     * @return List
     */

    public List<Address> findAll();

    /**
     * 根据主键查询实体
     * @param id
     * @return T
     */
    public Address findByPK(int id);

    /**
     * 根据主键删除
     * @param id
     * @return true/false
     */
    public boolean delByPK(int id);

    /**
     * 添加
     * @param address
     * @return true/false
     */
    public boolean add(Address address);

    /**
     * 更新
     * @param address
     * @return true/false
     */
    public boolean update(Address address);
    /**
     * 根据用户ID查找地址
     * @param id
     * @return List<Address>
     */
    public List<Address> findByUserId(int id);

    /**
     * 通过订单编号查找地址
     * @param order_no
     * @return Address
     */
    public Address findByOrderNo(String order_no);
}

7.创建AddressDao.xml配置文件,与接口名相同(本质相当于我们之前的UserDaoImpl实现类)

<?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属性是名称空间,必须唯⼀ -->
<mapper namespace="mapper.AddressDao">
    <resultMap type="address" id="addressMap">
        <!-- id标签:映射主键属性
        result标签:映射⾮主键属性
        property属性:实体的属性名
        column属性:表的字段名
        -->
        <id property="id" column="id"/>
        <result property="user_id" column="user_id"/>
        <result property="shipping" column="shipping"/>
        <result property="name" column="name"/>
        <result property="phone" column="phone"/>
    </resultMap>
    <!--增删改查标签中的id对应接口中的方法名,注意:参数类型和返回值类型也要与接口的相同-->
    <insert id="add" parameterType="address">
     INSERT INTO address (user_id,shipping,name,phone) VALUES(#{user_id},#{shipping},#{name},#{phone});
    </insert>
    <delete id="delByPK" parameterType="int">
     DELETE FROM address WHERE id=#{id};
    </delete>
    <update id="update" parameterType="address">
     UPDATE address SET user_id=#{user_id},shipping=#{shipping},name=#{name},phone=#{phone} where id=#{id};
    </update>
    <select id="findByPK" parameterType="int" resultType="address">
      SELECT * FROM address WHERE id = #{id};
    </select>
    <select id="findAll" parameterType="int" resultType="address">
        SELECT * FROM address limit ${(page-1)*limit},#{limit};
    </select>
    <select id="findByUserId" parameterType="int" resultType="address">
       SELECT * FROM address WHERE user_id=#{user_id};
    </select>
    <select id="findByOrderNo" parameterType="String" resultType="address">
        SELECT address.* FROM address LEFT JOIN orders ON address.id=orders.address_id WHERE order_no=#{order_no}
    </select>
</mapper>

8.测试

import mapper.AddressDao;
import model.Address;
import org.apache.ibatis.session.SqlSession;
import utils.MybatisUtil;

/**
 * @Description:
 * @Author one world
 * @Date 2020/10/10 0010 12:53
 */
public class TestAddressDao {
//通过Mapper接口,这里没有关闭sqlSession,在用完以后是需要关闭的
    private static AddressDao dao = MybatisUtil.getSqlSession().getMapper(AddressDao.class);
    public static void main(String[] args) {
      testFindAll2(1);
    }
    //方式1:使用Mapper接口
    public static void testFindAll(int id){
        System.out.println(dao.findByPK(id));
    }
    //方式2.不使用Mapper接口,直接用sqlSession提供的接口
    public static void testFindAll2(int id){
    //这里的mapper.addressDao是AddressDao.xml文件顶部的namespace,而findByPk是select标签中的id值;其对应的SQL语句为通过id查询地址的语句
        Address address =MybatisUtil.getSqlSession().selectOne("mapper.AddressDao.findByPK",id);
        System.out.println(address);
    }
    //方式3:注解,不推荐使用,此处省略
}

9.需要注意的点:

建议java目录中的mapper和resources下的mapper位置相同;且java目录中的xxx.java接口与resources下的xxx.xml配置文件名相同
如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SinceThenLater

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

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

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

打赏作者

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

抵扣说明:

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

余额充值