抱怨是一件最沒意義的事情。若是實在難以忍受周圍的環境,那就暗自努力練好本領,而後跳出那個圈子。你好,我是夢陽辰,快來和我一塊兒學習吧!html
1.三層架構java
界面層:和用戶打交道的,接收用戶的請求參數,顯示處理結果的。(jsp , htnml , servlet)mysql
業務邏輯層:接收了界面層傳遞的數據,計算邏輯,調用數據庫,獲取數據git
數據訪問層:就是訪問數據庫,執行對數據的查詢,修改,刪除等等的。
三層對應的包
界面層:controller包( servlet)程序員
業務邏輯層:service包(xxxservice類)github
數據訪問層:dao包(xxxDao類)spring
三層中類的交互
用戶使用界面層–>業務邏輯層—>數據訪問層(持久層)–>數據庫(mysql)sql
三層對應的處理框架
界面層—servlet—springmvc(框架)數據庫
業務邏輯層—service類–spring(框架)apache
數據訪問層—dao類–mybatis (框架)
模版:
一、規定了好一些條款,內容-2.加入本身的東西
框架是一個模塊
1.框架中定義好了一些功能。這些功能是可用的
2.能夠加入項目中本身的功能,這些功能能夠利用框架中寫好的功能。
框架是一個軟件,半成品的軟件,定義好了一些基礎功能,須要加入你的功能就是完整的。基礎功能是可重複使用的,可升級的
框架特色:
1.框架通常不是全能的,不能作全部事情。
2.框架是針對某一個領域有效。特長在某一個方面,好比mybatis作數據庫操做強,可是他不能作其它的。
3.框架是一個軟件。
使用JDBC的缺陷
1.代碼比較多,開發效率低
2.須要關注 Connection ,Statement,ResultSet對象建立和銷燬
3.對 ResultSet查詢的結果,須要本身封裝爲List
4.重複的代碼比較多些
5.業務代碼和數據庫的操做混在一塊兒
框架是一個軟件,半成品的軟件,定義好了一些基礎功能,須要加入你的功能就是完整的。基礎功能是可重複使用的,可升級的
框架特色:
1.框架通常不是全能的,不能作全部事情
2.框架是針對某一個領域有效。特長在某一個方面,好比mybatis作數據庫操做強,可是他不能作其它的。
3.框架是一個軟件
什麼是 MyBatis?
MyBatis是一款優秀的持久層框架。
它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎全部的 JDBC 代碼以及設置參數和獲取結果集的工做。
mybatis框架
一個框架,早期叫作ibatis,代碼在github.
mybatis是MyBatis sQL Mapper Framework for Java (sql映射框架)
1)sql mapper :sql映射
能夠把數據庫表中的一行數據映射爲一個java對象。
一行數據能夠看作是一個java對象。操做這個對象,就至關於操做表中的數據
2)Data Access 0bjects (DAOs) 數據訪問,對數據庫執行增刪改查。
mybatis提供了哪些功能:
1.提供了建立connection能力tate不用你執行sqile"t人的約力
2.提供了執行sql語句的能力,不用你執行sql
3.提供了循環sql,把sql的結果轉爲java對象,list集合的能力
4 .提供了關閉資源的能力,不用你關閉conneqtion,statement,Resultset
開發人員作的是:提供sql語句
MyBatis 能夠經過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。
2013年11月遷移到Github。
總結:
mybatis是一個sql映射框架,提供的數據庫的操做能力。加強的JDBC.
使用mybatis讓開發人員集中精神寫sql就能夠了,沒必要關心connection ,statement,ResultSet的建立,銷燬,sql的執行.
如何獲取Mybatis?
maven倉庫
https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version></dependency>
Github:https://github.com/mybatis/mybatis-3
中文文檔:https://mybatis.org/mybatis-3/zh/index.html
數據持久化
持久化就是將程序的數據在持久狀態和瞬時狀態轉化的過程。
內存:斷電即失。
數據庫(jdbc),io文件持久化。
生活:冷藏。
爲何須要持久化?
有一些對象,不能讓他丟失。
內存很貴。
Dao層,Serice層,Controller層…
完成持久化工做的代碼塊。
層界限十分明顯。
幫助程序員將數據存入到數據庫中。
方便
傳統的JDBC代碼太複雜了,簡化。框架。自動化。
不用Mybatis也能夠,更容易上手。技術沒有高低之分。
特色:
簡單易學:自己就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,經過文檔和源代碼,能夠比較徹底的掌握它的設計思路和實現。
靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml裏,便於統一管理和優化。經過sql語句能夠知足操做數據庫的全部需求。
解除sql與程序代碼的耦合:經過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提升了可維護性。
提供映射標籤,支持對象與數據庫的orm字段關係映射
提供對象關係映射標籤,支持對象關係組建維護
提供xml標籤,支持編寫動態sql。
實現步驟:
1.新建表
SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for `student`-- ----------------------------DROP TABLE IF EXISTS `student`;CREATE TABLE `student` ( `id` int(10) NOT NULL, `name` varchar(30) DEFAULT NULL, `tid` int(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fktid` (`tid`), CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of student-- ----------------------------INSERT INTO `student` VALUES ('1', '夢陽辰', '1');INSERT INTO `student` VALUES ('2', '小紅', '1');INSERT INTO `student` VALUES ('3', '小張', '1');INSERT INTO `student` VALUES ('4', '小李', '1');INSERT INTO `student` VALUES ('5', '小王', '1');-- ------------------------------ Table structure for `teacher`-- ----------------------------DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` ( `id` int(10) NOT NULL, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of teacher-- ----------------------------INSERT INTO `teacher` VALUES ('1', '黃老師');-- ------------------------------ Table structure for `user`-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(20) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL COMMENT '用戶名', `pwd` varchar(30) DEFAULT NULL COMMENT '密碼', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES ('1', '夢陽辰', '123456');INSERT INTO `user` VALUES ('2', 'MengYangChen', '1234567');INSERT INTO `user` VALUES ('3', 'meng', '123456');
2.加入maven的mybatis座標, mysql驅動的座標
3.建立實體類,student–保存表中的一行數據的
4.建立持久層的dao接口,定義操做數據庫的方法
5.建立一個mybatis使用的配置文件
叫作sql映射文件:寫sql語句的。通常一個表一個sql映射文件。這個文件是xml文件。
6.建立mybatis的主配置文件:
一個項目就一個主配置文件。
主配置文件提供了數據庫的鏈接信息和sql映射文件的位置信息
7.建立使用mybatis類,
經過mybatis訪問數據庫
思路:
搭建環境–>導入Mybatis–>編寫代碼–>測試
1.搭建環境:
建立操做的數據庫
數據庫mybtis
IDEA新建maven項目
導入maven依賴
2.新建配置文件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="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers></configuration>
1.使用Mybatis獲取sqlSessionFactory對象
從 XML 中構建 SqlSessionFactory
MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置加載資源文件更加容易。
從 XML 文件中構建 SqlSessionFactory 的實例很是簡單,建議使用類路徑下的資源文件進行配置。
MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置加載資源文件更加容易。
String resource = "mybatis-config.xml"; nputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2.從 SqlSessionFactory 中獲取 SqlSession
既然有了 SqlSessionFactory,顧名思義,咱們能夠從中得到 SqlSession 的實例。SqlSession 提供了在數據庫執行 SQL 命令所需的全部方法。你能夠經過 SqlSession 實例來直接執行已映射的 SQL 語句。
//sqlSessionFactory -->sqlSessionpublic class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //使用Mybatis獲取sqlSessionFactory對象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } /** * 從 SqlSessionFactory 中獲取 SqlSession * @return SqlSession對象 */ public static SqlSession getSqlSession(){ /*SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession;*/ return sqlSessionFactory.openSession(); }}
1.實體類
//實體類(javaBean)public class User { private int id; private String name; private String 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; }}
2.Dao/Mapper接口
public interface UserDao { List<User> selectUser();}
3.接口實現類
由原來的UserDaolmp轉變爲一個Mapper配置文件。
之前的方式就是寫一個類實現接口,再重寫接口方法,在方法中獲取數據庫鏈接,執行sql語句。
在Mybatis中免除了幾乎全部的 JDBC 代碼以及設置參數和獲取結果集的工做。
一個語句既能夠經過 XML 定義,也能夠經過註解定義。咱們先看看 XML 定義語句的方式,事實上 MyBatis 提供的全部特性均可以利用基於 XML 的映射語言來實現,這使得 MyBatis 在過去的數年間得以流行。若是你用過舊版本的 MyBatis,你應該對這個概念比較熟悉。 但相比於以前的版本,新版本改進了許多 XML 的配置,後面咱們會提到這些改進。這裏給出一個基於 XML 映射語句的示例,它應該能夠知足上個示例中 SqlSession 的調用。
<?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"><!--綁定一個對應的Dao/Mapper接口--><!--之前是寫一個類實現Dao接口,如今綁定便可--><mapper namespace="com.mengyangchen.dao.UserDao"> <!--查詢語句--> <!--id相對於之前的書寫,表示重寫的方法名(之前在方法中執行鏈接數據庫等操做,如今不須要了,只須要執行sql--> <!--resultType返回結果--> <select id="selectUser" resultType="com.mengyangchen.pojo.User"> select * from mybatis.user </select></mapper>
爲了這個簡單的例子,咱們彷佛寫了很多配置,但其實並很少。在一個 XML 映射文件中,能夠定義無數個映射語句,這樣一來,XML 頭部和文檔類型聲明部分就顯得微不足道了。文檔的其它部分很直白,容易理解。
核心文件mybatis-config.xml須要註冊mappers
<!--每個Mapper.XML都須要在Mybatis核心文件中註冊--> <mappers> <mapper resource="com/MengYangChen/mapper/UserMapper.xml"/> </mappers>
測試中可能遇到的問題:
1.配置文件沒有註冊
2.綁定接口錯誤。
3.方法名不對。
4.返回類型不對。
5.Maven導出資源問題。
<!--在build中配置resources,來防止咱們資源導出失敗的問題--><build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources></build>
寫到這裏終於把搞了我很久的問題解決了,錯誤:Error:(3.28)java:程序報org.apache.ibatis.io不存在…。
網上不少解決方案是使用idea自帶的maven,說是idea2020.1版本的問題。
個人解決方案:
解決方法:試過mvn idea:moudle命令的方法,但仍是沒有用。最後沒辦法
只能將在github網址下的mybatis3.5.6的jar包導入到新建的文件夾lib中。
但仍是報錯:
解決辦法,將mybatis-config.xml文件的配置信息true該爲false
完美獲得結果:
爲了規範將接口名UserDao統一改成UserMapper。
注意增刪改須要提交事務
代碼:
/** * 接口操做user表 */ public interface UserMapper { //查詢student表的全部數據 List<User> selectUser(); //根據id查詢用戶 User selectUserById(int id); //insert一個用戶 int insertUser(User user); //更新一個用戶 int updateUser(User user); //刪除一個用戶 int deleteUser(int 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.mengyangchen.dao.UserMapper"> <select id="selectUser" resultType="com.mengyangchen.pojo.User"> select * from mybatis.user </select> <!--根據id查詢用戶--> <select id="selectUserById" parameterType="int" resultType="com.mengyangchen.pojo.User"> select * from mybatis.user where id=#{id} </select> <!--插入數據--> <insert id="insertUser" parameterType="com.mengyangchen.pojo.User"> insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd}); </insert> <!--更新數據--> <update id="updateUser" parameterType="com.mengyangchen.pojo.User"> update mybatis.user set name =#{name},pwd=#{pwd} where id=#{id} ; </update> <!--刪除一個用戶--> <delete id="deleteUser" parameterType="int"> delete from mybatis.user where id=#{id} </delete> </mapper>
測試代碼:
public class UserMapperTest { @Test public void test(){ //1.獲取SqlSession對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper //2.執行sql,獲取sql,面向接口編程,獲取UserMapper接口(之前是實現接口的實現類,如今是配置文件) UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.selectUser(); /*String sqlId = "com.mengyangchen.dao.UserDao"+"."+"selectUser"; List<User> userList = sqlSession.selectList(sqlId);*/ for(User user:userList){ System.out.println(user); } //3.關閉SqlSession sqlSession.close(); } @Test public void selectUserById(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 User user = mapper.selectUserById(1); System.out.println(user); sqlSession.close(); } @Test public void insertUser(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 int num = mapper.insertUser(new User(3,"MengYangChen","123456")); //提交事務 if(num>0){ System.out.println("插入成功!"); } sqlSession.commit(); sqlSession.close(); } @Test public void updateUser(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 int num = mapper.updateUser(new User(3,"陳末","123456")); //提交事務 if(num>0){ System.out.println("更新成功!"); } sqlSession.commit(); sqlSession.close(); } @Test public void deleteUser(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 int num = mapper.deleteUser(3); //提交事務 if(num>0){ System.out.println("刪除成功!"); } sqlSession.commit(); sqlSession.close(); } }
假設實體類,屬性過多,咱們能夠考慮用Map.固然用實體類屬性的set和get方法也是同樣的。map能夠放多個對象中的屬性。
使用map,後面的值能夠不和實體類屬性相同,只須要和map的鍵相同便可。
例如:
int updateUser2(Map<String,Object>map);
<update id="updateUser2" parameterType="map">update mybatis.user set pwd =#{passWord} where id =#{userId}</update>
public void updateUser2(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 Map<String,Object>map = new HashMap<String,Object>(); map.put("userId",2); map.put("passWord","1234567"); int num = mapper.updateUser2(map); //提交事務 if(num>0){ System.out.println("更新成功!"); } sqlSession.commit(); sqlSession.close(); }
Map傳遞參數,直接在sql中取出key便可。
對象傳遞參數,直接在sql中去對象的屬性便可。
在sql拼接中使用通配符能夠防止sql注入。
//模糊查詢 List<User> selectUserLike(String value);
<!--模糊查詢--> <select id="selectUserLike" resultType="com.mengyangchen.pojo.User"> select * from mybatis.user where name like "%"#{value}"%"; </select>
/** * 模糊查詢*/ @Test public void selectUserLike(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 List<User> list = new LinkedList<>(); list = mapper.selectUserLike("夢"); for (User list1:list) { System.out.println(list1); } sqlSession.close(); }
也能夠:
<!--模糊查詢--> <select id="selectUserLike" resultType="com.mengyangchen.pojo.User"> select * from mybatis.user where name like #{value}; </select>
/** * 模糊查詢*/ @Test public void selectUserLike(){ //獲取執行sql的對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);//獲取接口 List<User> list = new LinkedList<>(); list = mapper.selectUserLike("%夢%"); for (User list1:list) { System.out.println(list1); } sqlSession.close(); }
第二種方式可能存在sql注入。
MyBatis 的配置文件包含了會深深影響 MyBatis 行爲的設置和屬性信息。
配置文檔的頂層結構以下:
configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)
編寫一個配置文件 db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?userSSL=false&useUnicode=true&characterEncoding=UTF-8username=root password=123456
核心配置文件中引入: 位置需在第一位
<?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><!--引入外部配置文件--> <properties resource="db.properties"> <property name="username" value="root"/><!--一配置文件中爲準--> <property name="password" value="123456"/> </properties> <environments default="development"> <environment id="development"> <!--事務管理--> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/><!--&是xml的轉義字符(即爲&)--> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--每個Mapper.XML都須要在Mybatis核心文件中註冊--> <mappers> <mapper resource="com/mengyangchen/dao/UserMapper.xml"/> </mappers></configuration>
能夠直接引入外部文件,而且能夠在其中增長一些屬性配置,若是兩個文件中都對有同一屬性的配置,優先使用外部配置文件中的配置。
是 MyBatis 中極爲重要的調整設置,它們會改變 MyBatis 的運行時行爲。 下表描述了設置中各項設置的含義、默認值等。
https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases
類型別名可爲 Java 類型設置一個縮寫名字。 它僅用於 XML 配置,意在下降冗餘的全限定類名書寫。例如:
<typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/> <typeAlias alias="Comment" type="domain.blog.Comment"/> <typeAlias alias="Post" type="domain.blog.Post"/> <typeAlias alias="Section" type="domain.blog.Section"/> <typeAlias alias="Tag" type="domain.blog.Tag"/></typeAliases>
當這樣配置時,Blog 能夠用在任何使用 domain.blog.Blog 的地方。
也能夠指定一個包名,MyBatis 會在包名下面搜索須要的 Java Bean,好比:
<typeAliases> <package name="domain.blog"/></typeAliases>
每個在包 domain.blog 中的 Java Bean,在沒有註解的狀況下,會使用 Bean 的首字母小寫的非限定類名來做爲它的別名。 好比 domain.blog.Author 的別名爲 author;如有註解,則別名爲其註解值。見下面的例子:
@Alias("author")public class Author { ...}
咱們須要告訴 MyBatis 到哪裏去找到這些語句。 在自動查找資源方面,Java 並無提供一個很好的解決方案,因此最好的辦法是直接告訴 MyBatis 到哪裏去找映射文件。 你可使用相對於類路徑的資源引用,或徹底限定資源定位符(包括 file:/// 形式的 URL),或類名和包名等。例如:
<!-- 使用相對於類路徑的資源引用 --><mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/></mappers>
須要接口和它的Mapper配置文件同名,並在同一包下。<!-- 使用映射器接口實現類的徹底限定類名 --><mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/></mappers>
須要接口和它的Mapper配置文件同名,並在同一包下。<!-- 將包內的映射器接口實現所有註冊爲映射器 --><mappers> <package name="org.mybatis.builder"/></mappers>
理解咱們以前討論過的不一樣做用域和生命週期類別是相當重要的,由於錯誤的使用會致使很是嚴重的併發問題。
SqlSessionFactoryBuilder
這個類能夠被實例化、使用和丟棄,一旦建立了 SqlSessionFactory,就再也不須要它了。 所以 SqlSessionFactoryBuilder 實例的最佳做用域是方法做用域(也就是局部方法變量)。 你能夠重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 實例,但最好仍是不要一直保留着它,以保證全部的 XML 解析資源能夠被釋放給更重要的事情。
SqlSessionFactory
能夠想象爲數據庫鏈接池
SqlSessionFactory 一旦被建立就應該在應用的運行期間一直存在,沒有任何理由丟棄它或從新建立另外一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複建立屢次,屢次重建 SqlSessionFactory 被視爲一種代碼「壞習慣」。所以 SqlSessionFactory 的最佳做用域是應用做用域。 有不少方法能夠作到,最簡單的就是使用單例模式或者靜態單例模式。
SqlSession
每一個線程都應該有它本身的 SqlSession 實例。SqlSession 的實例不是線程安全的,所以是不能被共享的,因此它的最佳的做用域是請求或方法做用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也毫不能將 SqlSession 實例的引用放在任何類型的託管做用域中,好比 Servlet 框架中的 HttpSession。 若是你如今正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求類似的做用域中。 換句話說,每次收到 HTTP 請求,就能夠打開一個 SqlSession,返回一個響應後,就關閉它。 這個關閉操做很重要,爲了確保每次都能執行關閉操做,你應該把這個關閉操做放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式:
try (SqlSession session = sqlSessionFactory.openSession()) { // 你的應用邏輯代碼}
解決方法:
起別名,將sql語句的字段名取一個別名跟屬性名相同。
方法二:
resultMap結果集映射
<!--結果集映射--><!--column數據庫中的字段,property實體類中的屬性--><resultMap id="userMap" type="User"> <result column="pwd" property="password"/></resultMap><select id="selectUserById" resultMap="userMap"> select * from mybatis.user where id=#{id}</select>
ResultMap 的設計思想是,對簡單的語句作到零配置,對於複雜一點的語句,只須要描述語句之間的關係就好了。
日誌工廠
若是一個數據庫操做,出現了異常,咱們須要排錯。日誌就是最好的助手。
曾經:sout,debug
如今:日誌工廠
SLF4J |
LOG4J | (掌握)
LOG4J2 |
JDK_LOGGING | COMMONS_LOGGING |
STDOUT_LOGGING |(掌握)
NO_LOGGING
在Mybatis中具體使用哪種日誌實現,在設置中設定。
STDOUT_LOGGING標準日誌輸出,默認無配置.
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
加了日誌工廠後:
什麼是Log4j?
Log4j是Apache的一個開源項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;
咱們也能夠控制每一條日誌的輸出格式;
經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。
最使人感興趣的就是,這些能夠經過一個配置文件來靈活地進行配置,而不須要修改應用的代碼。【百度百科】
快速入門
1.先導入log4j的包。
<!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>
2.新建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
配置logrj爲日誌的實現
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
簡單使用:
1.在須要使用log4j的類中,導入org.apachee.log4j.Logger包。
2.建立日誌對象:參數爲當前類的class
static Logger logger = Logger.getLogger(UserDaoTest.class);
3.日誌級別
info
debug
error
1語法: SELECT from user limit startIndex,pagesize;2.SELECT * from user limit 3;#[o,n]
使用Mybatis實現分頁,核心爲sql
<!--/分頁--><select id="getuserByLimit" parameterType="map" resu7tMap="userMap">select from mybatis.user limit #{startindex} ,#{pagesize}</select>
RowBounds實現分頁(瞭解便可,不推薦使用)
這是MyBatis的初步瞭解與使用,你也許還須要瞭解註解開發,緩存等。
這些內容將在下一篇文章中介紹。
我是MyBatis的第一篇。