03.Mybatis框架的第一次使用

03.Mybatis框架的第一次使用

1、Po类(数据库表对应的java模型)

UserPo.java

package com.company.project.model;

/**
 * @author God_86
 *
 */
public class UserPo {
    private long userId;
    private String userName;
    private long phoneNum;
    private String password;
    private String name;
    private String sex;
    private String shippingAddress;
    
    public UserPo() {
        super();
        this.userId = 0;
        this.userName = "";
        this.phoneNum = 0;
        this.password = "";
        this.name = "";
        this.sex = "";
        this.shippingAddress = "";
    }



    public String getUserName() {
        return userName;
    }

    public long getPhoneNum() {
        return phoneNum;
    }

    public String getPassword() {
        return password;
    }

    public String getName() {
        return name;
    }

    public String getSex() {
        return sex;
    }

    public String getShippingAddress() {
        return shippingAddress;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPhoneNum(long phoneNum) {
        this.phoneNum = phoneNum;
    }

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

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

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setShippingAddress(String shippingAddress) {
        this.shippingAddress = shippingAddress;
    }

    @Override
    public String toString() {
        return "UserPo [userId=" + userId + ", userName=" + userName + ", phoneNum=" + phoneNum + ", password="
                + password + ", name=" + name + ", sex=" + sex + ", shippingAddress=" + shippingAddress + "]";
    }



    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        result = prime * result + (int) (phoneNum ^ (phoneNum >>> 32));
        result = prime * result + ((sex == null) ? 0 : sex.hashCode());
        result = prime * result + ((shippingAddress == null) ? 0 : shippingAddress.hashCode());
        result = prime * result + (int) (userId ^ (userId >>> 32));
        result = prime * result + ((userName == null) ? 0 : userName.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        UserPo other = (UserPo) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        if (phoneNum != other.phoneNum)
            return false;
        if (sex == null) {
            if (other.sex != null)
                return false;
        } else if (!sex.equals(other.sex))
            return false;
        if (shippingAddress == null) {
            if (other.shippingAddress != null)
                return false;
        } else if (!shippingAddress.equals(other.shippingAddress))
            return false;
        if (userId != other.userId)
            return false;
        if (userName == null) {
            if (other.userName != null)
                return false;
        } else if (!userName.equals(other.userName))
            return false;
        return true;
    }   
}

2、mapper接口类(数据库表操作的方法接口)

UserMapper.java

package com.company.project.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import com.company.project.model.UserPo;

public interface UserMapper {
    //插入方法
    boolean insert(UserPo userPo);
    
    //更新方法
    boolean update(UserPo userPo);
    
    //删除方法
    boolean delete(long id);
    
    //查询主键
    UserPo findById(long id);
    
    //查询所有
    List<UserPo> findAll();

3、配置文件的编写(java Po 类与数据库表操作的对应关系)

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.company.project.mapper.UserMapper">
<!-- 
namespace:名称空间,指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值

public UserPo findById(long id);
 -->

    <!-- 配置结果视图 -->
    <resultMap type="userpo" id="baseResultSet">
    
        <id  column="id" property="userId"/>
        <result column="user_name" property="userName" />
        <result column="phone_num" property="phoneNum" />
        <result column="password" property="password"  />
        <result column="name" property="name"  />
        <result column="sex" property="sex"  />
        <result column="shipping_address" property="shippingAddress"  />    
    </resultMap>
    
    
    <!-- 通过主键查询 -->
    <select id="findById"  resultMap="baseResultSet">
        select id , user_name , phone_num , password , name ,sex,shipping_address from  "USER"
        where id=#{id}
        <!-- 
        <where>
            <if test="id != null">id=#{id}</if>
            <if test="user_name != null">user_name=#{user_name}</if>
        </where>
         -->
         
    </select>
    
    <!-- 查询所有 -->
    <select id="findAll"  resultMap="baseResultSet">
        select id , user_name , phone_num , password , name ,sex,shipping_address from  "USER"
    </select>
    
    <!-- 插入 -->
    <insert id="insert" parameterType="UserPo" >
        insert into "USER" values(
            #{userId},
            #{userName},
            #{phoneNum},
            #{password},
            #{name},
            #{sex},
            #{shippingAddress}
        )
    </insert>
    
    <!-- 更新 -->
    <update id="update" parameterType="UserPo">
        update "USER"  set  
            user_name=#{userName},
            phone_num=#{phoneNum},
            password=#{password},
            name=#{name},
            sex=#{sex},
            shipping_address=#{shippingAddress} 
        Where  id = #{userId}
    </update>
    
        <!-- 删除 -->
    <delete id="delete" parameterType="java.lang.Long">
        delete "USER" 
        Where  id = #{userId}
    </delete>
</mapper>

4、更新主配文件

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>
    <!-- 导入数据库配置文件 -->
    <properties resource="jdbc.properties"></properties>
    <typeAliases>
    <!-- 利用package标签可以直接把整个包的 Po类都导入,这块是导入与数据库表对应的java类-->
    <package name="com.company.project.model"/>
    </typeAliases>
    
    <!-- 配置数据库信息 -->
    <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>
    

    <!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
    <mappers>
        <!-- 利用package标签可以直接把整个包的 xml配置文件都导入,这块是导入数据库表与java Po类对应的配置文件 -->
        <package name="com.company.project.mapper" />
    </mappers>
</configuration>

(1)在 < typeAliases >标签中,利用< package > 导入所有的model Po类

(2)在 < mappers >标签中,利用< package > 导入所有的 XXXMapper.xml配置文件。

注意:

  • 接口类应该和对应的配置类同名,这样才可以自动配置,可以省去很多步骤
  • 接口类XXXMapper.java应该和对应的配置类XXXMapper.xml应该写在同一个包下,这样可以自动配置。
  • 但是为了防止臃肿,我们可以把配置类XXXMapper.xml文件写在conf下,创建一个与接口类XXXMapper.java同名的包,把XXXMapper.xml文件写在包下,这样看起来,他们两个文件就没有在同一目录下,但是编译以后,在build路径下,接口类XXXMapper.java编译生成的XXXMapper.class会和XXXMapper.xml编译生成的XXXMapper.xml在同一目录文件下,所以间接性的把两个文件放在了同一包下,实现了上述的要求。

5、测试

UserMapperTest.java

package com.company.project.daotest;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.company.project.mapper.UserMapper;
import com.company.project.model.UserPo;
import com.company.project.util.MyBatisUtil;


import junit.framework.TestCase;

public class UserMapperTest extends TestCase{
    
    public void testFindById() {
        Logger logger = LoggerFactory.getLogger("hello");
        //获取会话
        SqlSession session = MyBatisUtil.getSession();
        try {
            //获取接口的实现类对象
            //会自动为接口创建一个代理对象,代理对象去执行增删改查
            UserMapper mapper = session.getMapper(UserMapper.class);
            UserPo userPo = mapper.findById(1000001l);
            System.out.println(userPo);
            logger.info(userPo.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
    
    public void testFindAll() {
        
        //获取会话
        SqlSession session = MyBatisUtil.getSession();
        try {
            //获取接口的实现类对象
            //会自动为接口创建一个代理对象,代理对象去执行增删改查
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<UserPo> userPoList = mapper.findAll();
            for(UserPo userPo : userPoList) {
                System.out.println(userPo.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
    
    public void testInsert() {
        //获取会话
        SqlSession session = MyBatisUtil.getSession();
        try {
            //获取接口的实现类对象
            //会自动为接口创建一个代理对象,代理对象去执行增删改查
            UserMapper mapper = session.getMapper(UserMapper.class);
            UserPo userPo = new UserPo();
            userPo.setUserId(1000003l);
            userPo.setName("王五");
            userPo.setPassword("123456");
            userPo.setPhoneNum(15555555555l);
            userPo.setSex("女");
            userPo.setShippingAddress("陕西省");
            userPo.setUserName("小仙女");
            System.out.println(userPo.toString());
            boolean flag = mapper.insert(userPo);
            if(flag) {
                session.commit();
                System.out.println("插入成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
    
    public void testUpdate() {
        //获取会话
        SqlSession session = MyBatisUtil.getSession();
        try {
            //获取接口的实现类对象
            //会自动为接口创建一个代理对象,代理对象去执行增删改查
            UserMapper mapper = session.getMapper(UserMapper.class);
            UserPo userPo = new UserPo();
            userPo.setUserId(1000003l);
            userPo.setName("王五");
            userPo.setPassword("123456");
            userPo.setPhoneNum(15555555555l);
            userPo.setSex("女");
            userPo.setShippingAddress("重庆市");
            userPo.setUserName("小美女");
            System.out.println(userPo.toString());
            boolean flag = mapper.update(userPo);
            if(flag) {
                session.commit();
                System.out.println("更新成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
    
    public void testDelete() {
        
        //获取会话
        SqlSession session = MyBatisUtil.getSession();
        try {
            //获取接口的实现类对象
            //会自动为接口创建一个代理对象,代理对象去执行增删改查
            UserMapper mapper = session.getMapper(UserMapper.class);
            boolean flag = mapper.delete(1000003l);
            if(flag) {
                session.commit();
                System.out.println("删除成功");
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

注意:

在mybatis中,对数据库操作,除了查询以外,其他的操作都需要进行提交 session.commit();,否则不会对数据库生效。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • Mybatis 创建数据库 Mybatis框架原理(掌握) 1、Mybatis 是什么? Mybatis 是一个持...
    __豆约翰__阅读 1,404评论 1 11
  • MyBatis:一款半自动化的持久层框架 是基于java面向对象的持久层框架 jdbc则是一个面向...
    想吃热干面了阅读 422评论 0 0
  • Mybatis 创建数据库 Mybatis框架原理(掌握) 1、Mybatis 是什么? Mybatis 是一个持...
    printf200阅读 717评论 0 4
  • Mybatis 创建数据库 Mybatis框架原理(掌握) 1、Mybatis 是什么? Mybatis 是一个持...
    数据萌新阅读 203评论 0 0
  • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL(灵活)、存储过程(PLSQL模块化的组件,数据库的一...
    _FireFly_阅读 438评论 0 0