mybatis學習筆記(可複用的相關配置資訊)
阿新 • • 發佈:2021-11-22
結果集對映:
resultMap解決資料庫欄位名和屬性名不一致的問題
id name pwd
id name password
column 是資料庫的欄位名 property 是實體類的屬性名
<?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.kuang.dao.UserMapper"> <!--結果集對映 --> <resultMap id="UserMap" type="User"> <result column="id" property="id"></result> <result column="name" property="name"></result> <result column="pwd" property="password"></result> </resultMap> <select id="getUserByID" resultMap="UserMap" parameterType="int"> select * from user WHERE id = #{id} </select> </mapper>
動態SQL
-
什麼是動態SQL?
根據不同的條件生成不同的SQL語句
官網描述: MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記新增必要的空格,還要注意去掉列表最後一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。 雖然在以前使用動態 SQL 並非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 對映語句中的強大的動態 SQL 語言得以改進這種情形。 動態 SQL 元素和 JSTL 或基於類似 XML 的文字處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間瞭解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 採用功能強大的基於 OGNL 的表示式來淘汰其它大部分元素。 ------------------------------- - if - choose (when, otherwise) - trim (where, set) - foreach -------------------------------
MybatisUtils工具類
package com.kuang.utils; 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 java.io.IOException; import java.io.InputStream; public class MybatisUtils { //從SqlSessionFactory中獲得SqlSession的例項,SqlSession完全包含了SQL命令的執行方法 private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; //SqlSessionFactoryBuilder去建立sqlSessionFactory 建立完就不再需要它了 //sqlSessionFactory 可以理解為資料庫連線池 //sqlSessionFactory 建立 sqlSession InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //獲取SqlSession連線 public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } }
mybatis-config.xml
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="000429"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper resource="com/kuang/dao/userMapper.xml"/>-->
<!--
使用對映器介面實現類的完全限定類名
需要配置檔名稱和介面名稱一致,並且位於同一目錄下
-->
<!--<mapper class="com.kuang.dao.UserMapper"/>-->
<!--
將包內的對映器介面實現全部註冊為對映器
但是需要配置檔名稱和介面名稱一致,並且位於同一目錄下
-->
<package name="com.kuang.dao"/>
</mappers>
</configuration>
測試類
@Test
public void test(){
//sqlSession物件相當於是一個JDBC的PreparedStatement物件,這個物件可以執行sql語句
//我們現在做的事情就是:獲取資料庫連線,得到sqlSession物件,通過這個物件去實現我們定義的資料操作介面
//UserMapper,這個介面再通過解析我們定義的userMapper.xml檔案去執行帶有SQL語句的特定方法。
SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//根據ID取
User user=mapper.getUserByID(2);
System.out.println(user);
sqlSession.close();
//更新一條資料 id為1
// updateUser();
//刪除一個使用者
// deleteUser();
}
目錄結構
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=000429
在mybatis-config.xml中
<!--匯入properties檔案-->
<properties resource="db.properties"/>
log4j.properties
#將等級為DEBUG的日誌資訊輸出到console和file這兩個目的地,console和file的定義在下面的程式碼
log4j.rootLogger=DEBUG,console,file
#控制檯輸出的相關設定
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#檔案輸出的相關設定
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日誌輸出級別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
在mybatis-config.xml中
<!--日誌-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
多對一
<?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.StudentMapper">
<select id="getStudent" resultMap="studentTeacher">
select * from mybatis.student
</select>
<resultMap id="studentTeacher" type="student">
<result property="id" column="id"></result>
<result property="name" column="name"></result>
<!--
物件用association 多對一
集合用collection 一對多
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id=#{id};
</select>
<!--
按照結果巢狀處理
-->
<select id="getStudent2" resultMap="StudentTeacher2" >
select s.id sid, s.name sname , t.name tname
from student s,teacher t
where s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<!--關聯物件property 關聯物件在Student實體類中的屬性-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</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.kuang.dao.TeacherMapper">
<select id="getTeacher1" resultType="Teacher">
select * from mybatis.teacher
</select>
<!--
思路:
1. 從學生表和老師表中查出學生id,學生姓名,老師姓名
2. 對查詢出來的操作做結果集對映
1. 集合的話,使用collection!
JavaType和ofType都是用來指定物件型別的
JavaType是用來指定pojo中屬性的型別
ofType指定的是對映到list集合屬性中pojo的型別。
-->
<select id="getTeacher2" resultMap="TeacherStudent">
select s.id sid, s.name sname , t.name tname, t.id tid
from student s,teacher t
where s.tid = t.id and t.id=#{id}
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"></result>
<result property="name" column="tname"/>
<collection property="students" ofType="Student">
<result property="id" column="sid" />
<result property="name" column="sname" />
<result property="tid" column="tid" />
</collection>
</resultMap>
</mapper>
標準mapper.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">
<mapper namespace="com.kuang.mapper.BlogMapper">
</mapper>
標準mybatis-config.xml
<?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>
</configuration>