码迷,mamicode.com
首页 > 其他好文 > 详细

mybaits开发环境准备及入门demo(一)

时间:2015-05-13 00:58:23      阅读:522      评论:0      收藏:0      [点我收藏+]

标签:mybatis   spring   intellij   

如果说你还在用eclipse做开发,只能说明你要么是一个已经编程很久但是不远改变习惯的老程序员,要么是一个刚开始学习java的新手,如果是前者,我无言以劝,因为习惯很难改变,但是如果你是一个刚入门的新手,那么希望你从这篇文章开始,学习使用----IntelliJ IDEA,忘记eclipse吧


开发环境:

    IDEA  + mysql + mybatis + spring + maven + git

   在这里我想引用下网上对于mybatis和springd的一些优缺点的分析,个人觉得非常透彻。

mybatis的优缺点:
优点:
1. 易于上手和掌握。
2. sql写在xml里,便于统一管理和优化。
3. 解除sql与程序代码的耦合。
4. 提供映射标签,支持对象与数据库的orm字段关系映射
5. 提供对象关系映射标签,支持对象关系组建维护
6. 提供xml标签,支持编写动态sql。
缺点:
1. sql工作量很大,尤其是字段多、关联表多时,更是如此。
2. sql依赖于数据库,导致数据库移植性差。
3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签, 如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
5. DAO层过于简单,对象组装的工作量较大。
6.  不支持级联更新、级联删除。
7. 编写动态sql时,不方便调试,尤其逻辑复杂时。
8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
9. 使用不当,容易导致N+1的sql性能问题。
10. 使用不当,关联查询时容易产生分页bug。
11. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
12. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
13. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
14. 缓存使用不当,容易产生脏数据。
 
总结:
mybatis的优点其实也是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql 的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限,无法像j dbc那样在代码里根据逻辑实现复杂动态sql拼接。mybatis简单看就是提供了字段映射和对象关系映射的jdbc,省去了数据赋值 到对象的步骤而已,除此以外并无太多作为,不要把它想象成hibernate那样强大,简单小巧易用上手,方便浏览修改sql就是它 最大的优点了。
mybatis适用于小型且程序员能力较低的项目和人群使用,对于中大型项目来说我并不推荐使用,如果觉得hibernate效率低的话 (实际上也是使用不当所致,hibernate是实际上是不适用于拥有高负载的工程项目),还不如直接用spring提供的jdbc简单框架 (Template),同样支持对象映射。
spring的优缺点:
优点
a. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的 framework,
Spring致力于解决剩下的问题。
b. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性 和面向对象的程度。
c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经 对某个类
要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的 JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。
d. 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。
e. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
f. 使用Spring构建的应用程序易于单元测试。
g. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却 不会影响调用代码。
h.Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使 用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。
i.Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。
缺点:使用人数不
多、jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器
  

  下面开始从一个非常简单的例子来进入对mybaits的学习。

  例子demo地址:https://github.com/felay/mybaits-demo,其中doc文件是从官网上扒下来的中文文档,很多对于mybatis的介绍都在里面

  

  1.首先打开IDEA-FILE-NEW 进入新建项目页面,如下图:

  技术分享

2.新建一个Maven项目,自己默认生成,不从maven骨架中选择,即不选择Create from  archetype,选择next,填写GrounpId和ArtifactId,其中GrounpId一般填写公司名称,ArtifactId填写项目名称,比如下图:

技术分享

此时我们新建了一个maven项目。

3.填写pom.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.vcg</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <dependencies>
        <!--mybatis的依赖包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>

        <!--mysql-jar包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>


    </dependencies>


    <build>
        <!--让包路径下的xml文件在编译时候可以一起打包到classpath下-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>

        <!--让mavem编译的时候跳过测试-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>

    </build>


</project>

可以看到要想使用mybaits,我们需要很少的依赖包,足以说明mybatis是超轻量级的ORM工具(而非框架)。

4.新建实体类---User,如下:

 

package com.vcg.entity;

import java.io.Serializable;

/**
 * Created by felayman on 2015/5/12.
 */
public class User implements Serializable {

    private static final long serialVersionUID = 5290554467007482646L;

    private int id;

    private String username;

    private String 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 + '\'' +
                '}';
    }
}

5.新建Mapper接口类---UserMapper,如下:

package com.vcg.dao;

import com.vcg.entity.User;

/**
 * Created by felayman on 2015/5/12.
 */
public interface UserMapper {

    public User getUser(int id);

}

6.新建Mapper接口类的映射文件---UserMapper,如下:

<?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.vcg.dao.UserMapper">

    <resultMap type="User" id="userResultMap">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
    </resultMap>

    <!-- 查询学生,根据id -->
    <select id="getUser" parameterType="int" resultType="User" resultMap="userResultMap">
            SELECT * from user
            WHERE  id = #{id}
    </select>

</mapper>
7.新建mybatis的配置文件--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>
    <!--别名-->
    <typeAliases>
        <typeAlias alias="User" type="com.vcg.entity.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/mybatis" />
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>

    <!--Mappers标签:加载MyBatis中实体类的SQL映射语句文件-->
    <mappers>
        <mapper resource="com/vcg/dao/UserMapper.xml" />
    </mappers>
</configuration>

8.新建测试类---Test.java

package com.vcg.test;

import com.vcg.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 java.io.InputStream;
import java.io.Reader;

/**
 * Created by felayman on 2015/5/12.
 */

public class UserTest {

    private static SqlSessionFactory sqlSessionFactory ;

    //以流的方式来创建sqlSessionFactory
    private static InputStream in;

    /**
     * 获取sqlSessionFactory
     * @return
     */
    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;
    }


    static {
        try {
            in = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        }catch(Exception e){
            e.printStackTrace();
        }
    }




    public static void main(String []args){

        SqlSession session = sqlSessionFactory.openSession();
        try {
            User user = session.selectOne("com.vcg.dao.UserMapper.getUser",1);
            System.out.println(user);
        }catch(Exception e){
            e.printStackTrace();
        }

    }

}

9.在mysql数据库中新建一个表user,如下:

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 60004
Source Host           : localhost:3306
Source Database       : mybatis

Target Server Type    : MYSQL
Target Server Version : 60004
File Encoding         : 65001

Date: 2015-05-12 23:00:46
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'root', 'root');

10.执行Test.java文件,然后一定要找到maven,执行clean,install命令,如下图。

技术分享

技术分享

11.然后我们就会看到我们想要的结果(利用mybatis从数据库中查找我们需要的数据),这个demo非常简单,最重要的是我们不依赖于其他jar包,便完成了对mybatis简单的功能实现,后面会集成其他框架,以更好的体验出mybatis的优点,demo中没有说明各个包直接的包结构,大家可以下载源码看一下。下一节我们会对该demo中的代码部分进行分析,然后自己利用java自己简单实现一个类似于mybatis的sql映射工具出来。



mybaits开发环境准备及入门demo(一)

标签:mybatis   spring   intellij   

原文地址:http://blog.csdn.net/u012332735/article/details/45676481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!