目录
自己写个清单,比较基础但是也可能有不对的地方
-
-
- <dependencies>
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>3.5.11version>
- dependency>
-
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>8.0.28version>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>RELEASEversion>
- <scope>testscope>
- dependency>
- dependencies>
-
- <build>
- <resources>
- <resource>
- <directory>src/main/javadirectory>
- <includes>
- <include>**/*.propertiesinclude>
- <include>**/*.xmlinclude>
- includes>
- <filtering>truefiltering>
- resource>
- <resource>
- <directory>src/main/resourcesdirectory>
- <includes>
- <include>**/*.propertiesinclude>
- <include>**/*.xmlinclude>
- includes>
- <filtering>truefiltering>
- resource>
- resources>
- build>
- "1.0" encoding="UTF-8" ?>
-
- 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.cj.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
- <property name="username" value="root"/>
- <property name="password" value="scm13503905942"/>
- dataSource>
- environment>
- environments>
-
- <mappers>
- <package name="com.learn.mapper"/>
- mappers>
- configuration>
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();
- }
- }
- }
- "1.0" encoding="UTF-8"?>
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.learn.mapper.UserMapper">
-
- <select id="selectUserById" resultType="com.learn.entity.User">
- select * from user
- <where>
- id=#{id}
- where>
- select>
-
-
- <select id="selectUserBySexAndAddress" resultType="com.learn.entity.User">
- select *
- from user
- where sex = #{sex}
- and address = #{address}
- select>
-
-
- <select id="selectUserByUserNameAndSexDim" resultType="com.learn.entity.User">
- select * from user
- <where>
- <if test="null!=username">
- and username like concat('%',#{username},'%')
- if>
- <if test="null!=sex">
- and sex like concat('%',#{sex},'%')
- if>
- where>
- select>
-
-
- <select id="selectAll" resultType="com.learn.entity.User">
- select *
- from user
- select>
-
-
- <select id="selectUserBySexAndNameDim2" parameterType="com.learn.entity.UserExt" resultType="com.learn.entity.User">
- select * from user
- <where>
- <if test="null!=user.sex">
- and sex like '%${user.sex}%'
- if>
- <if test="null!=user.username">
- and username like '%${user.username}%'
- if>
- where>
- select>
-
-
-
-
-
- <update id="updateUser" parameterType="com.learn.entity.User">
- update user
- <set>
- <if test="username!=null">
- username=#{username},
- if>
- <if test="username!=null">
- birthday=#{birthday},
- if>
- <if test="sex!=null">
- sex=#{sex},
- if>
- <if test="address!=null">
- address=#{address}
- if>
- set>
- where id=#{id}
- update>
-
-
- <insert id="insertUser" parameterType="com.learn.entity.User" useGeneratedKeys="true" keyProperty="AffeectIdList">
- insert into user(id, username, birthday, sex, address)
- values (#{id}, #{username}, #{birthday}, #{sex}, #{address})
-
- <selectKey keyProperty="id" order="AFTER" resultType="int">
- SELECT LAST_INSERT_ID()
- selectKey>
- insert>
-
-
- <insert id="insertMultitudeUser" parameterType="com.learn.entity.User">
- insert into user(id, username, birthday, sex, address)
- values
-
- <foreach collection="list" separator="," item="item">
- (null, #{item.username}, #{item.birthday}, #{item.sex}, #{item.address})
- foreach>
- insert>
-
-
- <delete id="removeUserById" parameterType="int">
- delete
- from user
- <where>
- id = #{id}
- where>
- delete>
-
-
-
- mapper>
- 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的内容,使用美元加大括号的方式
"1.0" encoding="UTF-8" ?> configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"> properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driveClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> dataSource> environment> environments> <mappers> <package name="com.learn.mapper"/> mappers> configuration>
UserMapperTwo.xml
"1.0" encoding="UTF-8"?> mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.learn.mapper.UserMapperTwo"> <resultMap id="selectCartAndUserMap" type="com.learn.entity.Cart"> <id column="cartId" property="cartId">id> <result column="userId" property="userId">result> <result column="totalnum" property="totalnum">result> <result column="totalmoney" property="totalmoney">result> <collection property="cartItem" ofType="com.learn.entity.CartItem"> <id column="cartItemId" property="cartItemId">id> <result column="cartId" property="cartId">result> <result column="pid" property="pid">result> <result column="pnum" property="pnum">result> <result column="pmoney" property="pmoney">result> collection> resultMap> <select id="selectCartAndUser" resultMap="selectCartAndUserMap"> select * from cart c, cartItem ci where c.cartId = ci.cartId select> <resultMap id="selectCartAndUserMap2" type="com.learn.entity.User"> <id column="id" property="id">id> <result column="username" property="username">result> <result column="sex" property="sex">result> <result column="birthday" property="birthday">result> <result column="address" property="address">result> <association property="cart" javaType="com.learn.entity.Cart"> <id column="cartId" property="cartId">id> <result column="userId" property="userId">result> <result column="totalnum" property="totalnum">result> <result column="totalmoney" property="totalmoney">result> association> resultMap> <select id="selectCartAndUser2" resultMap="selectCartAndUserMap2"> select * from user u,cart c where u.id=c.cartId select> mapper>UserMapperTwo.java
package com.learn.mapper; import com.learn.entity.User; import java.util.List; public interface UserMapperTwo { ListselectCartAndUser(); ListselectCartAndUser2(); }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); Listusers = 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); Listusers = 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中配置
"db.properties"> "cacheEnabled" value="true" /> default="development"> 使用
1 在对应的maper里增加
2 修改实体类
3 测试
略
4 补充
局部不2级缓存
刷新2级缓存