この記事では、Mybatis マッピング ファイルについて詳しく説明します。必要な方は参考にしてください。
MyBatis の真のコアはマッピング ファイルです。これは非常に強力であるため、同じ機能を持つ JDBC コードと比較すると、コードのほぼ 95% が節約されていることがわかります。
MyBatis エンティティ クラス マッピング ファイル
MyBatis にはいくつかのトップレベル要素があります
select: マッピング クエリ ステートメント
<select id="findAll" resultType="com.simple.mybatis.entitys.Employee"> select * from tal_employee </select>
insert: マッピング挿入ステートメント
#{パラメータ属性名}を使用して値を割り当てます
<insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee"> insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert>
:マッピング変更文
<update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee"> update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id} </update>
:マッピング削除文
<delete id="deleteEmp" parameterType="Integer"> delete from tal_employee where id=#{id} </delete>
:再利用可能なSQL文他の SQL ステートメント。
: これは最も複雑かつ強力な要素であり、データベース テーブルとエンティティ クラスをマップするために使用されます。
<resultMap type="com.simple.mybatis.entitys.Employee" id="Employee"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/></resultMap><!-- 返回外部resultMap格式的类型。--> <select id="findAll" resultMap="Employee"> select id,last_name AS lastName,email,gender from tal_employee </select>
: 指定された名前空間のキャッシュ構成。
: 他の名前空間キャッシュ構成への参照。
第 1 章を結合し、データベースと対話する前述の方法を使用します:
sqlSession.selectList("命名空间.select标签ID"); sqlSession.selectOne("命名空间.select标签ID"); sqlSession.update("命名空间.update标签ID", "Object类型参数"); sqlSession.delete("命名空间.delete标签ID", "Object类型参数"); sqlSession.insert("命名空间.insert标签ID", "Object类型参数");
追加、削除、変更はトランザクションを送信する必要があります: sqlSession.commit();
Use XMLマッピングファイルメソッドを使用してメソッドを実行する場合、文字列を通じてメソッドを呼び出すため、型制約が必須ではなく、可読性が低い初期のibatisの呼び出しメソッドでした。さらに、Mybatis は、他の 2 つの実装メソッドも提供します。
MyBatis アノテーション メソッド
1. @Select: クエリ ステートメントの使用方法を変更するために使用されます
2.@Insert :ステートメントの追加方法を変更するために使用されます。
3、@Update: 変更方法を変更するために使用されます。
4. @Delete: delete ステートメントの使用方法を変更するために使用されます。
パブリック インターフェイス EmployeeAnnotation {
@Select("select id,last_name AS lastName,email,gender from tal_employee")
List
@Insert("insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})") int saveEmp(Employee employee); @Update("update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id}") boolean updateEmp(Employee employee); @Delete("elete from tal_employee where id=#{id}") long deleteEmp(Integer id); }
次に、mybatis メインを設定する必要があります。構成ファイル この注釈インターフェイスのマッピング
<!-- 映射注解类 --> <mapper class="com.simple.mybatis.dao.EmployeeAnnotation"/> @Test public void testAnnotation(){ SqlSession session = sqlSessionFactory.openSession(); EmployeeAnnotation employeeAnnotation = session.getMapper(EmployeeAnnotation.class); Employee employee = new Employee("测试注解增加", "email", "男"); employeeAnnotation.saveEmp(employee); //提交事务 session.commit(); session.close(); }
注釈を使用すると便利ですが、複雑な SQL ステートメントを構成するのはより複雑です。したがって、2 つの方法を組み合わせて使用することがよくあります。
Mybatis インターフェイス プログラミング
最初にインターフェイスを追加します
public interface EmployeeMapper { List<Employee> findAll(); int saveEmp(Employee employee); boolean updateEmp(Employee employee); long deleteEmp(Integer id); }
エンティティ クラス マッピング ファイルの名前空間 (ネームスペース) はインターフェイスの完全名に対応する必要があり、内部のメソッドはその中の追加に対応する必要があります バインディングを完了するにはタグ ID を削除して変更します
<?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.simple.mybatis.dao.EmployeeMapper"> <resultMap type="com.simple.mybatis.entitys.Employee" id="Employee"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> </resultMap> <!-- 返回外部resultMap格式的类型。--> <select id="findAll" resultMap="Employee"> select id,last_name AS lastName,email,gender from tal_employee </select> <insert id="saveEmp" parameterType="com.simple.mybatis.entitys.Employee"> insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert> <update id="updateEmp" parameterType="com.simple.mybatis.entitys.Employee"> update tal_employee set last_name=#{lastName},email=#{email},gender=#{gender} where id=#{id} </update> <delete id="deleteEmp" parameterType="Integer"> delete from tal_employee where id=#{id} </delete> </mapper>
そしてこのマッピング ファイルは MyBatis メイン設定ファイルにロードする必要があります
<mappers> <mapper resource="com/simple/mybatis/entitys/EmployeeMapper.xml" /> </mappers>
Usage:
@Test public void test4(){ SqlSession session = sqlSessionFactory.openSession(); //获取接口。这个接口mybatis会帮我创建代理实现类完成接口与XML映射的绑定 EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); employeeMapper.deleteEmp(1); session.commit(); session.close(); }
挿入後に自動的に増加する主キーを取得する
##useGeneratedKeys パラメーターは、insert ステートメントに対してのみ有効で、デフォルトは false です。 true に設定すると、挿入されたテーブルに主キーとして自動インクリメント列がある場合、JDBC で主キーの自動生成のサポートが許可され、自動生成された主キーを返すことができることを意味します。 keyProperty は、parameterType="com.simple.mybatis.entitys.Employee<insert id="saveEmpGetKey" parameterType="com.simple.mybatis.entitys.Employee" useGeneratedKeys="true" keyProperty="id" > insert into tal_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert> @Test public void saveEmpGetKey(){ SqlSession session = sqlSessionFactory.openSession(); EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class); Employee employee = new Employee("自动封装主键", "email", "男");//增加之前主键没赋值 employeeMapper.saveEmpGetKey(employee); session.commit();//提交事务 System.out.println("增加后主键有值: " + employee.getId()); session.close();//关闭资源 }Mybatis パラメータ ルールパラメータが使用される場合:
の主キー ID 属性名にカプセル化されます。
directly #{xxx} を使用してパラメータにアクセスします。たとえば、#{a}、#{b} がコレクション (Collection、List、Set) 型の場合は、小文字を使用します。 必要なインターフェイス メソッド:long deleteEmp(Integer emp);マッピング ファイル:
<delete id="deleteEmp" parameterType="Integer"> delete from tal_employee where id=#{id} </delete>ここで、これに値が割り当てられていないことがわかります。 , #{id} 私の属性名も id ではなく emp と呼ばれます。したがって、パラメータは受信コレクション型であれば任意の名前を付けることができます。Map パラメータに渡すときの値:
//接口有方法:long deleteEmp(Map<String, Object> map); <delete id="deleteEmp" parameterType="Map"> delete from tal_employee where id=#{empID} </delete>ここでの値は empID です。これについて考えてみると、map.put("empID", 1) をパラメータとして作成し、それをメソッド呼び出しに渡すことができることがわかります。複数のパラメータがある場合: デフォルト: #{xxx} を使用してパラメータにアクセスすることはできません。複数のパラメータがある場合、mybatis はパラメータをマップ コレクションにカプセル化します。値は #{subscript} または #{paramN} を通じてのみ取得できます。
名前付きパラメータ: カプセル化パラメータを明示的に指定する場合は、パラメータ名を @Param を追加して指定します。
Entity クラス: 複数のパラメータがカプセル化されたビジネス クラスの場合、#{プロパティ名} を通じて属性を取得できます。カプセル化されたビジネス クラスではない場合は、 #{key} と ${}##エンティティ オブジェクトとリスト コレクションを返す場合、resultType をエンティティ タイプに設定できます。
単一のオブジェクトが返される場合は、それをエンティティ タイプに設定することもできます。 Map
Mapbfb6431144afb6dca75c307d25533a56 などの Map コレクション オブジェクトが返された場合、resultType は Student タイプに設定され、Map に配置されたキー値は@MapKey("id") アノテーション 。
ResultMap标签介绍
ResultMap的常用子标签
id:映射主键。result:映射普通列。
association:复杂结果映射。
collection:复杂类型的集合映射。
constructor:构造函数注入。
前面我们的案例我们数据库的字段与实体类的属性基本上一致,或者不一致使用取别名方案解决,可是每条语句都去取别名是非常麻烦的,ResultMap这个标签就很好的解决数据库与实体类字段不对应的问题
我们新创建一个部门表:
CREATE TABLE tal_dept( d_id INT PRIMARY KEY AUTO_INCREMENT, d_name VARCHAR(50) );
对应实体类:
public class Dept { private Integer id; private Integer name; }
如果我们查询语句直接使用resultType="com.simple.mybatis.entitys.Dept那么毫无疑问我们的实体类中名字不对应是赋值为null的,我们可以ResultMap映射实体类与数据库的对应关系
<!--配置返回结果,配置数据库字段与类属性的映射--> <resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> </resultMap> <!--使用resultMap使用指向上面返回结果的ID--> <select id="getDeptOne" parameterType="Integer" resultMap="DeptResult"> select * from tal_dept where d_id = #{id} </select>
关系映射
在数据库中,许多数据是分布在多个表中的,有时候需要将多个表的数据关联起来进行查询。那么在ORM框架中,我们需要处理数据表的映射关系。
常见的映射关系:
关联属性映射association
映射collection映射
result方式映射属性
这种方式并不推荐,没有什么重用性
<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> <!-- 指定Employee中Dept对象属性 --> <result property="dept.id" column="d_id"/> <result property="dept.name" column="d_name"/> </resultMap> <select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept"> select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id </select>
association映射(分步查询)
多对一,查询员工获取员工中的部门:
<resultMap type="com.simple.mybatis.entitys.Employee" id="EmployeeOrDept"> <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> <!-- property指定实体类中对象dept 指定发过去的参数column="d_id" select指定com.simple.mybatis.dao.DeptMapper映射文件中getDeptOne查询方法 --> <association property="dept" column="d_id" select="com.simple.mybatis.dao.DeptMapper.getDeptOne"></association> </resultMap> <!--resultMap指定使用上面定义的返回结果--> <select id="getEmployeeOrDeptAll" resultMap="EmployeeOrDept"> select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id </select>
Collection查询
一对多,获取部门同时部门中员工也获取:
<!--部门映射--> <resultMap type="com.simple.mybatis.entitys.Dept" id="DeptResult"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> <!--property指定Dept中集合属性名 ofType指定集合中属性类型 --> <collection property="Employees" ofType="com.simple.mybatis.entitys.Employee" > <id property="id" column="id"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> </collection> </resultMap> <select id="getDeptAll" resultMap="DeptResult"> select * from tal_dept d left join tal_Employee e on d.d_id = e.d_id </select>
Collection嵌套查询
一对多分布查询
<resultMap type="com.simple.mybatis.entitys.Dept" id="DeptOrEmployee"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> <!--select指定com.simple.mybatis.dao.EmployeeMapper映射文件中的getEmployeeByDeptId--> <collection property="Employees" column="d_id" ofType="com.simple.mybatis.entitys.Employee" select="com.simple.mybatis.dao.EmployeeMapper.getEmployeeByDeptId"> </collection> </resultMap> <!--com.simple.mybatis.dao.EmployeeMapperXML中方法--> <select id="getEmployeeByDeptId" parameterType="Integer" resultType="com.simple.mybatis.entitys.Employee"> select * from tal_employee where d_id = #{id} </select>
关联查询和分步查询的区别:
关联查询一次将多个表的数据查询出来,分步查询通过多次查询获取查询结果。
配置文件不同,关联查询需要定义额外的映射,分步查询需要定义外键列,和查询的select方法。
关联查询不支持延迟加载,分步查询支持延迟加载。fetchType="lazy"
延迟加载
刚才分布查询是一次将结果查询出来,为了提高效率,mybatis还支持延迟加载技术,等需要用到对象时才进行查询。
在mybatis主配置文件中配置:
<!– 通过全局配置文件设置延迟加载--> <settings> <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
设置级联延迟加载
<!– 设置延迟加载属性--> <association fetchType="lazy"/>
以上がMybatisマッピングファイルの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。