MyBatis使用説明とまとめ


MyBatisは文書を使用します
1、冒頭の二つの小さな知識点
  • は、MyBatisのプロファイルに対して提示されていない解決策(dtd制約の導入):解凍ファイルを利用してmybatis.jarを開き、org.apache.ibatis.builder.xmlの中の2つのdtdファイルを解凍し、http://mybatis.org/dtd/mybatis-3-config.dtdhttp://mybatis.org/dtd/mybatis-3-mapper.dtdのように解凍されたdtdファイルを選択して、配置ファイルを再開すればいいMyBatis使用说明与总结_第1张图片
  • .
  • .logbackを利用して、コンソールでsqlログ
  • を印刷する.
    // pom.xml  logback    
    
        ch.qos.logback
        logback-classic
        1.2.3
        test
    
    
    // src/main/resources   ,  logback    
    "1.0" encoding="UTF-8"?>
    "http://ch.qos.logback/xml/ns/logback"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd">
    
        
        "STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
    
            
            "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:  %msg%n
            
        
    
        
        "com.security.dao" level="DEBUG" />
    
        "INFO">
            "STDOUT" />
        
    
    
    2、MyBatisの簡単なテスト使用
  • MySQLデータベースリソースプロファイルdb.properties
  • url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf-8&allowMultiQueries=true
    driver=com.mysql.jdbc.Driver
    username=root
    password=root
  • MyBatisグローバルプロファイル
  • "1.0" encoding="UTF-8" ?>
    span class="hljs-string">"-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    
        
        "db.properties">
    
        
            
            "mapUnderscoreToCamelCase" value="true" />
            
            "lazyLoadingEnabled" value="true" />
            
            "aggressiveLazyLoading" value="false" />
            
            "cacheEnabled" value="true" />
            
            "useGeneratedKeys" value="true" />
        
    
        
            
            <package name="com.security.model" />
        
    
        default="development">
            "development">
                "JDBC" />
                "POOLED">
                    "driver" value="${driver}" />
                    "url" value="${url}" />
                    "username" value="${username}" />
                    "password" value="${password}" />
                
            
        
    
        
            
            <package name="com.security.dao" />
            
            
        
    
    
  • Src/test/javaディレクトリの下でJUnitテストクラスを確立し、Sql Session Factoryを取得し、
  • を使用してテストします.
    public class MyBatisTest {
    
        private SqlSessionFactory sqlSessionFactory;
    
        /**
         *   SqlSessionFactory
         */
        @Before
        public void getSessionFactory(){
            String resource = "mybatis-config.xml";
            try {
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         *   UserMapper
         */
        @Test
        public void testUserMapper() {
            SqlSession session=sqlSessionFactory.openSession();
            UserMapper userMapper=session.getMapper(UserMapper.class);
            User user=userMapper.findEntityById(1);
            System.out.println(user);
        }
    }
    
    3、MyBatisパラメータ処理
  • #{}${}の違い:#{}はプリコンパイルされた形でパラメータをsql文に設定し、PreparedStatementsql注入を防止する.${}で取り出した値を直接綴じ合わせてsql文で安全問題が発生する可能性があります.多くの場合、#{}を使用することを提案しています.特定の場合を除いて、例えば、定義結果の順序order by ${}
  • があります.
    public List getEmployeeOrderBy(@Param("name")String name);
    
    
    //sql   :select * from Employee order by id desc; 
    
    
    //sql   :select * from Employee order by ? desc; 
  • Insert文を使用すると、メインキーは自己成長します.mysqlは自己増加キーの値を取得するには、insert方法で2つの属性を利用する必要があります.useGeneratedKeys="true"は、対応するプライマリキー属性、すなわちmybatisをプライマリキー値に取得した後、この値をJavaBeanのどの属性
  • にラッピングするかを指定する.
    "addEmployee" parameterType="employee"
        useGeneratedKeys="true"  keyProperty="id">
        insert into employee(name,gender,email) values(#{name},#{gender},#{email});
    
  • sql文で一つのパラメータしか必要としない場合:mybatisは特殊な処理をしないので、パラメータ値
  • を取り出します.
    public void add(User user);
    
    
    "addUser" useGeneratedKeys="true" keyProperty="id" >
        insert into user(name,age) values(#{name},#{age})
    
  • sql文に2つ以上のパラメータが必要な場合:
  • public void addByUserAndAge(String name,int age);
    
    "addByUserAndAge">
        insert into user(name,age) values(#{0},#{1})
    
    
    Or
    "addByUserAndAge">
        insert into user(name,age) values(#{param1},#{param2})
    
    
    Or         :
    public void addByUserAndAge(@Param("name")String name,@Param("age")int age);
    
    "addByUserAndAge">
        insert into user(name,age) values(#{name},#{age})
    
  • MyBatis種類のsql文のマルチパラメータ処理時に、複数のパラメータを一つのmapにパッケージ化し、keyProperty、またはパラメータのインデックスにしても良いです.key:param1...paramNは、mapから指定されたkeyを取得する値
  • である.
    public User getUserByMap(Map map);
    
    
    
      :Map map=new HashMap<>();
        map.put("id",1);
        map.put("name","  ");
        System.out.println(mapper.getUserByMap(map));
    
    ---------------------------------------------------------------------------
    ②public Employee getEmp(@Param("id")Integer id,String lastName);
       :id==>#{id/param1}   lastName==>#{param2}
    
    
    ------------------------------------------------------------------------
    ③public Employee getEmp(Integer id,@Param("e")Employee emp);
      :id==>#{param1}    lastName===>#{param2.lastName/e.lastName}
    
    ----------------------------------------------------------------
    ④##    :   Collection(List、Set)       ,      。      list       map 。
        key:Collection(collection),   List       key(list)
          (array)
    public Employee getEmpById(List ids);
      :     id  : #{list[0]}
  • MyBatisの2つの内蔵パラメータvalue: #{}および_parameterは、_databaseIdが全体パラメータを表し、sql法が単一パラメータを必要とするとき_parameterがそのパラメータであり、複数のパラメータが必要となると、_parametermapがこの_parameterを表しています.map:_databaseIdタグが配置されている場合、databaseIdProviderは現在のデータベースを表す別名
  • である.
    public List getUsersWithParameter(String name);
    
    
    
    ----------------------------------------------------------------------
    
    public List getUsersWithParameterBean(Map map);
    
    
  • _databaseIdおよびbindタグの使用:sqlは、ONL表現の値を変数に結び付けることができ、その後にこの変数の値を参照するのに便利である.bindは、再利用可能なフラグメントを抽出するために使用され、後期参照を容易にし、sqlは抽出されたincludeフラグメントを参照するために使用される
  • .
    public List getUsersWithBinds(@Param("name")String name);
    
    "selectuser" >
        select id,name,age from user
    
    
    
    4、MyBatisのダイナミックSQL
  • sqlwhereの使用
  • public List getUserByConditionIf(User user);
    
    
  • ifの使用
  • public List getUserByConditionTrim(User user);
    
    
    
     
    
    
  • trimの使用
  • public void updateEmp(User user);
    
    "updateEmp">
        update user
        
            <if test="name!=null and !name.equals("")">
                name=#{name},
            if>
            <if test="age!=null">
                age=#{age}
            if>
        
        
            id=#{id}
        
    
  • setの使用
  • public List getUserByConditionForeach(List list);
    
    
  • 一括挿入データ
  • public void addByBatch(List list);
    
    "addByBatch">
        insert into user(name,age,did) values
        "list" item="u" separator=",">
            (#{u.name},#{u.age},#{u.department.id})
        
    
    
    ---------------------------------------------------------------------------------------
       :
    
    
    "saveEmployeeWithForEach" >
       "list" item="emp">
           insert into employee(name,gender,email,d_id) values(#{emp.name},#{emp.gender},#{emp.email},#{emp.dept.id});
       
    
    5、MyBatisのあいまいなクエリ
  • 従来の方式:foreachを利用してデータバインディング
  • を行う.
    public List getEmployeesWithNameLike(@Param("name")String name);
    
    
  • MyBatisを利用した内蔵関数bind
  • public List testInnerParameter(String name);
    
    
  • MySQLを利用した内蔵関数_parameter
  • public List getEmployeesWithNameLike(@Param("name")String name);
        select * from employee
        
            <if test="name!=null">
                name like concat('%',#{name},'%')
            if>
        
    
  • レベルアップ版ボケ照会
  • public List getEmployeeWithUncertainQuery(String query);
    
    
    6、MyBatisの連結クエリ
    6.1シーン一:Employeeは一つのDepartmentに対応し、Employeeを検索しながら従業員の対応する部門を問い合わせる.
  • concat(str1,str2,…)を用いてワンステップクエリを行い、associationは一対の関係
  • を表している.
    
    "com.security.ben.Employee" id="MyEmp1">
        "id" property="id" />
        
        "name" property="name" />
        "gender" property="gender" />
        "email" property="email" />
        "dept" javaType="com.security.ben.Department">
            "id" property="id" />
            
            "deptName" property="deptName" />
        
    
    
    
  • は、associationを用いて分布クエリ
  • を行う.
    
    
    "com.security.ben.Employee" id="MyEmp2">
        "id" property="id" />
        
        "name" property="name" />
        "gender" property="gender" />
        "email" property="email" />
        
        "dept" column="d_id"     select="com.security.mapper.DepartmentMapper.getDeptById">
        
    
    
    
    
    6.2シーンその2:一つのDepartmentは複数のEmployeeに対応しています.部門情報を検索する時、それに対応する全ての従業員情報も調べられます.
  • は、associationシングルステップクエリを使用して、collectionは、一対の多関係
  • を表す.
    
    "com.security.ben.Department" id="SimpleDept">
        "id" property="id"/>
        "deptName" property="deptName"/>
        "emps" ofType="com.security.ben.Employee">
            "eid" property="id"/>
            "name" property="name"/>
            "email" property="email"/>
            "gender" property="gender"/>
        
    
    
    
    
  • は、collectionを使用してステッピングクエリ
  • を行う.
    
    "com.security.ben.Department" id="DifDept">
       "id" property="id"/>
       "deptName" property="deptName"/>
       "emps" select="com.security.mapper.EmployeeMapperPlus.getEmpsByDeptId" column="id"  fetchType="lazy">
    
    
    
    
    
    
    
    6.3シーン3:ユーザーとキャラクターは多対多関連関係に属し、MyBatisを参照して多対多関連クエリ
  • データテーブルを作成します.useとroleは多対多の関係です.関連表t_を採用する必要があります.アメリカ.roleは、対応するエンティティクラス
  • を確立する.
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class User implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private Integer id;
    
        private String name;
    
        private String email;
    
        private List roles;
    }
    
    
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class Role {
    
        private Integer id;
        private String name;
        private List users;
    
    }
  • は、UserMapperとRoleMapperのインターフェースを確立し、対応する方法
  • を定義する.
    public interface UserMapper {
    
        public User findUserById(Integer id);
    
        public List findUserByRoleId(Integer roleId);
    
    }
    
    public interface RoleMapper {
    
        public Role findRoleById(Integer id);
    
        public List findRoleByUserId(Integer userId);
    
    }
  • は、対応するUserMpper.xmlを確立し、sql文
  • を定義する.
    "1.0" encoding="UTF-8"?>
    span class="hljs-string">"-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    "com.security.dao.UserMapper">
    
        "userMapper" type="user">
            "id" property="id" />
            "name" property="name" />
            "email" property="email" />
            "roles" column="id"
                select="com.security.dao.RoleMapper.findRoleByUserId">
        
    
        
    
        
    
        
    
    
  • は、対応するRoleMppaer.xmlを確立し、sql文
  • を定義する.
    "1.0" encoding="UTF-8"?>
    span class="hljs-string">"-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    "com.security.dao.RoleMapper">
    
        "roleMapper" type="role">
            "id" property="id" />
            "name" property="name" />
            "users" column="id"
                select="com.security.dao.UserMapper.findUserByRoleId">
        
    
        
    
        
    
        
    
    
  • 多対多相関試験
  • public class MoreToMoreTest {
    
        private SqlSessionFactory sqlSessionFactory;
    
        /**
         *   SqlSessionFactory
         */
        @Before
        public void getSessionFactory() {
            String resource = "mybatis-config.xml";
            try {
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void testMoreToMore() {
            SqlSession session = sqlSessionFactory.openSession();
            try {
                /*RoleMapper roleMapper =      session.getMapper(RoleMapper.class);
                Role role = roleMapper.findRoleById(1);
                System.out.println(role);*/
                UserMapper userMapper=session.getMapper(UserMapper.class);
                User user=userMapper.findUserById(2);
                System.out.println(user);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (session != null) {
                    session.close();
                }
            }
        }
    }