0
点赞
收藏
分享

微信扫一扫

SSM-MyBatis学习

是归人不是过客 2022-01-12 阅读 37

maven中导入依赖(父工程中写,子工程不需要再写)

resultMap:解决属性名和字段名不一致的问题

使用注解开发(简单多了😄)

多对一(需要两个实体类Student/Teacher)

一对多(TeacherMapper)

maven中导入依赖(父工程中写,子工程不需要再写)

 <!--导入依赖-->
    <dependencies>
<!-- mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
<!--mybatis驱动-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!--junit驱动-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

    <!-- 在 build 中配置 resources,来防止我们资源导出失败的问题   -->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

配置mybati核心配置文件(每个项目都需要)

<?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>

    <!-- 引用db.properties配置文件 -->
    <!--       <properties resource="db.properties"/>-->
    <!--
      development : 开发模式
     work : 工作模式
  -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <!-- value属性值引用db.properties配置文件中配置的值 -->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;userUnicode=true&amp;characterEncoding=UTF-8" />
                <property name="username" value="root" />
                <property name="password" value="admin" />
            </dataSource>
        </environment>
    </environments>
    <!--每一个mapper.xml都需要mybatis核心配置文件中注册!-->
    <mappers>
            <mapper resource="com/web/dao/UserMapper.xml"/>
    </mappers>

</configuration>

创建utils(每个项目都需要)

 private static   SqlSessionFactory sqlSessionFactory;
    static {

        try {
            //使用mybatis获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream= Resources.getResourceAsStream(resource);
             sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //有了sqlsessionfactory 就可以从中获取sqlsession
    //sqlsession完全包含了面向数据库执行sql命令所需的所有方法
    public static SqlSession getSqlSession(){
        return  sqlSessionFactory.openSession();

    }

//创建UserMapper

//实现简单的增删改查,分页模糊查询

  //模糊查询
    List<User>getUserLike(String value);

    //分页
    List<User>getUserByLimit(Map<String,Integer> map);
    //分页2(老方法)
    List<User>getUserByRowBounds();
    //查询全部用户
    List<User>getUserList();

    //根据ID查询用户
    User getUserById(int id);
    User getUserById2(Map<String,Object> map);

    //insert一个用户
    int addUser(User user);

    //万能的map
   int addUser2(Map<String,Object> map);

    //修改用户
    int updateUser(User user);
    //删除用户
    int deleteUser(int id);

配置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">
<!--namespace绑定一个对应的dao/mapper接口-->
<mapper namespace="com.web.dao.UserMapper">
    <!--select 查询语句 -->
    <!-- id=getUserList为UserMapper的方法||  sql语句返回值-->
    <select id="getUserList" resultType="com.web.pojo.User">
    select * from mybatis.user;
     /*mybatis.user 需要IDEA连接数据库 不连接 可以直接写 表名user*/
  </select>


               <!--根据Id查询-->              <!--传递参数类型-->
    <select id="getUserById" parameterType="int" resultType="com.web.pojo.User">
                                <!--接收参数-->
    select * from mybatis.user where id =#{id}

    </select>
    <select id="getUserById2" parameterType="map" resultType="com.web.pojo.User">
        select * from mybatis.user where id=#{id} and name=#{name};

    </select>



      <!--添加-->    <!--  User对象中的属性可以直接取出来  -->
    <insert id="addUser" parameterType="com.web.pojo.User" >
       insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});

    </insert>
            <!--传递Map中的key-->
    <insert id="addUser2" parameterType="map">
    insert into mybatis.user (id,name,pwd) values (#{userid},#{username},#{userpwd});

    </insert>

        <!--修改-->
    <update id="updateUser" parameterType="com.web.pojo.User">
        update mybatis.user set name=#{name },pwd=#{pwd}  where id=#{id};

    </update>
        <!--删除-->
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id};

    </delete>
        <!--模糊查询-->
    <select id="getUserLike" resultType="com.web.pojo.User">
        select * from mybatis.user where name like #{value}
    </select>
    <!--分页查询-->
    <select id="getUserByLimit" parameterType="map" resultType="com.web.pojo.User">
        select * from mybatis.user limit #{startIndex},#{pageSize}

    </select>
    <!--分页查询2-->
    <select id="getUserByRowBounds"  resultType="com.web.pojo.User">
        select * from mybatis.user
    </select>

</mapper>

Test测试

@Test
    //分页查询
    public void getUserByLimit(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",0);
        map.put("pageSize",2);
        List<User> userByLimit = mapper.getUserByLimit(map);

        for (User us:userByLimit
             ) {
            System.out.println(us);
        }
        sqlSession.close();

    }
    @Test
    //分页查询2
    public void getUserByRowBounds(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //RowBounds实现
        RowBounds rowBounds = new RowBounds(1, 2);


        //通过java代码实现分页
        List<User> userList = sqlSession.selectList(
                "com.web.dao.UserMapper.getUserByRowBounds",null,rowBounds);
        for (User us: userList
             ) {
            System.out.println(us);
        }

        sqlSession.close();
    }
    @Test
    //模糊查询
    public void getUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList =mapper.getUserLike("%李%");
        for (User us:userList
             ) {
            System.out.println(us);
        }
        sqlSession.close();
    }
    @Test
    public void test(){
        //获取sqlsession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try {


        //执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user:userList) {
            System.out.println(user);
        } } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭sqlsession
            sqlSession.close();
        }



    }
    @Test
    public void getUserByTd(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
        sqlSession.close();
    }

    @Test
    public void getUserById2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("id",2);
        map.put("name","李四");

      User us=  mapper.getUserById2(map);
        System.out.println(us);
        sqlSession.close();

    }

    @Test
    //增删改需要提交事务
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);


        mapper.addUser(new User(6,"思思","123123"));

       /* User user=new User();
        user.setId(6);
        user.setName("四四");
        user.setPwd("123456");
        mapper.addUser(user);*/

        //提交事务才能成功
        sqlSession.commit();

        sqlSession.close();
    }

    @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("userid",5);
        map.put("username","飒飒");
        map.put("userpwd","2223");
        mapper.addUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }

@Test
    public void updateUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    mapper.updateUser(new User(4,"嘶嘶","123456"));

    sqlSession.commit();
    sqlSession.close();

}


    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUser(6);

        sqlSession.commit();
        sqlSession.close();
    }

注:没写完一个mapper都要到mabatis.xml中注册

 <!--每一个mapper.xml都需要mybatis核心配置文件中注册!-->
    <mappers>
            <mapper resource="com/web/mapper/UserMapper.xml"/>
        <!--通过class注册-->
        <!--接口和xml必须同名  都在同一目录下-->
        <!--<mapper class="com.web.mapper.UserMapper"></mapper>-->
        <!--使用包扫描注册-->
        <!--接口和xml必须同名  都在同一目录下-->
       <!-- <package name="com.web.mapper"/>-->
    </mappers>
<mapper namespace="com.web.dao.UserMapper">
namespace绑定一个对应的mapper接口
<select id="getUserById" parameterType="int" resultType="com.web.pojo.User">
id:绑定的方法名跟接口中的一致 
parameterType:传入参数类型
resultType:返回类型为pojo的user(可以起别名直接写别名)
  <!--可以给实体类起别名-->
    <typeAliases>
        <package name="com.web.pojo"/>
    </typeAliases>

 resultMap:解决属性名和字段名不一致的问题


    //根据ID查询用户
    User getUserById(int id);

 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">
<!--namespace绑定一个对应的dao/mapper接口-->
<mapper namespace="com.web.mapper.UserMapper">

        <!--结果集映射-->
    <resultMap id="UserMap" type="User">
         <!--column数据库中的字段,  property实体类中的属性-->
      <!--  <result column="id" property="id"/>
        <result column="name" property="name"/>-->
        <result column="pwd" property="password"/>
    </resultMap>
        <!--解决属性名和字段名不一致的问题  resultMap-->
    <select id="getUserById"  resultMap="UserMap">
    select * from mybatis.user where id =#{id}
    </select>






</mapper>

开启DeBug(默认)

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
       
    </settings>

开启log4j

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/web.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d[{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

在mabatis中开启注:在MyBatis中存在配置顺序

 <settings>
       
        <setting name="logImpl" value="LOG4J"/>
    </settings>

使用注解开发(简单多了😄)

//注解开发

         @Select("select * from user")
          List<User> getUsers();


         @Select("select * from user where id=#{id}")
                            /*方法存在多个参数,所有参数前面必须加上 @Param("id")*/
        User getUserByID(@Param("id") int id,@Param("name") String name);

      @Insert("insert into user(id,name,pwd) values(#{id},#{name},#{password})")
        int addUser(User user);

      @Update("update user set name=#{name},pwd=#{password} where id=#{id}")
        int updateUser(User user);

      @Delete("delete from user where id=#{id}")
      int deleteUser(@Param("id") int id);

就不需要xml了(但是只能实现简单的sql语句)

多对一(需要两个实体类Student/Teacher)

@Date(lombok)依赖

  <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.16</version>

        </dependency>
    </dependencies>

student

@Data
public class Student {
    private int id;
    private String name;
    //学生需要关联一个老师
    private Teacher teacher;
}

teacher

@Data
public class Teacher {
    private int id;
    private String name;

}

接口StudengMapper

//多对一

    //查询所有学生信息以及对应老师信息


        // 按照查询嵌套处理
    List<Student> getStudent();
        //按照结果嵌套处理
    List<Student> getStudent2();

TeacherMapper

  @Select("select * from teacher where id =#{id}")
    Teacher getTeacher(@Param("id") int id);

有两种处理方式(按照查询嵌套处理和按照结果嵌套处理)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.web.mapper.StudentMapper">
     <!--查询所有学生信息
          根据查询出来的学生tid 寻找对应的老师

          按照查询嵌套处理-->
     <resultMap id="StudentTeacher" type="Student">
          <result property="id" column="id"/>
          <result property="name" column="name"/>
        <!--复杂属性需要单独处理  对象:association 集合:collection -->
          <association property="teacher" column="tid" javaType="Teacher"
          select="getTeacher"   />
     </resultMap>
     <select id="getStudent" resultMap="StudentTeacher">
        select * from student;

     </select>
     <select id="getTeacher" resultType="Teacher">
          select * from teacher where id=#{id}
     </select>
<!--=======================================================================-->
     <!--按照结果嵌套处理-->

     <select id="getStudent2" resultMap="StudentTeacher2">
          select s.id sid,s.name sname,t.name tname
          from student s,teacher t
           where s.tid=t.id
     </select>
     <resultMap id="StudentTeacher2" type="Student">
          <result property="id" column="sid"/>
          <result property="name" column="sname"/>
          <association property="teacher" javaType="Teacher">
               <result property="name" column="tname"/>
          </association>

     </resultMap>



</mapper>

一对多(TeacherMapper)

//一对多

    //获取所有老师
    List<Teacher> getTeacher();

    //获取指定老师下所有学生及老师信息
    Teacher getTeacher(@Param("tid") int id);

    //获取指定老师下所有学生及老师信息
    Teacher getTeacher2(@Param("tid") int id);

同样也有两种方式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.web.mapper.TeacherMapper">

    <!--按结果嵌套查询-->
    <select id="getTeacher" resultMap="TeacherStudent">
       select s.id sid,s.name sname,t.name tname,t.id tid
       from student s, teacher t
       where s.tid=t.id and t.id=#{tid};

   </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--集合用collection
        javaType="" 指定属性的类型
        集合中的泛型信息,我们使用ofType获取
        -->
       <collection property="students" ofType="Student">
           <result  property="id" column="sid"/>
           <result  property="name" column="sname"/>
           <result  property="tid" column="tid"/>
       </collection>
    </resultMap>

    <!--==========================================================================-->
        <!--按照查询嵌套处理-->
    <select id="getTeacher2" resultMap="TeacherStudent2">
            select * from teacher where id=#{tid}
        </select>

        <resultMap id="TeacherStudent2" type="Teacher">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
            <collection property="students" javaType="ArrayList" ofType="Student"
                        select="getStudentByTeacherId" column="id"/>





        </resultMap>
    <select id="getStudentByTeacherId" resultType="Student">
        select * from student where tid=#{tid}
    </select>
</mapper>

动态sql

/*
动态sql
 */

//插入数据
int addBlog(Blog blog);

//查询博客
List<Blog>queryBlogIF(Map map);

List<Blog>queryBlogIFChoose(Map map);

//更新博客
int updateBlog(Map map);

//查询第1-2-3号记录
List<Blog> queryBlogForeach(Map map);

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.web.mapper.BlogMapper">
        <insert id="addBlog" parameterType="blog">
             insert into mybatis.blog (id,title,author,create_time,views)
             values (#{id},#{title},#{author},#{createTime},#{views})
        </insert>

    <!--sql片段 可以引用-->
    <sql id="select">
         select * from mybatis.blog
    </sql>
            <!--if-->
    <select id="queryBlogIF" parameterType="map" resultType="blog">
       <include refid="select">

       </include>
        <where>
        <if test="title !=null">
             title=#{title}
        </if>
        <if test="author !=null">
            and author =#{author}
        </if>
        </where>
    </select>

  <!--(choose)如果when这两项都不成立走下面otherwise条件*/-->
    <select id="queryBlogIFChoose" parameterType="map" resultType="blog">
        select * from mybatis.blog
        <where>
            <choose>
                <when test="title !=null">
                    title=#{title}
                </when>
                <when test="author !=null">
                  and  author=#{author}
                </when>

                <otherwise>
                    and views=#{views}
                </otherwise>
            </choose>
        </where>
    </select>

    <!--set -->
    <update id="updateBlog" parameterType="map" >
        update mybatis.blog
        <set>
            <if test="title !=null">
                title=#{title},
            </if>
            <if test="author !=null">
                author=#{author}
            </if>
        </set>
        <where>
             id=#{id}
        </where>
    </update>

    <!--foreach-->
    <!--select * from blog where 1=1 and (id=1 or id=2 or id=3)-->
    <!-- 在collection中传一个map集合
    -->
    <select id="queryBlogForeach" parameterType="map" resultType="blog">
        select * from mybatis.blog
        <where>
            <foreach collection="ids" item="id" open="and (" close=")" separator="or">
                id=#{id}
            </foreach>
        </where>

    </select>


</mapper>

主要部分:if  choose    set    foreach where(MyBatis可以自己判断是否要加and等)

开启二级缓存(Mabatis自带一级缓存)

<?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>
     
        <setting name="logImpl" value="STDOUT_LOGGING"/>
      <!--  <setting name="logImpl" value="LOG4J"/>-->
        <!--使用全局缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
   
</configuration>

还需要在xml中开启

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.web.mapper.UserMapper">
    <!--在当前mapper.xml中开启二级缓存-->
    <cache eviction="FIFO"
           flushInterval="60000"
           size="521"
           readOnly="true"/>


</mapper>
举报

相关推荐

0 条评论