MyBatis入门(一)---基本使用

一、MyBatis简介

1.1、概述

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

1.2、ORM

orm工具的基本思想
无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:
1. 从配置文件(通常是XML配置文件中)得到 sessionfactory.
2. 由sessionfactory  产生 session
3. 在session 中完成对数据的增删改查和事务提交等.
4. 在用完之后关闭session 。

5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。

二、环境搭建

2.1、所需要Jar包

 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。

2.2、建立数据库与插入数据

这里使用MySql数据库:

CREATE TABLE `mybatis`.`user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `name` VARCHAR(45) NOT NULL DEFAULT '无名氏' COMMENT '用户名',
  `age` TINYINT(3) NOT NULL DEFAULT 21 COMMENT '用户年龄',
  `birthday` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '用户生日',
  `address` VARCHAR(256) NOT NULL DEFAULT '北京' COMMENT '用户地址',
  PRIMARY KEY (`id`)  COMMENT '')
COMMENT = '用户表';
insert into user(id,name,age,birthday,address)
values(1,'张三',23,'1990-01-23 20:24:21','上海'),(2,'李四',18,'1986-12-23 12:13:11','广州'),(3,'张五',33,'1975-09-23 02:13:11','上海'),(4,'王六',27,'1984-11-01 11:23:14','重庆'),(5,'张三丰',108,'1971-01-02 02:12:11','武当');

2.3、建立Web项目把Jar包引入项目

三、建立配置文件,实体类,与接口

3.1、建立实体类

/**  

* @Title: User.java

* @Package com.pb.mybatis.po

* @Description: TODO(用户类)

* @author 刘楠 

* @date 2015-10-26 下午5:42:13

* @version V1.0  

*/
package com.pb.mybatis.po;

import java.util.Date;

/**
 * @ClassName: User

 * @Description: TODO(用户类)

 * @author  刘楠 

 * @date 2015-10-26 下午5:42:13

 *


 */
public class User {
    
    /**
     * id(用户ID)
     */
    private int id;
    /**
     * name(用户名)
     */
    private String name;
    /**
     *age (用户年龄)
     */
    private int age;
    /**
     * birthday(用户生日)
     */
    private Date birthday;
    /**
     * address (用户地址)
     */
    private String address;
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(int age) {
        this.age = age;
    }
    /**
     * @return the brithday
     */
    public Date getBirthday() {
        return brithday;
    }
    /**
     * @param brithday the brithday to set
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    /**
     * @return the address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address the address to set
     */
    public void setAddress(String address) {
        this.address = address;
    }
    

}

3.2、写实体类接口

/**  

* @Title: UserMapper.java

* @Package com.pb.mybatis.dao

* @Description: TODO(用一句话描述该文件做什么)

* @author 刘楠 

* @date 2015-10-26 下午5:45:13

* @version V1.0  

*/
package com.pb.mybatis.dao;

import com.pb.mybatis.po.User;

/**
 * @ClassName: UserMapper

 * @Description: TODO(用户类数据访问接口)

 * @author  刘楠 

 * @date 2015-10-26 下午5:45:13

 *


 */
public interface UserMapper {
    /**
     * 
     * @Title: selectUserById
    
     * @Description: TODO(根据用户ID查询)
    
     * @param id
     * @return User
     */
    public User selectUserById(int id);

}

3.3、与db.properties

 db.properties

#数据库基本配置
#驱动
driver=com.mysql.jdbc.Driver
#连接url
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8
#用户名
username=root
#密码
password=root

3.4、建立映射文件与configuration.xml配置

 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">
  <!--mapper命名空间要写接口的全路径  -->
<mapper namespace="com.pb.mybatis.dao.UserMapper">
<!--ID要与接口中的方法名相同   parameterType传入的参数类型 resultType 返回的类型这里也User类的全路径-->
<select id="selectUserById" parameterType="int" resultType="com.pb.mybatis.po.User">
select * from user
where id=#{id}
</select>
</mapper>

configuration.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>
<!-- 加载资源文件 -->
<properties resource="db.properties"/>
<!--配置环境  -->
<environments default="development">
<environment id="development">
<!--事务管理  -->
<transactionManager type="JDBC"/>
<!--数据源 通过Properties加载配置 -->
<dataSource type="POOLED">
<!--驱动driver  -->
<property name="driver" value="${driver}"/>
<!--连接URL  -->
<property name="url" value="${url}"/>
<!--用户名  -->
<property name="username" value="${username}"/>
<!--密码  -->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--建立映射  -->
<mappers>
<mapper resource="com/pb/mybatis/dao/UserMapper.xml"/>
</mappers>
</configuration>

3.5、简单根据ID查询

/**  

* @Title: Test1.java

* @Package com.pb.mybatis.test

* @Description: TODO(用一句话描述该文件做什么)

* @author 刘楠 

* @date 2015-10-26 下午5:55:54

* @version V1.0  

*/
package com.pb.mybatis.test;

import java.io.IOException;
import java.io.Reader;

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 com.pb.mybatis.dao.UserMapper;
import com.pb.mybatis.po.User;

/**
 * @ClassName: Test1

 * @Description: TODO(测试类)

 * @author  刘楠 

 * @date 2015-10-26 下午5:55:54

 *


 */
public class Test1 {
    //Session工厂
    static SqlSessionFactory sqlSessionFactory=null;
    //Session
    static SqlSession session=null;
    //字符流
    static Reader reader=null;
    
    public static void main(String[] args) {
        
        selectById();
    }
    /**
     * 
     * @Title: selectById
    
     * @Description: TODO(根据ID查找用户)
     void
     */
    public static void selectById(){
        //加载配置文件
        try {
            reader=Resources.getResourceAsReader("configuration.xml");
            //建立SqlSessionFactory
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
            //打开Session
            session=sqlSessionFactory.openSession();
            //获取用户接口对象
            UserMapper userMapper=session.getMapper(UserMapper.class);
            //调用查询方法
            User user=userMapper.selectUserById(1);
            System.out.println(user.getName()+"..."+user.getAge()+"..."+user.getBirthday().toLocaleString()+"..."+user.getAddress());
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

}

3.6、使用别名

 

<!--使用别名  -->
<typeAliases>
<!--用户类别名  -->
<typeAlias type="com.pb.mybatis.po.User" alias="User"/>
</typeAliases>

更改mapper.xml中的User类的路径 为别名

<?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命名空间要写接口的全路径  -->
<mapper namespace="com.pb.mybatis.dao.UserMapper">
<!--ID要与接口中的方法名相同   parameterType传入的参数类型 resultType 返回的类型这里也User类的全路径-->
<select id="selectUserById" parameterType="int" resultType="User">
select * from user
where id=#{id}
</select>
</mapper>

测试类不变

3.7、使用resultMap

在mapper.xml中使用resultMap

<?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命名空间要写接口的全路径  -->
<mapper namespace="com.pb.mybatis.dao.UserMapper">

<!--结果映射 不区另大小写,建议数据库的列写为大写  -->
<resultMap type="User" id="userMap">
<!--主键  -->
<id property="id" column="ID"/>
<!--姓名  -->
<id property="name" column="NAME"/>
<!--年龄  -->
<id property="age" column="AGE"/>
<!--生日  -->
<id property="birthday" column="BIRTHDAY"/>
<!--地址  -->
<id property="address" column="ADDRESS"/>
</resultMap>

<!--ID要与接口中的方法名相同   parameterType传入的参数类型 resultType 返回的类型这里也User类的全路径或者类的别名,  resultMap写已经有的映射2都只能同时有一个-->
<select id="selectUserById" parameterType="int" resultMap="userMap">
select * from user
where id=#{id}
</select>
</mapper>

测试类不变

四、实现基本的增、删、改、查

4.1、在接口中增加,模糊查询,添加,修改,删除的方法,

/**  

* @Title: UserMapper.java

* @Package com.pb.mybatis.dao

* @Description: TODO(用一句话描述该文件做什么)

* @author 刘楠 

* @date 2015-10-26 下午5:45:13

* @version V1.0  

*/
package com.pb.mybatis.dao;

import java.util.Date;
import java.util.List;

import com.pb.mybatis.po.User;

/**
 * @ClassName: UserMapper

 * @Description: TODO(用户类数据访问接口)

 * @author  刘楠 

 * @date 2015-10-26 下午5:45:13

 *


 */
public interface UserMapper {
    /**
     * 
     * @Title: selectUserById
    
     * @Description: TODO(根据用户ID查询)
    
     * @param id
     * @return User
     */
    public User selectUserById(int id);

    /**
     * 
     * @Title: selectUserLikeName
    
     * @Description: TODO(根据姓名模糊查询)
    
     * @param name
     * @return List<User>
     */
    public List<User> selectUserLikeName(String name);
    
    /**
     * 
     * @Title: addUser
    
     * @Description: TODO(添加用户)
    
     * @param user void
     */
    public void addUser(User user);
    /**
     * 
     * @Title: updateUser
    
     * @Description: TODO(修改用户)
    
     * @param user void
     */
    public void updateUser(User user);
    /**
     * 
     * @Title: deleteUser
    
     * @Description: TODO(删除用户)
    
     * @param id void
     */
    public void deleteUser(int id);
}

4.2、在mapper.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">
  <!--mapper命名空间要写接口的全路径  -->
<mapper namespace="com.pb.mybatis.dao.UserMapper">

<!--结果映射 不区另大小写,建议数据库的列写为大写  -->
<resultMap type="User" id="userMap">
<!--主键  -->
<id property="id" column="ID"/>
<!--姓名  -->
<id property="name" column="NAME"/>
<!--年龄  -->
<id property="age" column="AGE"/>
<!--生日  -->
<id property="birthday" column="BIRTHDAY"/>
<!--地址  -->
<id property="address" column="ADDRESS"/>
</resultMap>

<!--ID要与接口中的方法名相同   parameterType传入的参数类型 resultType 返回的类型这里也User类的全路径或者类的别名,  resultMap写已经有的映射2都只能同时有一个-->
<select id="selectUserById" parameterType="int" resultMap="userMap">
select * from user
where id=#{id}
</select>
<!--根据姓名模糊查询  -->
<select id="selectUserLikeName" parameterType="String" resultMap="userMap">
select * from user
where name like "%"#{name}"%"
</select>

<!--添加用户  useGeneratedKeys使用数据的增序列 keyProperty将增加后的用户ID返回-->
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user(name,age,birthday,address)
values(#{name},#{age},#{birthday},#{address})
</insert>
<!--修改更新  -->
<update id="updateUser" parameterType="User">
update user set name=#{name},age=#{age},birthday=#{birthday},address=#{address}
where id=#{id}
</update>
<!--删除  -->
<delete id="deleteUser" parameterType="int">
delete from user
where id=#{id}
</delete>
</mapper>

4.3、测试类

/**  

 * @Title: Test1.java

 * @Package com.pb.mybatis.test

 * @Description: TODO(用一句话描述该文件做什么)

 * @author 刘楠 

 * @date 2015-10-26 下午5:55:54

 * @version V1.0  

 */
package com.pb.mybatis.test;

import java.io.IOException;
import java.io.Reader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

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 com.pb.mybatis.dao.UserMapper;
import com.pb.mybatis.po.User;

/**
 * @ClassName: Test1
 * 
 * @Description: TODO(测试类)
 * 
 * @author 刘楠
 * 
 * @date 2015-10-26 下午5:55:54
 * 
 * 
 */
public class Test1 {
    // Session工厂
    static SqlSessionFactory sqlSessionFactory = null;
    // Session
    static SqlSession session = null;
    // 字符流
    static Reader reader = null;

    public static void main(String[] args) {

        
    }

    /**
     * 
     * @Title: selectById
     * 
     * @Description: TODO(根据ID查找用户) void
     */
    public static void selectById() {
        // 加载配置文件
        try {
            reader = Resources.getResourceAsReader("configuration.xml");
            // 建立SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            // 打开Session
            session = sqlSessionFactory.openSession();
            // 获取用户接口对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 调用查询方法
            User user = userMapper.selectUserById(1);
            System.out.println(user.getName() + "..." + user.getAge() + "..."
                    + user.getBirthday().toLocaleString() + "..."
                    + user.getAddress());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 
     * @Title: selectLikeName
     * 
     * @Description: TODO(根据用户名模糊查询) void
     */
    public static void selectLikeName() {
        // 加载配置文件
        try {
            reader = Resources.getResourceAsReader("configuration.xml");
            // 建立SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            // 打开Session
            session = sqlSessionFactory.openSession();
            // 获取用户接口对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 调用查询方法
            List<User> users = userMapper.selectUserLikeName("张");
            for (User user : users) {
                System.out.println(user.getName() + "..." + user.getAge()
                        + "..." + user.getBirthday().toLocaleString() + "..."
                        + user.getAddress());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /**
     * 
     * @Title: addUser
    
     * @Description: TODO(添加用户)
     void
     */
    public static void addUser() {
        // 加载配置文件
        try {
            reader = Resources.getResourceAsReader("configuration.xml");
            // 建立SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            // 打开Session
            session = sqlSessionFactory.openSession();
            // 获取用户接口对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 声明新用户
            User user =new User();
            user.setName("呵呵");
            user.setAge(22);
            String d="1984-09-23 20:23:22";
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
            Date date=sdf.parse(d);
            user.setBirthday(date);
            user.setAddress("不知道是哪的");
            userMapper.addUser(user);
            System.out.println("插入后的ID"+user.getId());
            //提交事务
            session.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /**
     * 
     * @Title: updateUser
    
     * @Description: TODO(修改用户)
     void
     */
    public static void updateUser() {
        // 加载配置文件
        try {
            reader = Resources.getResourceAsReader("configuration.xml");
            // 建立SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            // 打开Session
            session = sqlSessionFactory.openSession();
            // 获取用户接口对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 调用查询方法
            User user = userMapper.selectUserById(6);
            user.setName("想起 来叫什么了");
            user.setAddress("魔都上海");
            //更新
            userMapper.updateUser(user);
            //提交事务
            session.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static void detleUser() {
        // 加载配置文件
        try {
            reader = Resources.getResourceAsReader("configuration.xml");
            // 建立SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            // 打开Session
            session = sqlSessionFactory.openSession();
            // 获取用户接口对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
        
            //删除
            userMapper.deleteUser(6);
            //提交事务
            session.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

原文地址:https://www.cnblogs.com/liunanjava/p/4911791.html