MyBatis使用説明とまとめ
MyBatisは文書を使用します
1、冒頭の二つの小さな知識点は、MyBatisのプロファイルに対して提示されていない解決策(dtd制約の導入):解凍ファイルを利用して ..logbackを利用して、コンソールでsqlログ を印刷する. MySQLデータベースリソースプロファイルdb.properties MyBatisグローバルプロファイル Src/test/javaディレクトリの下でJUnitテストクラスを確立し、Sql Session Factoryを取得し、 を使用してテストします. があります. にラッピングするかを指定する. sql文で一つのパラメータしか必要としない場合:mybatisは特殊な処理をしないので、パラメータ値 を取り出します. sql文に2つ以上のパラメータが必要な場合: MyBatis種類のsql文のマルチパラメータ処理時に、複数のパラメータを一つのmapにパッケージ化し、 である. MyBatisの2つの内蔵パラメータ である. . 一括挿入データ 従来の方式: を行う. MyBatisを利用した内蔵関数 MySQLを利用した内蔵関数 レベルアップ版ボケ照会
6.1シーン一:Employeeは一つのDepartmentに対応し、Employeeを検索しながら従業員の対応する部門を問い合わせる.は を表している.は、 を行う.は、 を表す.は、 を行う.データテーブルを作成します.useとroleは多対多の関係です.関連表t_を採用する必要があります.アメリカ.roleは、対応するエンティティクラス を確立する.は、UserMapperとRoleMapperのインターフェースを確立し、対応する方法 を定義する.は、対応するUserMpper.xmlを確立し、sql文 を定義する.は、対応するRoleMppaer.xmlを確立し、sql文 を定義する.多対多相関試験
1、冒頭の二つの小さな知識点
mybatis.jar
を開き、org.apache.ibatis.builder.xml
の中の2つのdtdファイルを解凍し、http://mybatis.org/dtd/mybatis-3-config.dtd
とhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
のように解凍されたdtdファイルを選択して、配置ファイルを再開すればいい // 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の簡単なテスト使用url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf-8&allowMultiQueries=true
driver=com.mysql.jdbc.Driver
username=root
password=root
"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" />
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
文に設定し、PreparedStatement
はsql
注入を防止する.${}
で取り出した値を直接綴じ合わせて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});
public void add(User user);
"addUser" useGeneratedKeys="true" keyProperty="id" >
insert into user(name,age) values(#{name},#{age})
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})
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]}
value: #{}
および_parameter
は、_databaseId
が全体パラメータを表し、sql法が単一パラメータを必要とするとき_parameter
がそのパラメータであり、複数のパラメータが必要となると、_parameter
、map
がこの_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のダイナミックSQLsql
、where
の使用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);
bind
public List testInnerParameter(String name);
_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を参照して多対多関連クエリ@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;
}
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);
}
"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">
"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();
}
}
}
}