目录
1 Moven配置文件
2 mybatis.xml
3 实体类
4 SqlSessionUtils工具类
5 UserMapper.xml文件
6 UserMapper接口
7 UserMapperTest测试类
8 表SQL文件
9 项目结构
10 将数据库配置从mybatis中抽离出来
11 关系(一对一,一对多,多对多)
12 注解开发
13 一级二级缓存
自己写个清单,比较基础但是也可能有不对的地方
org.mybatis mybatis 3.5.11 mysql mysql-connector-java 8.0.28 junit junit RELEASE test src/main/java **/*.properties **/*.xml true src/main/resources **/*.properties **/*.xml true
User实体类
package com.learn.entity; import java.util.Date; import java.util.List; public class User { private Integer id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public User() { } public User(Integer id, String username, String sex, Date birthday, String address) { this.id = id; this.username = username; this.sex = sex; this.birthday = birthday; this.address = address; } /** * 获取 * @return id */ public Integer getId() { return id; } /** * 设置 * @param id */ public void setId(Integer id) { this.id = id; } /** * 获取 * @return username */ public String getUsername() { return username; } /** * 设置 * @param username */ public void setUsername(String username) { this.username = username; } /** * 获取 * @return sex */ public String getSex() { return sex; } /** * 设置 * @param sex */ public void setSex(String sex) { this.sex = sex; } /** * 获取 * @return birthday */ public Date getBirthday() { return birthday; } /** * 设置 * @param birthday */ public void setBirthday(Date birthday) { this.birthday = birthday; } /** * 获取 * @return address */ public String getAddress() { return address; } /** * 设置 * @param address */ public void setAddress(String address) { this.address = address; } public String toString() { return "User{id = " + id + ", username = " + username + ", sex = " + sex + ", birthday = " + birthday + ", address = " + address + "}"; } }
UserExt实体类
package com.learn.entity; //如果传入的参数够多,可以将参数再包装一次 public class UserExt { private User user; private String characteristic; public UserExt() { } public UserExt(User user, String characteristic) { this.user = user; this.characteristic = characteristic; } /** * 获取 * @return user */ public User getUser() { return user; } /** * 设置 * @param user */ public void setUser(User user) { this.user = user; } /** * 获取 * @return characteristic */ public String getCharacteristic() { return characteristic; } /** * 设置 * @param characteristic */ public void setCharacteristic(String characteristic) { this.characteristic = characteristic; } public String toString() { return "UserExt{user = " + user + ", characteristic = " + characteristic + "}"; } }
package com.learn.utils; 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 java.io.IOException; import java.io.InputStream; public class SqlSessionUtils { static SqlSessionFactory sqlSessionFactory; static { String path = "mybatis.xml"; InputStream ins = null; try { ins = Resources.getResourceAsStream(path); } catch (IOException e) { throw new RuntimeException(e); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins); } public static SqlSession getSqlSes() { return sqlSessionFactory.openSession(); } public static void closeSqlSes(SqlSession sqlSession) { if (sqlSession != null) { sqlSession.close(); } } }
update user where id=#{id} username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} insert into user(id, username, birthday, sex, address) values (#{id}, #{username}, #{birthday}, #{sex}, #{address}) SELECT LAST_INSERT_ID() insert into user(id, username, birthday, sex, address) values (null, #{item.username}, #{item.birthday}, #{item.sex}, #{item.address}) delete from user id = #{id}
package com.learn.mapper; import com.learn.entity.User; import com.learn.entity.UserExt; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper { //通过id查询 User selectUserById(int userId); //通过性别和地址查询 List
selectUserBySexAndAddress(@Param("sex") String sex, @Param("address") String address); //通过用户名和性别模糊查询 List selectUserByUserNameAndSexDim(@Param("username") String userName,@Param("sex") String sex); //通过传递包装类模糊查询 List selectUserBySexAndNameDim2(UserExt userExt); //查询所有 List selectAll(); //修改 int updateUser(User user); //插入数据,返回插入id int insertUser(User user); //删除 int removeUserById(int userId); //批量插入 int insertMultitudeUser(List user); //批量删除 int removeMultitudeUser(int[] userIdArr); }
package com.learn.test; import com.learn.entity.User; import com.learn.entity.UserExt; import com.learn.mapper.UserMapper; import com.learn.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.util.ArrayList; import java.util.Date; import java.util.List; public class UserMapperTest { static SqlSession session ; //在所有测试方法执行之前执行(只执行一次) @BeforeClass public static void init() { System.out.println("初始化完成!"); session=SqlSessionUtils.getSqlSes(); } //在所有测试方法执行完成之后执行(只执行一次) @AfterClass public static void end() { SqlSessionUtils.closeSqlSes(session); } @Test public void testSelectUserById() { UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.selectUserById(10); System.out.println("根据ID查询"); System.out.println(user.toString()); } @Test public void testSelectUserBySexAndAddress() { UserMapper userMapper = session.getMapper(UserMapper.class); userMapper.selectAll(); List
users = userMapper.selectUserBySexAndAddress("女","河南郑州"); System.out.println("根据性别和地址查询"); for (User user : users) { System.out.println(user.toString()); } } @Test public void testselectUserByUserNameAndSexDim() { UserMapper userMapper = session.getMapper(UserMapper.class); List users = userMapper.selectUserByUserNameAndSexDim("孙","男"); System.out.println("根据查询用户名和性别模糊查询"); for (User user : users) { System.out.println(user.toString()); } } @Test public void testselectUserBySexAndNameDim2() { UserMapper userMapper = session.getMapper(UserMapper.class); UserExt userExt=new UserExt(new User(null,"孙悟空","男",new Date(),"手机鞥"),"火"); List users = userMapper.selectUserBySexAndNameDim2(userExt); System.out.println("通过传递包装类的方式根据查询用户名和性别模糊查询"); users.forEach(System.out::println); } @Test public void testSelectAll() { UserMapper userMapper = session.getMapper(UserMapper.class); List users = userMapper.selectAll(); System.out.println("查询所有数据"); for (User user : users) { System.out.println(user.toString()); } } @Test public void testUpdateUser() { UserMapper userMapper = session.getMapper(UserMapper.class); User user=new User(); user.setId(30); user.setSex("男"); user.setUsername("微微"); user.setBirthday(new Date()); int row = userMapper.updateUser(user); //注意事务提交 session.commit(); System.out.println("更新数据"); } @Test public void testInsertUser() { UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setSex("女"); user.setUsername("梦鸽"); user.setBirthday(new Date()); System.out.println("插入数据:"+userMapper.insertUser(user)+"条"); session.commit(); //注意这里,只有插入完成后必须通过对象.属性才能获取到新增id值 System.out.println("插入数据的id为:"+user.getId()); } @Test public void testInsertMultitudeUser() { UserMapper userMapper = session.getMapper(UserMapper.class); List userList=new ArrayList<>(); userList.add(new User(null,"分割","男",new Date(),"七彩祥云1号楼")); userList.add(new User(null,"茶几上的","男",new Date(),"七彩祥云2号楼")); userList.add(new User(null,"所开发的","男",new Date(),"七彩祥云3号楼")); userList.add(new User(null,"哦怕","男",new Date(),"七彩祥云4号楼")); userList.add(new User(null,"说的","男",new Date(),"七彩祥云5号楼")); int row=userMapper.insertMultitudeUser(userList); session.commit(); System.out.println("批量插入数据:"+row+"条"); } @Test public void testRemoveUserById() { UserMapper userMapper = session.getMapper(UserMapper.class); int row = userMapper.removeUserById(36); session.commit(); System.out.println("删除数据:"+row+"条"); } @Test public void testRemoveMultitudeUser() { List idArray = new ArrayList (); idArray.add(30); idArray.add(31); idArray.add(32); UserMapper userMapper = session.getMapper(UserMapper.class); for (Integer integer : idArray) { userMapper.removeUserById(integer); } session.commit(); System.out.println("删除数据"+idArray.size()+"条"); } }
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名称', `birthday` date NULL DEFAULT NULL COMMENT '生日', `sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别', `address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 48 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, '盛世名', NULL, '2', NULL); INSERT INTO `user` VALUES (10, '张三大牙', '2014-07-10', '女', '北京市'); INSERT INTO `user` VALUES (16, '张吉东', NULL, '女', '河南郑州'); INSERT INTO `user` VALUES (22, '孙训', NULL, '女', '河南郑州'); INSERT INTO `user` VALUES (24, '周芷若', NULL, '女', '河南郑州'); INSERT INTO `user` VALUES (28, '孙悟空', '2022-11-07', '男', '花果山1号'); INSERT INTO `user` VALUES (29, '孙悟空', '2022-11-07', '男', '花果山1号'); INSERT INTO `user` VALUES (33, '茶几上的', '2022-11-08', '男', '七彩祥云2号楼'); INSERT INTO `user` VALUES (34, '所开发的', '2022-11-08', '男', '七彩祥云3号楼'); INSERT INTO `user` VALUES (35, '哦怕', '2022-11-08', '男', '七彩祥云4号楼'); INSERT INTO `user` VALUES (37, '梦鸽', '2022-11-08', '女', NULL); INSERT INTO `user` VALUES (38, '梦鸽', '2022-11-08', '女', NULL); INSERT INTO `user` VALUES (39, '梦鸽', '2022-11-08', '女', NULL); INSERT INTO `user` VALUES (41, '分割', '2022-11-08', '男', '七彩祥云1号楼'); INSERT INTO `user` VALUES (42, '茶几上的', '2022-11-08', '男', '七彩祥云2号楼'); INSERT INTO `user` VALUES (43, '所开发的', '2022-11-08', '男', '七彩祥云3号楼'); INSERT INTO `user` VALUES (44, '哦怕', '2022-11-08', '男', '七彩祥云4号楼'); INSERT INTO `user` VALUES (45, '说的', '2022-11-08', '男', '七彩祥云5号楼'); INSERT INTO `user` VALUES (47, '梦鸽', '2022-11-08', '女', NULL); SET FOREIGN_KEY_CHECKS = 1;
在resources中新建一个db.properties配置文件
里面粘贴上如下代码
jdbc.driveClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=abc123123123
然后替换原来的mybatis文件
注意两个地方
第1个是propeties标签的位置应该在environment标签之上
第2个地方是替换数据库驱动中的那些value的内容,使用美元加大括号的方式
UserMapperTwo.xml
UserMapperTwo.java
package com.learn.mapper; import com.learn.entity.User; import java.util.List; public interface UserMapperTwo { List
selectCartAndUser(); List selectCartAndUser2(); } UserMapperTwoTest.java
package com.learn.mapper; import com.learn.entity.User; import com.learn.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.util.List; import static org.junit.Assert.*; public class UserMapperTwoTest { static SqlSession session ; //在所有测试方法执行之前执行(只执行一次) @BeforeClass public static void init() { System.out.println("初始化完成!"); session= SqlSessionUtils.getSqlSes(); } //在所有测试方法执行完成之后执行(只执行一次) @AfterClass public static void end() { SqlSessionUtils.closeSqlSes(session); } @Test public void selectCartAndUser() { UserMapperTwo userMapper = session.getMapper(UserMapperTwo.class); List
users = userMapper.selectCartAndUser(); System.out.println("1对多"); for (int i = 0; i < users.size(); i++) { System.out.println(users.get(i)); } } @Test public void selectSelectCartAndUser2() { UserMapperTwo userMapper = session.getMapper(UserMapperTwo.class); List users = userMapper.selectCartAndUser2(); System.out.println("1对1"); for (int i = 0; i < users.size(); i++) { System.out.println(users.get(i)); } } }
UserMapperNotXml .java
package com.learn.mapper; import com.learn.entity.User; import org.apache.ibatis.annotations.Select; public interface UserMapperNotXml { @Select("select * from user where id=#{id}") User selectUserById(int userId); }
测试
package com.learn.mapper; import com.learn.entity.User; import com.learn.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.util.List; import static org.junit.Assert.*; public class UserMapperNotXmlTest { static SqlSession session ; //在所有测试方法执行之前执行(只执行一次) @BeforeClass public static void init() { System.out.println("初始化完成!"); session= SqlSessionUtils.getSqlSes(); } //在所有测试方法执行完成之后执行(只执行一次) @AfterClass public static void end() { SqlSessionUtils.closeSqlSes(session); } @Test public void TestselectUserById() { UserMapperNotXml userMapper = session.getMapper(UserMapperNotXml.class); User users = userMapper.selectUserById(10); System.out.println(users); } }
一级
默认情况下,MyBatis 只开启一级缓存。
是sqlSession级别的缓存 缓存的结构是个Map集合
注意 由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。
二级
二级缓存是全局缓存,作用域超出 session 范围之外,可以被所有同一个namespace内的 SqlSession 共享。
打开二级缓存
在mybatis.xml中配置
使用
1 在对应的maper里增加
2 修改实体类
3 测试
略
4 补充
局部不2级缓存
刷新2级缓存