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#連接urlurl=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 userwhere 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 userwhere 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 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.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 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.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(); } }}
新聞熱點
疑難解答