mybatis入门

流程:(看官网开发文档),搭建环境,导入依赖,编写代码,测试

导入依赖包:mybatis和mysql-connector-java

注意maven中的build:

```xml
<!--防止在编译的时候,不导出java文件夹下的mapper.xml文件 -->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
```

编写mybatis工具类

    package 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;
    
    /**
     * @Author: nsk
     * @Description:
     * @Date: create in 2021/3/31 17:29
     */
    
    public class MybatisUtil {
        private static SqlSessionFactory sqlSessionFactory;
        static{
            try {
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //openSession参数为true,当创建session的时候,执行insert update delete将自动commit  开发尽量不用自动提交
        public static SqlSession getSession(){
            return sqlSessionFactory.openSession(true);
        }
    }

根据工具类编写配置文件

    <?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"/>
        <!--mybatis设置-->
        <settings>
            <!--文档官网查看功能解释https://mybatis.org/mybatis-3/zh/configuration.html#settings-->
            <setting name="mapUnderscoreToCamelCase" value="false"/>
            <!--日志打印,可设置别的日志,参考官网文档-->
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
        <!--可设置别名-->
        <typeAliases>
            <!--规定javaBean的别名,可在mapper.xml中直接使用别名-->
            <!-- <typeAlias type="pojo.User" alias="User"/>-->
            <!--自动扫描包,包下的javaBean自动设置别名,使用时使用类名的首字母小写即可,可用注解@Alis方式给Javabean起别名-->
            <package name="pojo"/>
        </typeAliases>
        <!--default使用id为development的environment,可修改为test-->
        <environments default="test">
            <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?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
            <environment id="test">
                <transactionManager type="JDBC"/>
                <!--数据源-->
                <dataSource type="POOLED">
                    <!--虽然引用了外部文件,但是还是可以使用property标签,若有相同的,优先使用外部文件-->
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    <!-- 每个Mapper.xml都需要在此配置文件中注册! -->
        <mappers>
            <!--法一-->
        <!--<mapper resource="dao/UserMapper.xml"/>-->
            <!--法二:注意此方式,一定要把mapper.xml和mapper接口放到一个包中且必须要同名!-->
        <!--<mapper class="dao.UserMapper"/>-->
            <!--法三:注意此方式,一定要把mapper.xml和mapper接口放到一个包中且必须要同名!-->
            <package name="dao"/>
        </mappers>
    </configuration>

根据编写的配置文件,编写外部配置文档db.properties和日志打印配置文件log4j.properties

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username=root
    password=123456
    ### 设置###
    log4j.rootLogger = debug,stdout,D,E
    
    ### 输出信息到控制抬 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ### 输出DEBUG 级别以上的日志到=./log/error.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = ./log/log.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ### 输出ERROR 级别以上的日志到=./log/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =./log/error.log 
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout

写实体类,接口类,mapper.xml

实体类
    package pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.apache.ibatis.type.Alias;
    
    /**
     * @Author: nsk
     * @Description:
     * @Date: create in 2021/3/31 18:25
     */
    //这里注释是在mybatis配置文件中设置typeAliases
    @Alias("user")
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
        private  int  id;
        private String name;
        private String password;
    }
编写接口类
   package dao;
   
   import pojo.User;
   
   import java.util.List;
   import java.util.Map;
   
   /**
    * @Author: nsk
    * @Description:
    * @Date: create in 2021/3/31 19:16
    */
   
   public interface UserMapper {
      List<User> getUsers();
      List<User> getUsersLike(String value);
      User getUserById(int id);
      int addUser(User user);
      int updateUser(User user);
      int deleteUser(int id);
      int addUsers(Map<String, Object> map);
      List<User> getUserByPage(Map<String,Object> map);
   }
编写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接口,namespace可以使用mybatis-config中的alis别名-->
    <mapper namespace="dao.UserMapper">
        <!-- 防止字段名和属性对不上法一,映射数据库某个字段和javaBean属性-->
        <!-- type使用user是因为mybatis-config.xml中开启了别名扫描包启用了注解方式的别名-->
        <!--column 要查询的表的表头,property是我们要返回的数据的属性名,此property需要跟javaBean中的属性名相同-->
        <resultMap id="UserMap" type="user">
            <result column="pwd" property="password" />
        </resultMap>
        <!--查询语句,id相当于dao的实现类中的方法名字,resultType返回的是什么对象-->
        <select id="getUsers" resultMap="UserMap">
             select * from user
        </select>
        <!-- 防止字段名和属性对不上法二,设置返回的内容 -->
        <!--
        <select id="getUsers" resultType="user">
             select id,name,pwd as password from user
        </select>
        -->
        <select id="getUsersLike" resultType="pojo.User" >
            select * from user where name like #{value}
        </select>
    
        <select id="getUserById" resultType="pojo.User" parameterType="int">
            select * from user where id = #{id}
        </select>
    
        <insert id="addUser" parameterType="pojo.User">
            insert into user value (#{id},#{name},#{pwd})
        </insert>
    
        <insert id="addUsers" parameterType="map">
            insert into user value (#{uid},#{uname},#{upwd})
        </insert>
    
        <update id="updateUser" parameterType="pojo.User">
            update user set name=#{name},pwd=#{pwd} where id = #{id};
        </update>
        <delete id="deleteUser" parameterType="int">
            delete from user where id = #{id}
        </delete>
        <!--分页查询-->
        <select id="getUserByPage" resultType="user" parameterType="map">
            select * from user limit #{beginIndex},#{pageSize}
        </select>
    
    
    </mapper>

测试

    package dao;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.log4j.Logger;
    import org.junit.Test;
    import pojo.User;
    import utils.MybatisUtil;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Author: nsk
     * @Description:
     * @Date: create in 2021/3/31 18:40
     */
    
    public class UserMapperTest {
        @Test
        public void test(){
            SqlSession sqlSession= MybatisUtil.getSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = mapper.getUsers();
            for (User u : users){
                System.out.println(u);
            }
            sqlSession.close();
        }
        @Test
        public void testLike(){
            SqlSession sqlSession= MybatisUtil.getSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = mapper.getUsersLike("%2%");
            for (User u : users){
                System.out.println(u);
            }
            sqlSession.close();
        }
        @Test
        public void test2(){
            SqlSession session = MybatisUtil.getSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            User userById = mapper.getUserById(1);
            System.out.println(userById);
    
            session.close();
        }
        @Test
        public void testInsert(){
            SqlSession session = MybatisUtil.getSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            User u = new User(4,"nsk","123546");
            int i=mapper.addUser(u) ;
            System.out.println(i);
            if (i>0) session.commit();
            session.close();
        }
        @Test
        public void testInsert2(){
            SqlSession session = MybatisUtil.getSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("uid",5);
            map.put("uname","nsk");
            map.put("upwd","213");
            map.put("uid",6);
            map.put("uname","nsk6");
            map.put("upwd","2136");
            int i=mapper.addUsers(map) ;
            System.out.println(i);
            if (i>0) session.commit();
            session.close();
            test();
        }
        @Test
        public void testUpdate(){
            SqlSession session = MybatisUtil.getSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            User u = new User(2,"nsk222","123546");
            int i=mapper.updateUser(u) ;
            System.out.println(i);
            if (i>0) session.commit();
            session.close();
            test();
        }
        @Test
        public void testDetele(){
            SqlSession session = MybatisUtil.getSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            int i=mapper.deleteUser(1) ;
            System.out.println(i);
            if (i>0) session.commit();
            session.close();
            test();
        }
    
        static Logger logger = Logger.getLogger(UserMapperTest.class);
        @Test
        public void testLog(){
            logger.debug("debug");
            logger.error("error");
            logger.info("info");
        }
        @Test
        public void TestPage(){
            SqlSession session = MybatisUtil.getSession();
            UserMapper mapper = session.getMapper(UserMapper.class);
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("beginIndex",0);
            map.put("pageSize",2);
            List<User> user=mapper.getUserByPage(map);
            for (User u : user)
            System.out.println(u);
            session.close();
            test();
        }
    }