MyBatis 入门以及实践

首先感谢下TechBirds大神,提供了一篇十分优秀的博客,将MyBatis介绍的十分详细,大神博客地址为:mybatis实战教程(mybatis in action),mybatis入门到精通
最近一直研究MyBatis架构,对于很多内容不是十分熟悉,具体整体介绍在MyBatis详细文档介绍,文档介绍十分详细但可能难以整体理解,所以在此稍微详细的进行描述。

  • -

MyBatis

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

环境搭建

  MyBatis算是上市互联网公司和业界较常用的一个数据访问框架,另外还有一个框架hibernate,但MyBatis较之更加受欢迎。 

OK,简介下运行环境所需配置:
1、编译器:Eclipse
2、数据库:MySQL
3、MyBatis: mybatis-3.4.4.jar
4、数据库驱动包: mysql-connector-java-5.1.26-bin.jar
介绍完配置,首先我们在Eclipse里面创建一个Java项目,名字JavaTestDB,然后我们创建两个包,如下图所示:
这里写图片描述
创建成功以后,我们开始设置数据库文件,在Mysql命令行下创建一个数据库test,并创建一个数据库表user,创建数据库代码如下:

create database test;
use test;
Create TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(50) DEFAULT NULL,
  `userAge` int(11) DEFAULT NULL,
  `userAddress` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;
insert into user values('1','summer','23','shaanxi, xian');

如下图所示创建成功:
这里写图片描述
注解:
ENGINE=InnoDB使用innodb引擎,MySQL引擎之一
DEFAULT CHARSET=gbk 数据库默认编码为gbk
AUTO_INCREMENT=1 自增键的起始序号为1

  • MyBatis下XML环境配置
    在这里需要配置两个XML文件,如上图项目架构图所示,我们将创建两个XML配置文件,一个Configuration.xml和userMapper.xml文件,Configuration文件主要用来配置与数据库MySQL进行远端连接,静态配置地址与数据库密码,以及定位userMapper文件,具体代码如下:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <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/test?characterEncoding=gbk" />
            <property name="username" value="root"/>
            <property name="password" value="数据库密码"/>
        </dataSource>
      </environment>
    </environments>
     <mappers>
         <!-- 注册userMapper.xml文件,userMapper.xml位于com.gyc.mybatis.models这个包下,所以resource写成   
         com/gyc/mybatis/models/userMapper.xml-->
         <mapper resource="com/gyc/mybatis/models/userMapper.xml"/>
    </mappers>
</configuration>

PS:我们在创建表的时候设置默认DEFAULT CHARSET=gbk,为了相关汉字输入不为乱码,我们将在Configuration.xml文件里面设置同样文本编码方式。

相关函数创建

而userMapper.xml文件其主要用来设置数据库增删改查等操作,以及设置传入参数以及返回值类型,我们将以增删改查基本操作为接入点逐级介绍,但首先介绍下主函数如何打开数据库以及进行基本操作,在这里我们使用接口类进行获取userMapper.xml文件内设置到的数据库基本语法操作,需要创建的函数如下所示:
1、创建User类,在使用过程中,查找的为一个User类,则需创建一个User的实体,临时存储查找结果,如下所示:

public class User {

    private int id;
    private String userName;
    private String userAge;
    private String userAddress;

    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 getUserAge() {
        return userAge;
    }
    public void setUserAge(String userAge) {
        this.userAge = userAge;
    }
    public String getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }   
}

PS:小技巧,在Eclipse里面声明了变量以后,可以选住变量以后然后右键选择Source,然后选择Getters and Setters,编译器自动创建相关get and set函数,十分方便的操作。
2、创建接口类IUserOperation,为了更加方便安全操作,我们使用接口类,如下代码所示,我们声明了每一个函数名必须与userMapper.xml文件里面设置的id声明的名字一致,否则无法关联到userMapper进行相关操作,主函数将会调用相关函数,下文逐一介绍,代码如下:

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(int id);
}

3、创建主函数,主函数主要用来调用Configuration.xml函数,然后打开数据库连接,然后通过接口类,进行相关的增删改查操作。为了方便,所以Configuration函数创建为static类,在程序启动时自动进行加载,如下所示:

public class TestMybatis {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader; 

    static{
        try{
            reader = Resources.getResourceAsReader("Configuration.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;        
    }

     /**
     * 指定ID查询操作
     * @param id
     */
    public void selectUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(1);
            System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAge()+":"+user.getUserAddress());
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            session.close();
        }
    }

    /**
     * 指定表名查询全表操作
     * @param id
     */
    public void getUserList(String userName){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);          
            List<User> users = userOperation.selectUsers(userName);
            for(User user:users){
                System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());
            }

        } finally {
            session.close();
        }
    }

    /**
     * 此处为添加新User操作
     * 操作添加,更新,删除操作以后,必须进行提交操作即 commit操作。
     */
    public void addUser(){
        User user=new User();
        user.setUserAddress("测试");
        user.setUserName("西安");
        user.setUserAge("20");
        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();
        }
    }

    /**
     * 更新某一用户数据库信息
     * @param id
     */
    public void updateUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(id);
            user.setUserAddress("山东");
            userOperation.updateUser(user);
            session.commit();
            System.out.println("修改成功");
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            session.close();
        }
    }

    /**
     * 删除指定id信息
     * @param id
     */

    public void deleteUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            userOperation.deleteUser(6);
            session.commit();
            System.out.println("删除成功");
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            session.close();
        }
    }

    /**
     * 数据库关联数据查询
     * @param userid
     */
    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();
        }
    }


    public static void main(String[] args) {
        TestMybatis testMybatis = new TestMybatis();
        testMybatis.getUserArticles(1);
    }
}

以上介绍了主要函数以及配置文件,接下我们将以五个例子逐一介绍使用MyBatis以及userMapper.xml文件配置。
4、创建userMapper.xml文件,其主要声明数据库增删改查的具体操作方式,以及输入、查询结果输出类型,具体细节可以在开篇的MyBatis详细文档介绍文章中查找,在此次只是简单的进行介绍,代码如下:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gyc.mybatis.IUserOperation">
    <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型resultType="com.gyc.mybatis.models.User"就表示将查询结果封装成一个User类的对象返回User类就是users表所对应的实体类
    -->
    <!--  根据id查询得到一个user对象 -->
    <select id="selectUserByID" parameterType="int" 
        resultType="com.gyc.mybatis.models.User">
        select * from user where id=#{id}
    </select>

    <!-- 查询整个表内容,返回值为User类的List -->
    <resultMap type="com.gyc.mybatis.models.User" id="resultListUser">
        <id column="id" property="id"/>
        <result column="userName" property="userName"/>
        <result column="userAge" property="userAge"/>
        <result column="userAddress" property="userAddress"/>
    </resultMap>

    <select id="selectUsers" parameterType="string" resultMap="resultListUser">
        select * from user 
    </select>

    <!- 添加新的User类的数据 -->
    <insert id="addUser" parameterType="com.gyc.mybatis.models.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(userName, userAge, userAddress) values(#{userName}, #{userAge}, #{userAddress})
    </insert>

    <!- 修改某一ID的数据库内信息 -->
    <update id="updateUser" parameterType="com.gyc.mybatis.models.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>

    <!- 进行相关数据表关联查询 -->
    <resultMap id="resultUserArticleList" type="com.gyc.mybatis.models.Article">
        <id property="id" column="a_id" />
        <result property="title" column="title" />
        <result property="content" column="content" />

        <association property="user" javaType="com.gyc.mybatis.models.User">
            <id property="id" column="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.a_id,article.title,article.content from user,article
              where user.id=article.userid and user.id=#{id}
    </select>


</mapper>

MyBatis数据库添加操作

首先进行数据库查询操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):

<!--  根据id查询得到一个user对象 -->
    <select id="selectUserByID" parameterType="int" 
        resultType="com.gyc.mybatis.models.User">
        select * from user where id=#{id}
    </select>

然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:

public User selectUserByID(int id);

主函数内编写添加操作函数如下所示:

     /**
     * 指定ID查询操作
     * @param id
     */
    public void selectUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(1);
            System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAge()+":"+user.getUserAddress());
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            session.close();
        }
    }

最后在主函数中实例化TestMybatis,并进行相关函数调用,如下所示:

public static void main(String[] args) {
        TestMybatis testMybatis = new TestMybatis();
        testMybatis.selectUser(1);
    }

OK,添加操作完成。

MyBatis数据库查询全表操作

查询全表内容时,因为返回类型为user类的一个集合,所以我们可以采取返回为List链表的形式,并逐一输出整个表。在userMapper里面,我们需编写一个返回集合,以便查询结果存储,即resultMap,具体代码如下:

<resultMap type="com.gyc.mybatis.models.User" id="resultListUser">
        <id column="id" property="id"/>
        <result column="userName" property="userName"/>
        <result column="userAge" property="userAge"/>
        <result column="userAddress" property="userAddress"/>
    </resultMap>

    <select id="selectUsers" parameterType="string" resultMap="resultListUser">
        select * from user 
    </select>

然后在接口类IUserOperation添加相关函数,如下所示:

public List<User> selectUsers(String userName); 

主函数内添加相关操作函数:

 public void getUserList(String userName){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);          
            List<User> users = userOperation.selectUsers(userName);
            for(User user:users){
               System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());
            }

        } finally {
            session.close();
        }
    }

MyBatis数据库添加操作

数据库添加操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):

<insert id="addUser" parameterType="com.gyc.mybatis.models.User" useGeneratedKeys="true" keyProperty="id">
      insert into user(userName, userAge, userAddress) values(#{userName}, #{userAge}, #{userAddress})
</insert>

然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:

public void addUser(User user);

主函数内编写添加操作函数如下所示:

    /**
     * 操作添加,更新,删除操作以后,必须进行提交操作即 commit操作。
     */
    public void addUser(){
        User user=new User();
        user.setUserAddress("测试");
        user.setUserName("西安");
        user.setUserAge("20");
        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();
        }
    }

MyBatis数据库更新操作

数据库更新操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):

<update id="updateUser" parameterType="com.gyc.mybatis.models.User">
        update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
</update>

然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:

public void updateUser(User user);

主函数内编写添加操作函数如下所示:

     /**
     * 更新某一用户数据库信息
     * @param id
     */
    public void updateUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            User user = userOperation.selectUserByID(id);
            user.setUserAddress("山东");
            userOperation.updateUser(user);
            session.commit();
            System.out.println("修改成功");
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            session.close();
        }
    }

MyBatis数据库删除操作

数据库删除操作,先在userMapper.xml文件添加代码(上文中userMapper代码段已经将以下代码添加入,以下只是进行逐一分析):

<delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
</delete>

然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:

public void deleteUser(int id);

主函数内编写添加操作函数如下所示:

     /**
     * 删除指定id信息
     * @param id
     */

    public void deleteUser(int id) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IUserOperation userOperation = session.getMapper(IUserOperation.class);
            userOperation.deleteUser(6);
            session.commit();
            System.out.println("删除成功");
        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            session.close();
        }
    }

MyBatis数据库关联查询操作

数据库关联查询操作,我们先创建新的一个关联数据表,创建代码如下:

Create TABLE `article` (
  `a_id` int(11) NOT NULL auto_increment,
  `userid` int(11) NOT NULL,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=gbk;

insert into article values('1','1','Where are you','Who are you?');

创建成功如下所示:
这里写图片描述

在userMapper.xml文件添加代码,其中需要编写返回类型resultMap,与此同时,我们还需编写关联数据类型

<resultMap id="resultUserArticleList" type="com.gyc.mybatis.models.Article">
        <id property="id" column="a_id" />
        <result property="title" column="title" />
        <result property="content" column="content" />

        <association property="user" javaType="com.gyc.mybatis.models.User">
            <id property="id" column="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.a_id,article.title,article.content from user,article
              where user.id=article.userid and user.id=#{id}
    </select>

然后在接口类IUserOperation添加相关函数,函数名必须与id声明的名称一样,以便在主函数进行调用,返回值类型为查询结果类型,在上文类接口函数创建中以描述,具体如下所示:

public List<Article> getUserArticles(int id);

主函数内编写添加操作函数如下所示:

    /**
     * 数据库关联数据查询
     * @param userid
     */
    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();
        }
    }

小总结

这是这几天从网上查找的资料的小总结,并不是自己的原创,但是感觉还是有些难度的对于新手,所以先暂时更新这么多,随后再继续修改,再次很感谢文章开头的大神TechBirds写的博客,还在学习过程中,如有错误欢迎指正,同时欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值