你的位置:首页 > Java教程

[Java教程]MyBatis入门(一)


一、MyBatis简介

1.1、概述

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

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

MyBatis 可以对配置和原生Map使用简单的

1.2、ORM

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

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

 

二、环境搭建

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#连接urlurl=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8#用户名username=root#密码password=root

3.4、建立映射文件与configuration.

 

 UserMapper.

<??><!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 userwhere id=#{id}</select></mapper>

 

configuration.

<??><!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./></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.);      //建立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.

<??><!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 userwhere id=#{id}</select></mapper>

测试类不变

3.7、使用resultMap

在mapper.

 

<??><!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 userwhere 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.

 

<??><!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 userwhere id=#{id}</select><!--根据姓名模糊查询 --><select id="selectUserLikeName" parameterType="String" resultMap="userMap">select * from userwhere 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 userwhere 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.);      // 建立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.);      // 建立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.);      // 建立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.);      // 建立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.);      // 建立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();    }  }}