【SSM框架系列】Mybatis基本介绍
原始jdbc操作
//1. 導入驅動jar包//2.注冊驅動Class.forName("com.mysql.jdbc.Driver");//3.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "root", "root");//4.定義sql語句String sql = "update account set balance = 500 where id = 1";//5.獲取執行sql的對象 StatementStatement stmt = conn.createStatement();//6.執行sqlint count = stmt.executeUpdate(sql);//7.處理結果System.out.println(count);//8.釋放資源stmt.close();conn.close();原始jdbc操作的分析
查詢數據庫必須要有哪些條件:
- 連接數據庫的四個基本信息 driver,url,username,password
- 必須要有執行的sql語句
- 必須有結果集對應的實體對象(用于封裝數據)
原始jdbc開發存在的問題如下:
-
數據庫連接創建、釋放頻繁造成系統資源浪費從而影響系統性能
-
sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變java代碼。
-
查詢操作時,需要手動將結果集中的數據手動封裝到實體中。插入操作時,需要手動將實體的數據設置到sql語句的占位符位置
應對上述問題給出的解決方案:
-
使用數據庫連接池初始化連接資源
-
將sql語句抽取到xml配置文件中
-
使用反射、內省等底層技術,自動將實體與表進行屬性與字段的自動映射
什么是Mybatis
-
mybatis 是一個優秀的基于java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql語句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。
-
mybatis通過xml或注解的方式將要執行的各種 statement配置起來,并通過java對象和statement中sql的動態參數進行映射生成最終執行的sql語句。
-
最后mybatis框架執行sql并將結果映射為java對象并返回。采用ORM思想解決了實體和數據庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對數據庫的持久化操作。
Mybatis的基本入門
③編寫Mybatis核心配置文件:mybatis-config.xml
④編寫映射文件UserMapper.xml
⑤編碼測試(先理解讀懂,后期不用)
導入MyBatis的坐標和其他相關坐標
<dependencies><!-- 連接數據庫必須的依賴 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><!-- 方便查看日志,導入該依賴后,控制臺可以打印更多日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- 單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><!-- mybatis依賴,mybatis開發只導入這個依賴即可 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>編寫Mybatis核心配置文件:mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//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:///test"/><property name="username" value="root"/><property name="password" value="135246"/></dataSource></environment></environments><!--加載映射文件--><mappers><mapper resource="cs/wy/dao/UserDao.xml"/></mappers></configuration>4)編寫UserMapper映射文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace寫接口的全類名 --><mapper namespace="cs.wy.dao.UserDao"><!--id寫接口中對應的方法名,這里相當于實現了接口中的方法resultType寫返回值類型的全類名--><select id="getUser" resultType="cs.wy.domain.User">-- 這里寫要執行的sql語句select * from user where id=1;</select></mapper>編寫測試代碼
public class MybatisTest {@Testpublic void test01() throws IOException {// 指向mybatis的核心配置文件String resource = "mybatis-config.xml";// 加載核心配置文件到輸入流InputStream inputStream = Resources.getResourceAsStream(resource);// 通過核心配置文件創建一個sqlSessionFactory,相當于一個連接工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// jdk7新特性 try with resourcetry (SqlSession session = sqlSessionFactory.openSession()) {// 形式類似于 app.getBean(UserDao.class)UserDao userDao = session.getMapper(UserDao.class);User user = userDao.getUser();System.out.println("user = " + user);}}}MyBatis的增刪改查操作
MyBatis的插入數據操作,
編寫UserMapper映射文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace寫接口的全類名 --><mapper namespace="cs.wy.dao.UserDao"><insert id="saveUser" parameterType="cs.wy.domain.User"><!-- #{}中的值必須是實體類中的屬性名稱 -->insert into user values (null ,#{username},#{password})</insert></mapper>插入操作注意問題
- 在映射文件中使用parameterType屬性指定要插入的數據類型,該屬性可以省略
- Sql語句中使用#{實體屬性名}方式引用實體中的屬性值
- sqlSession在操作前自動開啟了事務。并且插入操作涉及數據庫數據變化,所以要使用sqlSession對象顯示的提交事務,即sqlSession.commit()
MyBatis的修改數據操作
編寫UserMapper映射文件
<update id="updateUser" ><!-- #{}中的值必須是實體類中的屬性名稱 -->update user set username=#{username}, password=#{password} where id=#{id}</update>插入操作注意問題
-
Sql語句中使用#{實體屬性名}方式引用實體中的屬性值
-
sqlSession在操作前自動開啟了事務。并且更新操作涉及數據庫數據變化,所以要使用sqlSession對象顯示的提交事務,即sqlSession.commit()
MyBatis的刪除數據操作
編寫UserMapper映射文件
<mapper namespace="userMapper"><delete id="delete" parameterType="java.lang.Integer">delete from user where id=#{id}</delete></mapper>刪除操作注意問題
-
刪除語句使用delete標簽
-
Sql語句中使用#{任意字符串}方式引用傳遞的單個參數
-
刪除操作使用的API是sqlSession.delete(“命名空間.id”,Object);
MyBatis核心配置文件層級關系
MyBatis核心配置文件配置
settings 設置
typeAliases 類型別名
為單個類起別名
<typeAliases><typeAlias alias="user" type="cs.wy.domain.User"/></typeAliases>常用內置數據類型自動別名
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| object | Object |
| map | Map |
| hashmap | HashMap |
| list | List |
| arraylist | ArrayList |
| collection | Collection |
| iterator | Iterator |
4)environments標簽
<!--數據源環境 指定默認環境名稱--><environments default="development"><!--指定當前環境名稱--><environment id="development"><!--指定事務管理類型是JDBC--><transactionManager type="JDBC"/><!--指定當前數據源類型時連接池--><dataSource type="POOLED"><!--數據庫的四個基本信息--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///test"/><property name="username" value="root"/><property name="password" value="135246"/></dataSource></environment></environments>其中,事務管理器(transactionManager)類型有兩種:
-
JDBC:這個配置就是直接使用了JDBC 的提交和回滾設置,它依賴于從數據源得到的連接來管理事務作用域。
-
MANAGED:這個配置幾乎沒做什么。它從來不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用服務器的上下文)。 默認情況下它會關閉連接,然而一些容器并不希望這樣,因此需要將 closeConnection 屬性設置為 false 來阻止它默認的關閉行為。
其中,數據源(dataSource)類型有三種:
-
UNPOOLED:這個數據源的實現只是每次被請求時打開和關閉連接。
-
POOLED:這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來。
-
JNDI:這個數據源的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。
mapper標簽:該標簽的作用是加載映射的,加載方式有如下幾種:
使用相對于類路徑的資源引用,例如:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>使用完全限定資源定位符(URL),例如:
<mapper url="file:///var/mappers/AuthorMapper.xml"/>使用映射器接口實現類的完全限定類名,例如:
<mapper class="org.mybatis.builder.AuthorMapper"/>將包內的映射器接口實現全部注冊為映射器,例如:
<package name="org.mybatis.builder"/>MyBatis相應API
SqlSession工廠構建器:SqlSessionFactoryBuilder
常用API:SqlSessionFactory build(InputStream inputStream)
通過加載mybatis的核心文件的輸入流的形式構建一個SqlSessionFactory對象
String resource = "org/mybatis/builder/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(inputStream);其中, Resources 工具類,這個類在 org.apache.ibatis.io 包中。Resources 類可以從類路徑下、文件系統或一個 web URL 中加載資源文件。
SqlSession工廠對象:SqlSessionFactory
SqlSessionFactory 有多個個方法創建SqlSession 實例。常用的有如下兩個:
SqlSession會話對象
SqlSession 實例在 MyBatis 中是非常強大的一個類。在這里你會看到所有執行語句、提交或回滾事務和獲取映射器實例的方法。
執行語句的方法主要有:
<T> T selectOne(String statement, Object parameter) <E> List<E> selectList(String statement, Object parameter) int insert(String statement, Object parameter) int update(String statement, Object parameter) int delete(String statement, Object parameter)操作事務的方法主要有:
void commit() void rollback()總結
以上是生活随笔為你收集整理的【SSM框架系列】Mybatis基本介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SSM框架系列】SpringMVC的文
- 下一篇: 【SSM框架系列】Mybatis映射配置