Mybatis学习笔记

叁歲伎倆 2022-05-27 00:39 314阅读 0赞

学习了Mybatis。相对于hibernate来说这个框架更加灵活,开发效率更快,适用于那些改动比较频繁的项目。

首先加入mybatis的配置文件myBatisConfig.xml 这个配置文件的名字随意

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <settings>
  7. <!-- 懒加载开启 -->
  8. <setting name="lazyLoadingEnabled" value="true"/>
  9. <!-- 为真,直接查询关联数据,为假按需查询 -->
  10. <setting name="aggressiveLazyLoading" value="false"/>
  11. <!-- 开启二级缓存 -->
  12. <setting name="cacheEnabled" value="true"/>
  13. </settings>
  14. <!-- 配置数据库连接信息 -->
  15. <properties resource="db.properties"/>
  16. <!-- 别名定义 ,一定要放在environments标签前面-->
  17. <typeAliases>
  18. <!-- 单个类别名定义 -->
  19. <!-- <typeAlias type="com.samrtian.entity.User" alias="User"/> -->
  20. <!-- 批量,扫描整个包别名定义,名字就是类名 -->
  21. <package name="com.samrtian.entity"/>
  22. </typeAliases>
  23. <!-- 连接信息 -->
  24. <environments default="development">
  25. <environment id="development">
  26. <transactionManager type="JDBC"/>
  27. <dataSource type="POOLED">
  28. <property name="driver" value="${jdbc.driver}"/>
  29. <property name="url" value="${jdbc.connect}"/>
  30. <property name="username" value="${jdbc.username}"/>
  31. <property name="password" value="${jdbc.password}"/>
  32. </dataSource>
  33. </environment>
  34. </environments>
  35. <mappers>
  36. <!-- 映射文件 -->
  37. <mapper resource="sqlMap/User.xml"/>
  38. <!-- 代理方法映射文件 -->
  39. <!-- <mapper resource="com/samrtian/mapper/UserMapper.xml"/> -->
  40. <!-- 通过代理接口映射文件XML和类名必须一致且在同一个目录内 -->
  41. <!-- <mapper class="com.samrtian.mapper.UserMapper"/> -->
  42. <!-- 通过包名批量加载代理接口映射文件 -->
  43. <package name="com.samrtian.mapper"/>
  44. </mappers>
  45. </configuration>

下边是db.properties的数据库配置文件

  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.connect=jdbc:mysql://localhost:3306/bls?serverTimezone=GMT
  3. jdbc.username=root
  4. jdbc.password=ytfmnm

然后是加入映射文件我们下边用的事mapper的代理方法,这样方便快捷

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- 这里的namespace是对应的代理类名 -->
  6. <mapper namespace="com.samrtian.mapper.UserMapper">
  7. <!-- 让这个mapper启用二级缓存, 并且把相关的实体类实现序列化 -->
  8. <!-- <cache type="使用哪些二级缓存类"/> -->
  9. <select id="findByUserID" parameterType="java.lang.Integer" resultType="com.samrtian.entity.User">
  10. select * from t_user where id = #{id}
  11. </select>
  12. <select id="findByUserName" parameterType="java.lang.String" resultType="com.samrtian.entity.User">
  13. select * from t_user where name = #{value}
  14. </select>
  15. <select id="findLikeUserName" parameterType="java.lang.String" resultType="com.samrtian.entity.User">
  16. select * from t_user where name like '%${value}%'
  17. </select>
  18. <delete id="deleteUser" parameterType="java.lang.Integer">
  19. delete from t_user where id = #{id}
  20. </delete>
  21. <update id="updateUser" parameterType="User">
  22. update t_user set name = #{name}, password = #{password} where id = #{id}
  23. </update>
  24. <insert id="insertUser" parameterType="com.samrtian.entity.User">
  25. <!-- 插入数据后ID自动填充到User里边,因为是先提交插入到数据库里边才生成的ID所以用AFTER -->
  26. <selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
  27. select LAST_INSERT_ID()
  28. </selectKey>
  29. INSERT into t_user(name, password) VALUES(#{name}, #{password});
  30. </insert>
  31. <!-- 定义一个SQL片段 -->
  32. <sql id="sql_user_where">
  33. <if test="user!=null">
  34. <if test="user.name!=null">
  35. and name = #{user.name}
  36. </if>
  37. <if test="user.password">
  38. and password = #{user.password}
  39. </if>
  40. </if>
  41. </sql>
  42. <!-- 多参数的话自定义一个包装类VO,把条件当属性添加进去 , user是CustomVo里边的一个属性-->
  43. <!-- 只有当属性成员user和里边的属性值不为空的话才会拼接条件 -->
  44. <select id="findByUserInfo" parameterType="com.samrtian.po.CustomVo" resultType="User">
  45. select * from t_user
  46. <where>
  47. <!-- 如果这段查询条件经常用到的话可以定义一个SQL片段,这样的话可以复用 -->
  48. <!-- <if test="user!=null"> -->
  49. <!-- <if test="user.name!=null"> -->
  50. <!-- and name = #{user.name} -->
  51. <!-- </if> -->
  52. <!-- <if test="user.password"> -->
  53. <!-- and password = #{user.password} -->
  54. <!-- </if> -->
  55. <!-- </if> -->
  56. <include refid="sql_user_where"/>
  57. </where>
  58. </select>
  59. <!-- 当查出来的结果集列名与POJO的属性名不一致时可以做一个映射这样就可以查询出来结果集了 -->
  60. <resultMap type="User" id="UserMap">
  61. <id column="id_" property="id"/>
  62. <result column="n_" property="name"/>
  63. <result column="p_" property="password"/>
  64. </resultMap>
  65. <select id="findByidResultMap" parameterType="int" resultMap="UserMap">
  66. select id id_, name n_, password p_ from t_user where id = #{id}
  67. </select>
  68. <!-- 以列表为参数 -->
  69. <select id="findByIds" parameterType="list" resultType="User">
  70. select * from t_user
  71. <where>
  72. <if test="list!=null">
  73. <foreach collection="list" item="user_id" open="and id in (" close=")" separator=",">
  74. #{user_id}
  75. </foreach>
  76. </if>
  77. </where>
  78. </select>
  79. <!-- association标签是用来标识一对一的关系映射也可以实现懒加载 -->
  80. <resultMap type="com.samrtian.po.CustomVo" id="Cv">
  81. <result column="GroupName" property="groupName"/>
  82. <association property="user" javaType="User">
  83. <id column="id" property="id"/>
  84. <result column="name" property="name"/>
  85. <result column="password" property="password"/>
  86. <result column="groupid" property="groupID"/>
  87. </association>
  88. </resultMap>
  89. <select id="findByidAss" parameterType="int" resultMap="Cv">
  90. SELECT u.*, g.GroupName FROM t_user u, t_groupwork g
  91. WHERE u.groupid = g.GroupID AND u.id = #{id}
  92. </select>
  93. <!-- collection标签是用来标识一对多关系映射 select是延迟加载-->
  94. <!-- <resultMap type="" id="" extends=""> -->
  95. <!-- <collection property="属性名" ofType="多的那个类型" select="上边的select ID"> -->
  96. <!-- <id/> -->
  97. <!-- <result/> -->
  98. <!-- </collection> -->
  99. <!-- </resultMap> -->
  100. <!-- <select id=""> -->
  101. <!-- </select> -->
  102. <!-- collection标签也可以用来标识多对多关系映射 -->
  103. <!-- <resultMap type="" id="" extends=""> -->
  104. <!-- <collection property="属性名" ofType="多的那个类型"> -->
  105. <!-- <id/> -->
  106. <!-- <result/> -->
  107. <!-- <collection property=""> -->
  108. <!-- </collection> -->
  109. <!-- </collection> -->
  110. <!-- </resultMap> -->
  111. <!-- <select id=""> -->
  112. <!-- </select> -->
  113. </mapper>

下边是映射文件对应的代理接口类

  1. package com.samrtian.mapper;
  2. import java.util.List;
  3. import com.samrtian.entity.User;
  4. import com.samrtian.po.CustomVo;
  5. public interface UserMapper {
  6. public User findByUserID(int id);
  7. public User findByUserName(String name);
  8. public List<User> findLikeUserName(String name);
  9. public void insertUser(User user);
  10. public void deleteUser(int id);
  11. public void updateUser(User user);
  12. public User findByUserInfo(CustomVo vo);
  13. public User findByidResultMap(int id);
  14. public List<User> findByIds(List<Integer> list);
  15. public CustomVo findByidAss(int id);
  16. }

代理接口类的方法与xml映射文件的id要一致包括参数和返回类型.

下边来测试使用方法

  1. package test_ssh;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.Test;
  11. import com.samrtian.entity.User;
  12. import com.samrtian.mapper.UserMapper;
  13. import com.samrtian.po.CustomVo;
  14. public class test {
  15. @Test
  16. public void select() throws IOException {
  17. String resource = "myBatisConfig.xml";
  18. InputStream inputStream = Resources.getResourceAsStream(resource);
  19. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  20. SqlSession session = sqlSessionFactory.openSession();
  21. User user = session.selectOne("nsUser.findByUserID", 1);
  22. System.out.println(user.getName() + " " + user.getPassword());
  23. session.close();
  24. }
  25. @Test
  26. public void like() throws IOException {
  27. String resource = "myBatisConfig.xml";
  28. InputStream inputStream = Resources.getResourceAsStream(resource);
  29. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  30. SqlSession session = sqlSessionFactory.openSession();
  31. List<User> list = session.selectList("nsUser.findLikeUserName", "xu");
  32. System.out.println(list);
  33. session.close();
  34. }
  35. @Test
  36. public void insert() throws IOException {
  37. String resource = "myBatisConfig.xml";
  38. InputStream inputStream = Resources.getResourceAsStream(resource);
  39. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  40. SqlSession session = sqlSessionFactory.openSession();
  41. User user = new User();
  42. user.setName("xiaohu");
  43. user.setPassword("fsdfds");
  44. session.insert("nsUser.insertUser", user);
  45. session.commit();
  46. System.out.println(user);
  47. session.close();
  48. }
  49. @Test
  50. public void delete() throws IOException {
  51. String resource = "myBatisConfig.xml";
  52. InputStream inputStream = Resources.getResourceAsStream(resource);
  53. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  54. SqlSession session = sqlSessionFactory.openSession();
  55. session.delete("nsUser.deleteUser", 334);
  56. session.commit();
  57. session.close();
  58. }
  59. @Test
  60. public void update() throws IOException {
  61. String resource = "myBatisConfig.xml";
  62. InputStream inputStream = Resources.getResourceAsStream(resource);
  63. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  64. SqlSession session = sqlSessionFactory.openSession();
  65. User user = new User();
  66. user.setId(888);
  67. user.setName("kongjinxiang");
  68. user.setPassword("55555");
  69. session.update("nsUser.updateUser", user);
  70. session.commit();
  71. session.close();
  72. }
  73. @Test
  74. public void testMapper() throws IOException {
  75. String resource = "myBatisConfig.xml";
  76. InputStream inputStream = Resources.getResourceAsStream(resource);
  77. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  78. SqlSession session = sqlSessionFactory.openSession();
  79. UserMapper userMapper = session.getMapper(UserMapper.class);
  80. User user = userMapper.findByUserID(888);
  81. session.close();
  82. System.out.println(user);
  83. }
  84. @Test
  85. public void testMultiParam() throws IOException {
  86. String resource = "myBatisConfig.xml";
  87. InputStream inputStream = Resources.getResourceAsStream(resource);
  88. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  89. SqlSession session = sqlSessionFactory.openSession();
  90. UserMapper userMapper = session.getMapper(UserMapper.class);
  91. CustomVo vo = new CustomVo();
  92. User user = new User();
  93. user.setName("xiaohu");
  94. user.setPassword("fsdfds");
  95. vo.setUser(user);
  96. userMapper.findByUserInfo(vo);
  97. session.close();
  98. System.out.println(user);
  99. }
  100. @Test
  101. public void testResultMap() throws IOException {
  102. String resource = "myBatisConfig.xml";
  103. InputStream inputStream = Resources.getResourceAsStream(resource);
  104. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  105. SqlSession session = sqlSessionFactory.openSession();
  106. UserMapper userMapper = session.getMapper(UserMapper.class);
  107. User user = userMapper.findByidResultMap(1);
  108. session.close();
  109. System.out.println(user);
  110. }
  111. @Test
  112. public void testUsersForID() throws IOException {
  113. String resource = "myBatisConfig.xml";
  114. InputStream inputStream = Resources.getResourceAsStream(resource);
  115. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  116. SqlSession session = sqlSessionFactory.openSession();
  117. UserMapper userMapper = session.getMapper(UserMapper.class);
  118. List<Integer> list = new ArrayList<Integer>();
  119. list.add(1);
  120. list.add(3);
  121. list.add(5);
  122. List<User> users = userMapper.findByIds(list);
  123. session.close();
  124. System.out.println(users);
  125. }
  126. @Test
  127. public void testAssociation() throws IOException {
  128. String resource = "myBatisConfig.xml";
  129. InputStream inputStream = Resources.getResourceAsStream(resource);
  130. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  131. SqlSession session = sqlSessionFactory.openSession();
  132. UserMapper userMapper = session.getMapper(UserMapper.class);
  133. CustomVo user = userMapper.findByidAss(1);
  134. session.close();
  135. System.out.println(user.getUser().toString() + " " + user.getGroupName());
  136. }
  137. }

测试成功。都没问题

发表评论

表情:
评论列表 (有 0 条评论,314人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Mybatis学习笔记

    一、引言 1.框架的三层架构     表现层:是用于展示数据(SpringMVC)     业务层:是处理业务需求     持久层:是和数据库交互(MyBati

    相关 Mybatis学习笔记

    学习了Mybatis。相对于hibernate来说这个框架更加灵活,开发效率更快,适用于那些改动比较频繁的项目。 首先加入mybatis的配置文件myBatisConfig.