1. <select>要素
<select>要素は、SQLのselectステートメントをマップするために使用されます。サンプルコードは次のとおりです。
<!-- 根据id查询用户 -->
<select id="findById" parameterType="Integer" resultType="com.day1.entity.User">
select * from t_user where id = #{id}
</select>
上記のサンプルコードでは、idの値は一意の識別子です。整数型のパラメータを受け取り、User型のオブジェクトを返します。結果セットは自動的にUser属性にマッピングされます。
上記のサンプルコードのいくつかの属性に加えて、次の表に示すように、<select>要素には一般的に使用される属性もいくつかあります。
属性名 | 描 述 |
---|---|
id | Mapper名前空間と組み合わせて使用され、MyBatisが呼び出す一意の識別子です。 |
parameterType | SQLステートメントで渡されるパラメータータイプの完全修飾名またはエイリアスを表します。これはオプションの属性であり、MyBatisは特定の着信ステートメントのパラメーターを推測できます |
resultType | SQLステートメントの実行後に返されるタイプ(完全修飾名またはエイリアス)。コレクションタイプの場合、コレクション要素のタイプが返され、returnのときにresultTypeまたはresultMapのいずれかを使用できます。 |
resultMap | これはマッピングセットへの参照であり、<resultMap>要素と一緒に使用されます。returnの場合、resultTypeまたはresultMapのいずれかを使用できます。 |
flushCache | これは、SQLステートメントの呼び出し後に以前に照会されたローカルキャッシュと第2レベルのキャッシュをクリアするためにMyBatisが必要かどうかを設定するために使用されます。デフォルト値はfalseです。trueに設定すると、ローカルキャッシュと第2レベルのキャッシュは次のようになります。 SQLステートメントが呼び出されるたびにクリアされます。 |
useCache | 第2レベルのキャッシュを開始するためのスイッチ。デフォルト値はtrueです。これは、クエリ結果が第2レベルのキャッシュに保存されることを意味します。 |
タイムアウト | タイムアウトパラメータを設定するために使用されます。単位は秒です。タイムアウトは例外をスローします |
fetchSize | レコードの総数設定を取得する |
statementType | 使用するJDBCステートメントをMyBatisに指示します。値は、STATEMENT(ステートメント)、PREPARED(PreparedStatement)、CALLABLE(CallableStatement)です。 |
resultSetType | これはJDBCのResultSetインターフェース用であり、値はFORWARD_ONLY(順方向アクセスのみを許可)、SCROLL_SENSITIVE(双方向スクロール、ただし時間内に更新されない)、SCROLLJNSENSITIVE(双方向スクロール、タイムリーな更新)に設定できます。 |
しかし、実際の開発では、複数のパラメーターを渡す必要があるかもしれませんが、それをどのように達成するのですか?これは、Mapインターフェースの使用とJavaBeanの使用の2つの方法で実行できます。
方法1:Mapインターフェースを使用して、複数のパラメーターを渡します。
(1)データベーステーブルを作成し、データを挿入します
CREATE TABLE `t_student` (
`username` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(20) DEFAULT NULL
);
insert into t_student values("tom", 23 ,"陕西");
insert into t_student values("王刚", 43,"安徽");
insert into t_student values("张伟", 43 ,"北京");
insert into t_student values("刘倩", 19,"北京");
insert into t_student values("陆风", 21,"上海");
insert into t_student values("齐菲", 56,"河北");
insert into t_student values("王可", 56,"河南");
(2)Studentクラスを作成します
public class Student {
private String username;
private Integer age;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
(3)IStudentDaoを作成します
public interface IStudentDao {
List<Student> findStudent(Map<String, Object> map);
}
(4)studentMapper.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">
<!--namespace:指定了唯一的命名空间-->
<mapper namespace="com.day1.dao.IStudentDao">
<!-- 查找年龄大于30且名字开头为张的学生 -->
<select id="findStudent" resultType="com.day1.entity.Student">
select * from t_student where age > #{age} and username like #{nstart};
</select>
</mapper>
(5)SqlMapperConfig.xmlでマッピング構成ファイルを指定します
<mapper resource="com/day1/studentMapper.xml"></mapper>
(6)テスト。
@Test
public void testFindStudent() throws IOException {
//1、读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2、创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3、使用工厂生产SqlSession对象
SqlSession sqlSession = factory.openSession();
//4、使用SqlSession创建dao接口的代理对象
IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
//5、使用代理对象执行方案
Map<String, Object> map = new HashMap<>();
map.put("age", 30);
map.put("nstart","张%");
List<Student> students = studentDao.findStudent(map);
for(Student stu : students){
System.out.println(stu);
}
//6、释放资源
sqlSession.close();
in.close();
}
方法2:JavaBeanを使用して複数のパラメーターを渡す
(1)IStudentDao addメソッドfindStudentNewWay();
List<Student> findStudentNewWay(Student student);
(2)studentMapper.xmlにクエリステートメントを追加します。
<select id="findStudentNewWay" resultType="com.day1.entity.Student" parameterType="com.day1.entity.Student">
select * from t_student where age > #{age} and username like #{username};
</select>
(3)テストを実行します。
@Test
public void testFindStudent2() throws IOException {
//1、读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2、创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3、使用工厂生产SqlSession对象
SqlSession sqlSession = factory.openSession();
//4、使用SqlSession创建dao接口的代理对象
IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
//5、使用代理对象执行方案
Student student = new Student();
student.setAge(30);
student.setUsername("张%");
List<Student> students = studentDao.findStudentNewWay(student);
for(Student stu : students){
System.out.println(stu);
}
//6、释放资源
sqlSession.close();
in.close();
}
推奨事項:パラメーターが少ない場合は、マップを選択することをお勧めします。パラメーターが多い場合は、JavaBeanを選択することをお勧めします。
2. <挿入>要素
<insert>要素は、挿入ステートメントをマップするために使用されます。挿入ステートメントを実行した後、MyBatisは影響を受ける行数を示す整数を返します。その属性は<select>要素の属性とほとんど同じですが、次の固有の属性があります。
- keyProperty:このプロパティの機能は、挿入または更新操作の戻り値をPOクラスの特定のプロパティに割り当てることです。通常は、主キーに対応するプロパティに設定されます。共同主キーの場合、複数の値をカンマで区切ることができます。
- keyColumn:このプロパティは、どの列が主キーであるかを設定するために使用されます。主キー列がテーブルの最初の列でない場合に設定する必要があります。共同主キーの場合、複数の値をカンマで区切ることができます。
- useGeneratedKeys:この属性により、MyBatisはJDBCのgetGeneratedKeys()メソッドを使用して、MySQLやSQL Serverなどの自動インクリメントフィールドなど、データベースによって内部的に生成された主キーを取得します。デフォルト値はfalseです。
実際の開発で他のビジネスと関連付けるために主キーを使用する必要がある場合、それを完了するには2つの方法があります。1つ目はデータベーステーブルの自己インクリメント主キーを使用する方法、2つ目は<selectKeyを使用する方法です。 >主キーをカスタマイズして生成するMyBatisの要素。具体的な設定例のコードは次のとおりです。
<!-- 添加用户 -->
<insert id="addUser" parameterType="com.day1.entity.User">
<!--
keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性
keyColumn:数据库中的列名
order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序
resultType:指定 SELECTLAST_INSERT_ID() 的结果类型
-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into t_user(username, password) values(#{username}, #{password});
</insert>
上記のサンプルコードを実行する場合、最初に<selectKey>要素が実行され、カスタムステートメントを介してデータテーブルの主キーが設定され、次に挿入ステートメントが実行されます。
<selectKey>要素のkeyProperty属性は、新しい主キー値が返されるPOクラスの属性を指定します。
- order属性は、BEFOREまたはAFTERに設定できます。
- BEFOREは、最初に<selectKey>要素を実行してから、挿入ステートメントを実行することを意味します。
- AFTERは、最初に挿入ステートメントを実行してから、<selectKey>要素を実行することを意味します。
3. <update>および<delete>要素
<update>要素と<delete>要素は比較的単純です。それらの属性は<insert>要素と<select>要素の属性に似ています。また、実行後に整数を返し、データベースの行数が影響を受けました。構成例のコードは次のとおりです。
<!-- 删除用户 -->
<delete id="deleteById" parameterType="int">
delete from t_user where id = #{id}
</delete>
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.day1.entity.User">
update t_user set username =#{username}, password= #{password} where id = #{id}
</update>
4.SQL要素
sql要素タグは再利用可能なSQLコードフラグメントを定義するために使用されます。これを使用する場合は、include要素タグを使用して引用するだけで、最終的にSQLステートメントの再利用の目的を達成できます。同時に静的に(読み込みパラメーター)パラメーター化、異なる属性値は、含まれているインスタンスによって変化し、次のように使用されます。
<!-- 建立sql片段-->
<sql id="query_student">
<if test="username != null and username !=''">
and username like '%${username}%'
</if>
</sql>
<!-- 使用include引用sql片段-->
<select id="findStudentList" parameterType="com.day1.entity.Student" resultType="com.day1.entity.Student">
select * from t_student
<where>
<include refid="query_student"/>
</where>
</select>