MyBatis入门教程及基础进阶

来源:互联网 发布:淘宝如何赚钱 编辑:程序博客网 时间:2024/05/29 17:31

转载请注明出处: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.Driverurl=jdbc:mysql://localhost:3306/mybatis-tutorialusername=rootpassword=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