基础

mybatis.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. <setting name="logImpl" value="LOG4J"/>
  8. </settings>
  9. <environments default="dev">
  10. <environment id="dev">
  11. <transactionManager type="JDBC"></transactionManager>
  12. <dataSource type="POOLED">
  13. <property name="driver" value="com.mysql.jdbc.Driver"/>
  14. <property name="url" value="jdbc:mysql://192.168.0.105:3306/test"/>
  15. <property name="username" value="root"/>
  16. <property name="password" value="q1q1q1"/>
  17. </dataSource>
  18. </environment>
  19. </environments>
  20. <mappers>
  21. <mapper resource="com/niliv/mapper/UserMapper.xml" />
  22. </mappers>
  23. </configuration>

mapper

<?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="com.niliv.mapper.UserMapper">
      <select id="selAll" resultType="com.niliv.pojo.Users">
          select * from users
      </select>
      <select id="selOne" resultType="com.niliv.pojo.Users">
          select * from users where userid='1'
      </select>
  </mapper>

三种查询

package com.niliv.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

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 org.junit.jupiter.api.Test;

import com.niliv.pojo.Users;

public class TestMyBatis {

    @Test
    public void testSelAll() throws IOException {

        InputStream is =  Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = factory.openSession();

        //查询不到返回空集合
        List<Users> list = session.selectList("com.niliv.mapper.UserMapper.selAll");
        for (Users users : list) {
            System.out.println(users.getUserid() + " " + users.getNickname());
        }

        session.close();
    }

    @Test
    public void testSelOne() throws IOException {

        InputStream is =  Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = factory.openSession();

        //查询不到返回空集合
        Users users = session.selectOne("com.niliv.mapper.UserMapper.selOne");

        System.out.println(users.getUserid()+" " + users.getNickname());
        session.close();
    }

    @Test
    public void testSelMap() throws IOException {

        InputStream is =  Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = factory.openSession();

        //查询不到返回空集合
        Map<String, Users> map = session.selectMap("com.niliv.mapper.UserMapper.selAll", "userid");
        Set<String> set = map.keySet();
        for (String k : set) {

            System.out.println(k+" "+map.get(k));
        }

        session.close();
    }
}

log4j

# Set root category priority to INFO and its only appender to CONSOLE.
 log4j.rootCategory=ERROR, CONSOLE
# log4j.rootCategory=DEBUG, CONSOLE, LOGFILE

# 单独设置SQL语句的级别为DEBUG
# 方法级别
# log4j.logger.com.niliv.mapper.UserMapper.selAll=DEBUG
#类级别
# log4j.logger.com.niliv.mapper.UserMapper=DEBUG
#包级别
log4j.logger.com.niliv.mapper=DEBUG

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m %d{yyyy-MM-dd HH:mm:ss}%n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l %d{yyyy-MM-dd HH:mm:ss}%n

使用日志 定义包 定义properties

<?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" />
      <settings>
          <setting name="logImpl" value="LOG4J"/>
      </settings>
      <typeAliases>
          <package name="com.niliv.pojo"/>
      </typeAliases>
      <environments default="dev">
          <environment id="dev">
              <transactionManager type="JDBC"></transactionManager>
              <dataSource type="POOLED">
                  <property name="driver" value="${jdbc.driver}"/>
                  <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
              </dataSource>
          </environment>
      </environments>
      <mappers>
          <mapper resource="com/niliv/mapper/UserMapper.xml" />
      </mappers>
  </configuration>
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://192.168.0.105:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8
jdbc.username = root
jdbc.password = q1q1q1

由于定义了包,所以mapper返回类型只用写Users可以识别

参数类型可以是对象,map,类型

参数一个 #{0} #{param1}

参数多个最好放入对象传入

<?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="com.niliv.mapper.UserMapper">
      <select id="selAll" resultType="Users">
          select * from users
      </select>
      <select id="selOne" resultType="Users">
          select * from users where userid='1'
      </select>
      <select id="selById" resultType="Users" parameterType="string">
          select * from users where userid=#{0}
      </select>
      <select id="sel" resultType="Users" parameterType="Users">
          select * from users where userid=#{userid} and nickname=#{nickname}
      </select>
      <select id="selMap" resultType="Users" parameterType="map">
          select * from users where userid=#{id} and nickname=#{name}
      </select>
      <insert id="insUser" parameterType="Users">
          insert into users values(#{userid},#{nickname},#{score},#{sex},#{createtime})
      </insert>
      <update id="updUser" parameterType="Users">
          update Users set nickname=#{nickname} where userid=#{userid}
      </update>
      <delete id="delUser" parameterType="string">
          delete from Users where userid=#{0}
      </delete>
  </mapper>
@Test
    public void testSelById() throws IOException {

        InputStream is =  Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = factory.openSession();

        //查询不到返回空集合
        Users users = session.selectOne("com.niliv.mapper.UserMapper.selById","2");

        System.out.println(users.getUserid()+" " + users.getNickname());
        session.close();
    }

    @Test
    public void testSel() throws IOException {

        InputStream is =  Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = factory.openSession();

        //多个参数 对象方式
//        Users u = new Users();
//        u.setUserid("2");
//        u.setNickname("aaw");
//        Users users = session.selectOne("com.niliv.mapper.UserMapper.sel",u);
        //map方式
        Map<String, String> map = new HashMap<String, String>();
        map.put("id", "2");
        map.put("name","aaw");

        Users users = session.selectOne("com.niliv.mapper.UserMapper.selMap",map);

        System.out.println(users.getUserid()+" " + users.getNickname());
        session.close();
    }

DML

封装UTIL

package com.niliv.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {

    private static SqlSessionFactory factory=null;

    static {

        try {
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    public static SqlSession getSession() {
        SqlSession session=null;
        if(factory!=null) {
            session = factory.openSession(true); //true 打开自动提交
        }
        return session;
    }
}
package com.niliv.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.niliv.pojo.Users;

public class TestMyBatisDQL {

    @Test
    public void testIns() {
        SqlSession session = MyBatisUtil.getSession();

        Users users = new Users();
        users.setUserid("1001");
        users.setNickname("ddd");
        users.setScore(196);
        users.setSex("男");
        users.setCreatetime("2018-02-01 00:00:00");

        int flag = session.insert("com.niliv.mapper.UserMapper.insUser", users);
        if(flag>0) {
            //session.commit();
            System.out.println("success!");
        }else {
            //session.rollback();
            System.out.println("fail!");
        }

        session.close();
    }

    @Test
    public void testUpd() {
        SqlSession session = MyBatisUtil.getSession();

        Users users = new Users();
        users.setUserid("1001");
        users.setNickname("ccc");


        int flag = session.update("com.niliv.mapper.UserMapper.updUser", users);
        if(flag>0) {
            System.out.println("success!");
        }else {
            System.out.println("fail!");
        }

        session.close();
    }

    @Test
    public void testDel() {
        SqlSession session = MyBatisUtil.getSession();


        int flag = session.delete("com.niliv.mapper.UserMapper.delUser", "1001");
        if(flag>0) {
            //session.commit();
            System.out.println("success!");
        }else {
            //session.rollback();
            System.out.println("fail!");
        }

        session.close();
    }
}

高级

接口绑定

建立mapper接口

public interface UserMapper {

    List<Users> selAll();
    //@Param注解让参数名字可以在xml中使用,如果不定义这个,xml参数要用0 1
    Users selByUN(@Param("userid")String userid, @Param("nickname")String nickname);
}

建立接口对应的mapper

<?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="com.niliv.mapper.UserMapper">
      <select id="selAll" resultType="Users">
          select * from users
      </select>
      <select id="selByUN" resultType="Users">
          select * from Users where userid=#{userid} and nickname=#{nickname}
      </select>
  </mapper>

让mybatis能扫描到接口

<?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" />
      <settings>
          <setting name="logImpl" value="LOG4J"/>
      </settings>
      <typeAliases>
          <package name="com.niliv.pojo"/>
      </typeAliases>
      <environments default="dev">
          <environment id="dev">
              <transactionManager type="JDBC"></transactionManager>
              <dataSource type="POOLED">
                  <property name="driver" value="${jdbc.driver}"/>
                  <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.niliv.mapper"/>
      </mappers>
  </configuration>

使用接口,解决session的执行函数不能传多个参数的问题,注意接口参数的格式

@Test
public void testBind() {
    SqlSession session = MyBatisUtil.getSession();

    UserMapper userMapper = session.getMapper(UserMapper.class);
    List<Users> list = userMapper.selAll();
    for (Users users : list) {
        System.out.println(users.getUserid() + " "+ users.getNickname());
    }


    session.close();
}

@Test
public void testSelParams() {
    SqlSession session = MyBatisUtil.getSession();

    UserMapper userMapper = session.getMapper(UserMapper.class);
    Users users = userMapper.selByUN("1000", "zzz");

    System.out.println(users.getUserid() + " "+ users.getNickname());



    session.close();
}

动态SQL

<?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="com.niliv.mapper.UserMapper">
      <!-- 复用的查询列 -->
      <sql id="users">
          userid,nickname,score
      </sql>
      <!-- 查询所有 -->
      <select id="selAll" resultType="Users">
          select 
          <include refid="users"></include>
           from users
      </select>
      <!-- 查询条件参数 -->
      <select id="selByUN" resultType="Users">
          select 
          <include refid="users"></include> 
          from Users where userid=#{userid} and nickname=#{nickname}
      </select>
      <!-- where自动去掉and if -->
      <select id="sel" resultType="Users">
          select 
          <include refid="users"></include> 
          from Users 
          <where>
              <if test="userid != null and userid!=''">
              and userid = #{userid}
              </if>
              <if test="nickname != null and nickname!=''">
                  and nickname = #{nickname}
              </if>
          </where>
      </select>
      <!-- choose 类似switch -->
      <select id="sel1" resultType="Users">
          select 
          <include refid="users"></include> 
          from Users 
          <where>
              <choose>
                  <when test="userid != null and userid!=''">
                      and userid = #{userid}
                  </when>
                  <when test="nickname != null and nickname!=''">
                      and nickname = #{nickname}
                  </when>
                  <otherwise>
                      and 1=1
                  </otherwise>
              </choose>
          </where>
      </select>
      <!-- bind 对参数操作 -->
      <select id="sel2" resultType="Users">
          select 
          <include refid="users"></include> 
          from Users 
          <where>
              <if test="nickname != null and nickname!=''">
                  <bind name="nickname" value="'%'+nickname+'%'"/>
                  and nickname like #{nickname}
              </if>
          </where>
      </select>
      <!-- foreach 转换集合成数组 -->
      <select id="selIn" parameterType="list" resultType="Users">
          select 
          <include refid="users"></include>
           from Users where score in 
          <foreach collection="list" open="(" separator="," close=")" item="item">
              #{item}
          </foreach>
      </select>
      <!-- set 类似于where -->
      <update id="updUser" parameterType="Users">
          update Users 
          <set>
              userid=#{userid},
              <if test="nickname != null and nickname!=''">
                  nickname=#{nickname},
              </if>
              <if test="score != null and score>=0">
                  score=#{score},
              </if>
              <if test="sex != null and sex!=''">
                  sex=#{sex},
              </if>
              <if test="createtime != null and createtime!=''">
                  createtime=#{createtime},
              </if>
          </set>
          where userid=#{userid}
      </update>
      <!-- trim -->
      <update id="updUserTrim" parameterType="Users">
          update Users 
          <trim prefix="set" prefixOverrides="" suffix="" suffixOverrides=",">
              nickname=#{nickname},
          </trim>
          where userid=#{userid}
      </update>
  </mapper>
List<Users> selAll();

//@Param注解让参数名字可以在xml中使用,如果不定义这个,xml参数要用0 1
Users selByUN(@Param("userid")String userid, @Param("nickname")String nickname);

//动态sql
//where if
List<Users> sel(@Param("userid")String userid, @Param("nickname")String nickname);
//choose
List<Users> sel1(@Param("userid")String userid, @Param("nickname")String nickname);
//bind
List<Users> sel2(@Param("userid")String userid, @Param("nickname")String nickname);
//foreach
List<Users> selIn(@Param("list")List<Integer> list);
//set
int updUser(Users users);
//trim
int updUserTrim(Users users);
@Test
public void testDynamicSql() {
    SqlSession session = MyBatisUtil.getSession();

    UserMapper userMapper = session.getMapper(UserMapper.class);
    //if类似and
    //List<Users> list = userMapper.sel("1000", "zzz");
    //choose 条件了类似或的关系,一个成立就不看后面
    //List<Users> list = userMapper.sel1("1000", "zzz");
    //like
    List<Users> list = userMapper.sel2("", "h");

    for (Users users : list) {
        System.out.println(users.getUserid() + " "+ users.getNickname());
    }



    session.close();
}

@Test
public void testDSUpd() {
    SqlSession session = MyBatisUtil.getSession();

    UserMapper userMapper = session.getMapper(UserMapper.class);
    Users users = new Users();
    users.setUserid("1000");
    users.setNickname("hhh");
    //        users.setScore(100);
    //        users.setSex("女");
    //        users.setCreatetime("2018-10-31 18:35:11");

    //int flag = userMapper.updUser(users);
    int flag = userMapper.updUserTrim(users);

    System.out.println(flag);



    session.close();
}

@Test
public void testSelIn() {
    SqlSession session = MyBatisUtil.getSession();

    UserMapper userMapper = session.getMapper(UserMapper.class);

    List<Integer> list = new ArrayList<Integer>();
    list.add(45);
    list.add(200);
    list.add(144);
    list.add(16);
    list.add(100);
    List<Users> users = userMapper.selIn(list);

    for (Users user : users) {
        System.out.println(user.getUserid() + " "+ user.getNickname()+ " " + user.getScore());
    }



        session.close();
    }

缓存

一级缓存:缓存到id,缓存到session

二级缓存:缓存到id,缓存到factory

 <mapper namespace="com.niliv.mapper.UserMapper">
     <!-- 实体类如果没有序列化,这里要加readOnly -->
      <cache readOnly="true" />   
      <select id="selAll" resultType="Users">
          select * from Users 
      </select>
  </mapper>

修改实体列名

  <mapper namespace="com.niliv.mapper.UserMapper">
      <resultMap type="Users" id="umap">
        <id column="userid" property="id" />
        <result column="nickname" property="name" />
        <result column="createtime" property="time" />
      </resultMap>
      <select id="selAll" resultMap="umap">
          select * from Users 
      </select>
  </mapper>
public class Users implements Serializable {

    private String id;
    private String name;
    private int score;
    private String sex;
    private String time;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    @Override
    public String toString() {
        return "Users [id=" + id + ", name=" + name + ", score=" + score + ", sex=" + sex + ", time=" + time + "]";
    }
}

多表查询

多表查询-业务装配

多表查询-多—对象

多表查询-多—对象-关联

多表查询-多—集合

多表查询-多—集合-关联

多表查询-多—集合-自动映射

注解

@Select("select * from t_student")
    List<Student> selAll();

@Insert("insert into t_student values(default,#{name},#{age},#{gender},#{cid})")
int insStu(Student student);

@Update("update t_student set age=#{1} where id=#{0}")
int updStu(int id, int age);

@Delete("delete from t_student where id=#{0}")
int delStu(int id);

@Select("select * from t_student")
@Results(value= {
    @Result(column="id",property="id",id=true),
    @Result(column="name",property="name"),
    @Result(column="age",property="age"),
    @Result(column="gender",property="gender"),
    @Result(column="cid",property="cid"),
        @Result(property="clazz",one=@One(select="com.niliv.mapper.ClazzMapper.selById"),column="cid")
    })
    List<Student> sel();

注解