MyBatis入门教程及基础进阶

转载请注明出处:http://blog.csdn.net/qq_15002323/article/details/51306354

MyBatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类—-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

MyBatis之初体验

1.准备工作

创建“初体验”数据库(MySQL),设计简单表结构,填充测试数据:
这里写图片描述
这里写图片描述
下载相关jar包(mybatis-3.1.1.jar,mysql-connector-java-5.1.6-bin.jar)

2.创建工程

新建一个普通Java工程
这里写图片描述
新建libs文件夹,将上面的两个jar包添加进来,然后add to build path:
这里写图片描述

3.编码实现

在src目录新建三个package:model,mapper,test;
model中新建User类:

package model;

public class User {

    private int id;

    private String name;

    private int age;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
}

mapper中添加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">
<!-- namespace用作标识mapper的唯一,通常包名+文件名 -->
<mapper namespace="mapper.userMapper">
    <select id="findAll" resultType="model.User">
        select * from user
    </select>
</mapper>

conf.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>
    <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://localhost:3306/mybatis-tutorial" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <!-- resource需要写成路径的形式 -->    
    <mappers>
        <mapper resource="mapper/userMapper.xml"/>
    </mappers>
</configuration>

在test包下新建测试类Test.java:

package test;

import java.io.InputStream;
import java.util.List;

import model.User;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Test {

    public static void main(String[] args) {
        String resource = "mapper/conf.xml";
        InputStream is = Test.class.getClassLoader().getResourceAsStream(
                resource);
        // build接受不同的参数,可采取其他方法创建SqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
                .build(is);
        SqlSession session = sessionFactory.openSession();
        String statement = "mapper.userMapper.findAll";
        // session拥有多个方法,可以自行研究
        List<User> users = session.selectList(statement);
        for (User user : users) {
            System.out.println(user);
        }
    }
}

完成了的效果就是这样滴:
这里写图片描述

4.激情测试

运行Test.java,观看控制台输出:
这里写图片描述


提高

虽然只是个入门篇,但我们都有颗求知的心。嗯,学习学习= ̄ω ̄=

参数传递

修改上述userMapper.xml,添加单个查询:

    <!-- 查询参数用#{}表示,注明parameterType类型 -->
    <select id="findUserByName" parameterType="String" resultType="model.User">
        select * from user where name = #{name}
    </select>

那么调用语句随之也会改变:

    String statement = "mapper.userMapper.findUserByName";
    List<User> users = session.selectList(statement, "科比");

这里写图片描述

那么传递多个参数咧,有几种方法,但是适合自己就是最好的,我比较喜欢用map:

    <select id="findUserByNameAndAge" parameterType="Map" resultType="model.User">
        select * from user where name = #{name} and age = #{age}
    </select>

同时修改调用代码:

    String statement = "mapper.userMapper.findUserByNameAndAge";
    Map<String, String> params = new HashMap<String, String>();
    params.put("name", "科比");
    params.put("age", "18");
    List<User> users = session.selectList(statement, params);

测试通过:
这里写图片描述

配置优化

程序猿都是非常懒的,反正我就这样。。上面mapper里面每次用到User类时,都需要写出全名resultType="model.User"。若是工程大了,写的地方多了,忒累了啊。我们可以给这个类起一个别名,这个需要在conf.xml的<configuration></configuration>里面配置:

    <typeAliases>
      <typeAlias alias="user" type="model.User"/>
    </typeAliases>

这样我们用的时候就不用写全称了,直接写这个别名就行:

    <select id="findAll" resultType="user">
        select * from user
    </select>

可能,我们编写的model与数据库字段不对应,这样还能正常运行程序吗?一试便知,修改User代码:

package model;

public class User {

    private int id;

    private String name;

    private int score;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", score=" + score + "]";
    }
}

就只是将age换成了score了,运行程序:
这里写图片描述
很明显score这个属性没有被正常赋值,这个时候我们就需要用resultMap了,修改mapper下的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">
<!-- namespace用作标识mapper的唯一,通常包名+文件名 -->
<mapper namespace="mapper.userMapper">

    <resultMap type="user" id="user">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="score"/>
    </resultMap>

    <select id="findAll" resultMap="user">
        select * from user
    </select>
</mapper>

运行程序,期待结果吧:
这里写图片描述
这样就完美解决了表字段与类属性不对应的情况了。嗯嗯~~

那么数据库配置就这样写在xml里面是不是有失妥当,额,新建一个db.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis-tutorial
username=root
password=123456

同时需要修改conf.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>
    <!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration" 
        must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". -->
    <properties resource="db.properties" />

    <typeAliases>
        <typeAlias alias="user" type="model.User" />
    </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>

    <!-- resource需要写成路径的形式 -->
    <mappers>
        <mapper resource="mapper/userMapper.xml" />
    </mappers>
</configuration>

完美运行啊有木有,目前就知道这么多了,我也是小白一枚,第一次学就写这个当笔记吧,要是有错误的地方读者一定要吐槽下,定当改正。拜拜(^__^) 嘻嘻……

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值