简介

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,其几乎消除了所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。MyBatis 应用程序大都使用 SqlSessionFactory 实例,SqlSessionFactory 实例可以通过 SqlSessionFactoryBuilder 获得,而 SqlSessionFactoryBuilder 则可以从一个 XML 配置文件或者一个预定义的配置类的实例获得。

依赖

mybatis-3.2.2.jar 核心jar
mysql-connector-java-5.1.10-bin.jar 数据库访问

1.Configuration配置

在resources下,新建Configuration.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>

    <!-- 设置别名,用于在User.xml中 ,这里不设置
    <typeAliases>
        <typeAlias  alias="User"  type="com.zyzpp.model.User"/>
    </typeAliases>
    -->
    <typeAliases>
        <typeAlias  alias="User"  type="com.zyzpp.model.User"/>
    </typeAliases>
    <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://127.0.0.1:3306/work?useUnicode=true&amp;characterEncoding=UTF-8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!--映射实体的mapper配置-->
    <mappers>
        <mapper resource="com/zyzpp/inter/User.xml"/>
    </mappers>

</configuration>

2.Entity实体类

示例:

package com.zyzpp.model;

public class User {
    private int id;
    private String userName;
    private int userAge;
    private String userAddress;
    private List<Card> cards;

    ....

}

3.Dao层接口

示例:

package com.zyzpp.inter;

public interface IUserOperation {

    public User selectUserByID(int id);
    public List<User> selectUsers(String userName);
    public void addUser(User user);
    public void updateUser(User user);
    public void deleteUser(int id);
    public List<Article> getUserArticles(@Param("userid") int userid);      //多个参数要加注释区分
    public User getUserCards(int id);
    public int getCount(User user);
    public List<User> getLimit(Map map);

}

4.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.zyzpp.inter.IUserOperation">

    <!-- 如果在配置xml文件中设置了别名,在这里可以只写别名
     <select id="seleteUserByID" parameterType="int" 

     select中包含的是SQL语句,以及语句的参数。
     id 与 接口的方法名一致 parameterType是方法参数类型 -->

    <!-- 根据id查询用户 -->
    <select id="selectUserByID" parameterType="int" resultType="cn.zyzpp.model.User">
        select * from user where id=#{id}
    </select>

    <resultMap type="User" id="resultListUser">
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="userName" property="userName" jdbcType="VARCHAR" />
        <result column="userAge" property="userAge" jdbcType="INTEGER" />
        <result column="userAddress" property="userAddress" jdbcType="VARCHAR" />
    </resultMap>
    <!-- 根据用户名模糊查找 -->
    <select id="selectUsers" parameterType="String" resultMap="resultListUser">
        select * from user where userName like #{userName}
    </select>

    <!-- 增加一个用户 -->
    <insert id="addUser" parameterType="User" useGeneratedKeys="true"
        keyProperty="id">
        insert into user(userName,userAge,userAddress)
        values(#{userName},#{userAge},#{userAddress})
    </insert>

    <!-- 根据ID更新用户信息 -->
    <update id="updateUser" parameterType="User">
        update user set userName =
        #{userName},userAge=#{userAge},userAddress=#{userAddress} where
        id=#{id}
    </update>

    <!-- 根据id删除用户 -->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    </delete>

    <!-- 其中需要说明的是,如果两个表中存在重名字段,如上文所述uesr表中有id字段,article表中同样有id字段,
    在使用Mybatis进行联合查询的过程中,会遇到只返回一条数据的情况。然而在数据库中直接运行sql语句是正常的。
    在出现重名字段时,配置Mybatis文件时需要把字段重新命名,否则Mybatis会混乱.
    例如下面的 ID一号二号不可以重复。在这里就把article表中的id字段命名为了aid。只可改一号!
     -->
    <!-- User 联合文章进行查询 方法之一的配置 (多对一的方式) column="数据库字段名" property="实体类属性" jdbcType="数据库字段类型" -->
    <resultMap id="resultUserArticleList" type="com.zyzpp.model.Article">
        <id property="id" column="aid" jdbcType="INTEGER" /><!-- id一号 -->
        <result property="title" column="title" />
        <result property="content" column="content" />
        <!-- associayion=标签
        也可以<association property="user" javaType="User" resultMap="resultListUser"/>
        -->
        <association property="user" javaType="User" column="userid">
            <id property="id" column="id" /><!-- id 二号-->
            <result property="userName" column="userName" />
            <result property="userAddress" column="userAddress" />
        </association>
    </resultMap>

    <!-- 多对一 -->
    <select id="getUserArticles" parameterType="int"
        resultMap="resultUserArticleList">
        select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article
        where
        user.id=article.userid and user.id=#{id}
    </select>

        <!-- 一对多 collection 查询用户手机卡-->
    <resultMap id="resultUserCards" type="com.zyzpp.model.User">
        <id property="id" column="u_id" />
        <result property="userName" column="userName" />
        <result property="userAge" column="userAge" />
        <result property="userAddress" column="userAddress" />
        <collection property="cards" ofType="com.zyzpp.model.Card">
            <id property="id" column="id" />
            <result property="cardNo" column="card_no" />
            <result property="remark" column="remark" />
        </collection>
    </resultMap>

    <!-- 一对多 -->
    <select id="getUserCards" parameterType="int" resultMap="resultUserCards">
        SELECT u.id u_id,u.userName,u.userAge,u.userAddress,c.id,c.card_no,c.remark
        FROM user u,card c
        WHERE u.id=c.user_id AND u.id=#{id}
    </select>

    <!-- 获取总条数 -->
    <select id="getCount" parameterType="com.zyzpp.model.User" resultType="int">
        select count(*) from user
        <where>
            <if test="id!=0"><!-- &quot; " -->
                and id=#{id}
            </if>
            <if test="userName!=null and !&quot;&quot;.equals(userName.trim())">
                and userName like % #{userName} %
            </if>
        </where>
    </select>

    <!-- 获取特定记录-->
    <select id="getLimit" parameterType="java.util.Map" resultMap="resultListUser">
        SELECT * FROM user
        <where>
            <if test="user.id!=0"><!-- &quot; " -->
                and id=#{user.id}
            </if>
            <if test="user.userName!=null and !&quot;&quot;.equals(user.userName.trim())">
                and userName like % #{user.userName} %
            </if>
        </where>
        order by id LIMIT #{page.dbIndex},#{page.dbNumber};
    </select>
</mapper>

5.开始使用

import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;
    private static String resource = "Configuration.xml";    //mybatis的配置文件

    static{
        try{
            /*使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)*/
            reader=Resources.getResourceAsReader(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//构建sqlSession的工厂
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Test test =new Test();
        User user=new User();
        test.getLimit();
//      test.getCount(user);
//  test.getUserCards(1);
//  test.getUserArticles(1);
//      test.getUserList("%");
//      test.addUser();
//      test.updateUser(1, "这是更新后的地址");
//      test.deleteUser(3);
    }
    /*
     * 以ID查找单个数据
     */
    public void getUserByID(int id){
        SqlSession session=sqlSessionFactory.openSession();
        try{
        IUserOperation userOperation=session.getMapper(IUserOperation.class);
        User user=userOperation.selectUserByID(id);
        System.out.println("查询ID:"+id+"结果如下\n"+"名字:"+user.getUserName()+" 年龄:"+user.getUserAge()+" 地址:"+user.getUserAddress());
        }finally {
            session.close();
        }
    }
    /*
     * 以name查找符合的List列表
     */
    public void getUserList(String userName){
        SqlSession session=sqlSessionFactory.openSession();
        try{
            IUserOperation userOperation=session.getMapper(IUserOperation.class);
            List<User> users = userOperation.selectUsers(userName);
            System.out.println("查询结果如下:");
            for(User user: users){
                System.out.println(user.toString());
            }
        }finally {
            session.close();
        }
    }
    /*
     * 增加一个用户
     */
    public void addUser(){
        User user = new User();
        user.setUserAddress("人民广场");
        user.setUserAge(18);
        user.setUserName("飞鸟");
        SqlSession session = sqlSessionFactory.openSession();
        try{
        IUserOperation userOperation =session .getMapper(IUserOperation.class);
        userOperation.addUser(user);
        session.commit();
        System.out.println("当前增加的用户ID:"+user.getId());
        }finally {
            session.close();
        }
    }
    /*
     * 更新数据
     */
    public void updateUser(int id,String content){
        //先得到用户,然后修改提交
        SqlSession session = sqlSessionFactory.openSession();
        try{
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(id);
            user.setUserAddress(content);
            userOperation.updateUser(user);
            session.commit();
            System.out.println("更新ID:"+id+"成功!");
        }finally {
            session.close();
        }
    }
    /*
     * 删除数据
     */
    public void deleteUser(int id){
        SqlSession session = sqlSessionFactory.openSession();
        try{
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            userOperation.deleteUser(id);
            session.commit();
            System.out.println("删除ID:"+id+"成功!");
        }finally {
            session.close();
        }
    }
    /*
     * 多对一
     */
    public void getUserArticles(int userid){
        SqlSession session = sqlSessionFactory.openSession();
        try {
        IUserOperation userOperation=session.getMapper(IUserOperation.class);
        List<Article> articles = userOperation.getUserArticles(userid);
        for(Article article:articles){
        System.out.println("标题:"+article.getTitle()+":内容:"+article.getContent()+
        ":作者是:"+article.getUser().getUserName()+":地址:"+
        article.getUser().getUserAddress());
        }
        } finally {
        session.close();
        }
        }
    /*
     * 一对多
     */
    private void getUserCards(int userid) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.getUserCards(userid);
            System.out.println(user.toString());
            for (Card card : user.getCards()) {
                System.out.println(card.toString());
            }
        } finally {
            session.close();
        }
    }
    /*
     * 按条件查询总条数
     */
    private int getCount(User user){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            int i = userOperation.getCount(user);
            System.out.println("总条数:"+i);
            return i;
        } finally {
            session.close();
        }
    }
    /**
     * 按条件查询List记录
     */
    private void getLimit(){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            Map<String, Object> map=new HashMap<String, Object>();
            Page page=new Page();
            page.setDbIndex(0);
            page.setDbNumber(1);
            User user=new User();
            user.setId(1);
            map.put("page", page);
            map.put("user", user);
            List<User> users = userOperation.getLimit(map);
            System.out.println("查询结果如下:");
            for(User use: users){
                System.out.println(use.toString());
            }
        } finally {
            session.close();
        }
    }
}

一看就懂的Mybatis框架入门笔记的更多相关文章

  1. CI框架入门笔记

    当前(2019-03-22)CodeIgniter 框架的最新版本是 3.1.5,于2017年6月发布,距今快两年了也没有更新,这与 Laravel 的更新速度相比差距太大了.因为确实,它是一个很古老 ...

  2. MyBatis框架 课程笔记

    MyBatis框架 课程笔记   第1章 MyBatis简介 1.1 MyBatis历史 1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Softw ...

  3. 小学生都看得懂的C语言入门(1): 基础/判别/循环

    c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++  ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...

  4. MyBatis框架入门之(二)

    在本篇文章中,没有对细节进行处理的很好,有很多晓得细节的遗漏,本文只是一个简单的快速的入门 MyBatis的快速入门 导入MyBatis框架jar包 配置文件 SqlSessionFactoryBui ...

  5. Mybatis框架入门

    Mybaits框架 一.什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了googl ...

  6. mybatis框架入门程序:演示通过mybatis实现数据库的查询操作

    我们现在工程基于的数据库见“https://www.cnblogs.com/wyhluckdog/p/10147754.html”这篇博文. 1.mybatis下载 mybatis的代码由githua ...

  7. 03 Mybatis框架---学习笔记1--框架的概念及优势

    1.框架的概念 框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统.简单说就是使用别人搭好的舞台,你来做表演.而且,框架一般是成熟的,不断升级的软件.框架是我们软件开发中的一套解决方 ...

  8. Java Mybatis 框架入门教程

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBati ...

  9. 优于jdbc的mybatis框架入门

    1.什么是mybatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索. MyB ...

随机推荐

  1. macOS下MySQL 8.0 安装与配置教程

    一.前言 1.本教程主要内容 适用Homebrew安装MySQL MySQL 8.0 基础适用于配置 MySQL shell管理常用语法示例(用户.权限等) MySQL字符编码配置 MySQL远程访问 ...

  2. Docker的安装与使用介绍

    docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  3. HTTP Authentication

    PS:近期看了一本思维导图的书,实践一下.

  4. ZooKeeper使用命令大全

    stat path [watch]    set path data [version]    ls path [watch]    delquota [-n|-b] path    ls2 path ...

  5. [20181124]关于降序索引问题3.txt

    [20181124]关于降序索引问题3.txt --//链接:blog.itpub.net/267265/viewspace-2221425/,探讨降序索引中索引的键值.--//实际上使用函数sys_ ...

  6. 用beamoff给VMware的Mac OS X 10.10.x加速

    前言 今天刚在VMware里装了个Yosemite,然后测试了下看电影,真j8卡,试了下在vm里打开3d加速,然并卵,直接显示不能打开3d加速,然后找了下发现有个vga的什么软件,是vmware里的显 ...

  7. 《软工实践》第零次作业 - 一些QA

    <软工实践>第零次作业 - 一些QA Q&A (1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 你认为过去两年中接触到的课程是否符合你对计算机 ...

  8. 我的BRF+自学教程(二):跟踪模式(trace mode)

    使用自开发程序来处理业务逻辑时,处理过程通常是个黑箱,业务顾问和业务用户不知道程序的具体运行方式,要依赖文档和频繁的沟通来确认实际情况. BRFplus可以通过配置的方式实现业务逻辑,使得业务人员把业 ...

  9. 在已经安装的nginx上,增加ssl模块

    1. /usr/local/nginx/sbin/nginx -V 查看nginx版本与编译安装了哪些模块nginx version: nginx/1.10.3built by gcc 4.4.7 2 ...

  10. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...