浅入浅出MyBatis(01):查询id为1的用户的信息

January 14th 2015  | Tags: MyBatis, orm

2015-01-14

该文章是《专题:浅入浅出MyBatis》系列文章的一篇。点击进入该专题目录

工具与环境:Intellij IDEA 14,JDK 1.7,MyBatis 3.2,MySQL 5.5。

数据库设计

数据库使用MySQL,新建数据库blog_db,然后建立表:

CREATE  TABLE `blog_db`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

ALTER TABLE `blog_db`.`user` 
ADD UNIQUE INDEX `name_unique` (`name` ASC) ;

INSERT INTO `blog_db`.`user` (`name`, `email`, `password`) VALUES ('letian', 'letian@111.com', '123');

INSERT INTO `blog_db`.`user` ( `name`, `email`, `password`) VALUES ('xiaosi', 'xiaosi@111.com', '123');

user表中数据如下:

mysql> select * from user;
+----+--------+----------------+----------+
| id | name   | email          | password |
+----+--------+----------------+----------+
|  1 | letian | letian@111.com | 123      |
|  2 | xiaosi | xiaosi@111.com | 123      |
+----+--------+----------------+----------+
2 rows in set (0.00 sec)

源码结构

在项目下的lib目录下放入需要的两个jar。这里可以使用maven。File -> Project Structure -> Modules -> Dependencies -> 绿色的“+” -> Library… -> From Maven,筛选所需要的jar即可。

在src目录下存放我们编写的代码。

代码

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>
    <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/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="letian/mybatis/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

<environment>中配置了<dataSource>。上面的配置中,在<mappers>下只引入了一个mapper文件,具体是letian.mybatis.mapper.下的UserMapper.xmlresource属性的值是路径。

letian.mybatis.bean下的User.java

package letian.mybatis.bean;


public class User {

    private int id;
    private String name;
    private String email;
    private String password;

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

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

    public void setEmail(String email) {
        this.email = email;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

注意,setter和getter方法、toString可以使用IDEA生成,具体做法是在编辑器右击,选择“Generate…”,在弹出窗口选择要生成的方法即可。

更需要注意的是,User类的四个字段的名字和数据库中user表的各个对应的字段名称完全相同。

letian.mybatis.dao下的UserMapper.java

package letian.mybatis.dao;

import letian.mybatis.bean.User;

public interface UserMapper {

    User findById(int id);
}

UserMapper是一个接口,其接口名称以及定义的方法名称findById是能与letian/mybatis/mapper/UserMapper.xml中的配置对应起来的。

letian.mybatis.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">

<!--这块等于dao接口的实现  namespace必须和接口的类路径一样-->
<mapper namespace="letian.mybatis.dao.UserMapper">
    <!-- findById必须和接口中的方法名一样  返回一个User  就是刚才的别名  如果不弄别名要连类路径一起写 麻烦-->
    <select id="findById" parameterType="HashMap" resultType="letian.mybatis.bean.User">
        select
        * from blog_db.user where id=#{id}
    </select>
</mapper>

<Mapper>namespaceletian.mybatis.dao.UserMapper接口。唯一的一个<select>的id是findById,也是在letian.mybatis.dao.UserMapper接口定义的一个方法。<select>的值是一个select语句,其中#{id}对应方法findById的参数int id,执行select查询后,返回的类型是letian.mybatis.bean.User

此处的#{id}个人有些疑问,具体请见浅入浅出MyBatis(11):动态SQL

Main.java

import java.io.IOException;

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 letian.mybatis.bean.User;
import letian.mybatis.dao.UserMapper;


public class Main {

    public static void main(String[] args) throws IOException {

        SqlSessionFactory sessionFactory;
        sessionFactory = new SqlSessionFactoryBuilder()
                .build(Resources.getResourceAsReader("mybatis-config.xml"));

        SqlSession sqlSession = sessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user = userMapper.findById(1);
        System.out.println(user);

    }
}

运行结果

运行Main.java,结果如下:

User{id=1, name='letian', email='letian@111.com', password='123'}

参考

MyBatis入门学习(一)

一步步学Mybatis-搭建最简单的开发环境-开篇(1)

(完)