
我的環境
jdk1.8mysql 8.0.23maven 3.8.4IDEAmysql mysql-connector-java 8.0.11 org.mybatis mybatis 3.4.6 junit junit 4.12 src/main/resources **/*.properties **/*.xml true src/main/java **/*.properties **/*.xml true
mybatis-config.xml
(相關資料圖)
D:\Java_IDE\apache-maven-3.8.4\maven-repo
環境:
jdk 1.8Mysql 5.7maven 3.6.1IDEA回顧
JDBCMysqljava基礎MavenjunitSSM框架:配置文件的,最好方式
如何獲取Mybatis
Maven倉庫GitHub中文文檔數據持久化●持久化就是將程序的數據在持久狀態和瞬時狀態轉化的過程●內存:斷電即失●數據庫(Jdbc), io文件持久化。●生活:冷藏.罐頭。為什么需要需要持久化?****●有一些對象,不能讓他丟掉。●內存太貴了
Dao層,Service層 ,Controller層...●完成持久化工作的代碼塊●層界限十分明顯。
●幫助程序猿將數據存入到數據庫中。方便●傳統的JDBC代碼太復雜了。簡化。框架。自動化。●不用Mybatis也可以。更容易.上手。技術沒有高低之分●優點:。簡單易學。靈活。sq|和代碼的分離,提高了可維護性。。提供映射標簽,支持對象與數據庫的orm字段關系映射。提供對象關系映射標簽,支持對象關系組建維護。提供xml標簽,支持編寫動態sql。
最重要的一點:使用的人多!
新建數據庫
mysql mysql-connector-java 5.1.35 org.mybatis mybatis 3.5.2 junit junit 4.11
編寫mybatis工具類
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //1、 獲取SqlSessionFactory對象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。 // SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句 public static SqlSession getSqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; }}
package com.mink.pojo;public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name="" + name + "\"" + ", pwd="" + pwd + "\"" + "}"; }}dao接口
public interface UserDao { List接口實現類 由原來的UserDaoImpl轉變為一個UserMapper配置文件getUserList();}
注意點:
org.apache.ibatis.binding.BindingException: Type interface com.mink.dao.UserDao is not known to the MapperRegistry.
junit測試namespace中的包名要和Dao/mapper接口的包名一致
選擇查詢語句
id:就是namespace中的方法名resultType:SQL語句執行的返回值parameterType="int" 參數類型假設我們的實體類 或數據表中,字段或參數過多,考慮使用map
int addUser2(Mapmap);
insert into mybatis.user (id,name ,pwd)values (#{userid},#{username},#{password})
@Test public void addUser2Test2(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Mapmap = new HashMap (); map.put("userid",7); map.put("username","map"); map.put("password",""); mapper.addUser2(map); sqlSession.commit(); sqlSession.close(); }
Map傳遞參數,直接在sq|中取出key即可!對象傳遞參數,直接在sq|中取對象的屬性即可!
只有一個基本類型的情況下,可直接在sql中取到
多個參數用map或者注解
模糊查詢怎么寫?
Java代碼執行的時候,傳遞通配符% %List2.在sql拼接中使用通配符!like = mapper.getUserLike("%m%");
MyBatis可以配置成適應多種環境不過要記住:盡管可以配置多個環境,但每個SqlSessionFactory實例只能選擇-種環境。學會使用配置多套運行環境!Mybatis默認的事務管理器就是JDBC,連接池: POOLED
我們可以通過properties屬性來實現引用配置文件這些屬性都是可外部配置且可動態替換的,既可以在典型的Java屬性文件中配置,亦可通過properties元素的子元素來傳遞。db.properties
driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&;serverTimezone=UTC&;useSSL=trueuser=rootpwd=admin
在核心配置文件中映入
可以直接引入外部文件可以在其中增加一些屬性配置如果兩個文件有同-一個字段,優先使用外部配置文件的! .
類型別名是為Java類型設置一個短的名字。存在的意義僅在于用來減少類完全限定名的冗余。
也可以指定一個包名 ,MyBatis 會在包名下面搜索需要的Java Bean,比如:掃描實體類的包,它的默認別名就為這個類的名,首字母小寫!
在實體類比較少的時候,使用第一種方式。如果實體類十分多,建議使用第二_種。第一種可以DIY別名,第二種則.不行 如果非要改,需要在實體.上增加注解
@Alias("user")public class User {
p7
●typeHandlers (類型處理器)●objectFactory_ (對象工廠)●plugins插件。mybatis-generator-core。mybatis-plus。通用mapper
MapperRegistry:注冊綁定我們的Mapper文件;
注意點:●接口和他的Mapper配置文件必須同名!●接口和他的Mapper配置文件必須在同一個包下!
注意點:●接口和他的Mapper配置文件必須同名!●接口和他的Mapper配置文件必須在同一個包下!
生命周期,和作用域,是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題。
●一-旦創建了SqlSessionFactory, 就不再需要它了●局部變量
●說白了就是可以想象為:數據庫連接池.●SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。
●因此SqlSessionFactory的最佳作用域是應用作用域。●最簡單的就是使用單例模式或者靜態單例模式。
●連接到連接池的一一個請求!●SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。●用完之后需要趕緊關閉,否則資源被占用!
這里面的每一個Mapper, 就代表一個具體的業務!
public class User { private int id; private String name; private String password;
實體類與數據庫名字不匹配,
查詢出來為null值
1、起別名
2、在UserMapper文件中的sql語句 resultType 改為 resultMap
新建resultMap標簽
??resultMap?
? 元素是 MyBatis 中最重要最強大的元素。ResultMap 的設計思想是,對簡單的語句做到零配置,對于復雜一點的語句,只需要描述語句之間的關系就行了。如果一個數據庫操作,出現了異常,我們需要排錯。日志就是最好的助手!曾經: sout、debug現在:日志工廠!
logImpl 可選的值有:
SLF4JLOG4J【掌握】LOG4J2JDK_LOGGINGCOMMONS_LOGGINGSTDOUT_LOGGING【掌握】NO_LOGGING,或者是實現了接口 ??org.apache.ibatis.logging.Log?
? 的,且構造方法是以字符串為參數的類的完全限定名。STDOUT_LOGGING標準日志輸出