1.1 什么是mybaties
1.2 mybaties環境搭建
2.1 插入
2.2 修改
2.3 刪除
3.1 mybaties核心配置文件層級關系
3.2 常用配置文件解析
4.1 SqlSession工廠構造器SqlSessionFactoryBuilder
4.2 SqlSession工廠對象SqlSessionFactory
4.3 SqlSession會話對象
一,MyBaties簡介
1.1 什么是mybaties
mybatis 是一個優秀的基於java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql語句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。
mybatis通過xml或注解的方式將要執行的各種 statement配置起來,並通過java對象和statement中sql的動態參數進行映射生成最終執行的sql語句。
最后mybatis框架執行sql並將結果映射為java對象並返回。采用ORM思想解決了實體和數據庫映射的問題,對jdbc 進行了封裝,屏蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對數據庫的持久化操作。
1.2 mybaties環境搭建
開發步驟:
①添加MyBatis的坐標
②創建user數據表
③編寫User實體類
④編寫映射文件UserMapper.xml
⑤編寫核心文件SqlMapConfig.xml
⑥編寫測試類
導入坐標:
<!--mybatis坐標--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!--mysql驅動坐標--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <!--單元測試坐標--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--日志坐標--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>
創建user表:
編寫User類:
public class User { private int id; private String username; private String password; //省略get個set方法 }
編寫UserMapper映射文件:
<?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="userMapper"> <select id="findAll" resultType="com.itcast.domain.User"> select * from User </select> </mapper>
編寫MyBaties核心配置文件:
<!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:///test"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/itcast/mapper/UserMapper.xml"/> </mappers> </configuration>
測試:
//加載核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //獲得sqlSession工廠對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //獲得sqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); //執行sql語句 List<User> userList = sqlSession.selectList("userMapper.findAll"); //打印結果 System.out.println(userList); //釋放資源 sqlSession.close();
映射文件解析:
二,MyBaties操作
2.1 插入
編寫UserMapper映射文件:
<mapper namespace="userMapper"> <insert id="add" parameterType="com.itcast.domain.User"> insert into user values(#{id},#{username},#{password}) </insert> </mapper>
編寫插入實體User代碼:
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); int insert = sqlSession.insert("userMapper.add", user); System.out.println(insert); //提交事務 sqlSession.commit(); sqlSession.close();
注意事項:
• 插入語句使用insert標簽
• 在映射文件中使用parameterType屬性指定要插入的數據類型
• Sql語句中使用#{實體屬性名}方式引用實體中的屬性值
• 插入操作使用的API是sqlSession.insert(“命名空間.id”,實體對象);
• 插入操作涉及數據庫數據變化,所以要使用sqlSession對象顯示的提交事務,即sqlSession.commit()
2.2 修改
編寫UserMapper映射文件:
<mapper namespace="userMapper"> <update id="update" parameterType="com.itcast.domain.User"> update user set username=#{username},password=#{password} where id=#{id} </update> </mapper>
編寫修改實體User的代碼:
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); int update = sqlSession.update("userMapper.update", user); System.out.println(update); sqlSession.commit(); sqlSession.close();
注意事項:
• 修改語句使用update標簽
• 修改操作使用的API是sqlSession.update(“命名空間.id”,實體對象);
2.3 刪除
編寫UserMapper映射文件:
<mapper namespace="userMapper"> <delete id="delete" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> </mapper>
編寫刪除數據的代碼:
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); int delete = sqlSession.delete("userMapper.delete",3); System.out.println(delete); sqlSession.commit(); sqlSession.close();
注意事項:
• 刪除語句使用delete標簽
•Sql語句中使用#{任意字符串}方式引用傳遞的單個參數
•刪除操作使用的API是sqlSession.delete(“命名空間.id”,Object);
總結:
增刪改查映射配置與API: 查詢數據: List<User> userList = sqlSession.selectList("userMapper.findAll"); <select id="findAll" resultType="com.itcast.domain.User"> select * from User </select> 添加數據: sqlSession.insert("userMapper.add", user); <insert id="add" parameterType="com.itcast.domain.User"> insert into user values(#{id},#{username},#{password}) </insert> 修改數據: sqlSession.update("userMapper.update", user); <update id="update" parameterType="com.itcast.domain.User"> update user set username=#{username},password=#{password} where id=#{id} </update> 刪除數據:sqlSession.delete("userMapper.delete",3); <delete id="delete" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete>
三,MyBaties配置文件
3.1 mybaties核心配置文件層級關系
3.2 常用配置文件解析
enviroments標簽:
數據庫環境的配置,支持多環境配置:
其中,事務管理器(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"/>
Properties標簽:實際開發中,習慣將數據源的配置信息單獨抽取成一個properties文件,該標簽可以加載額外配置的properties文件
typeAliases標簽:
類型別名是為Java 類型設置一個短的名字。原來的類型名稱配置如下
配置typeAliases,為com.itheima.domain.User定義別名為user:
上面我們是自定義的別名,mybatis框架已經為我們設置好的一些常用的類型的別名:
四,MyBatiesAPI
4.1 SqlSession工廠構造器SqlSessionFactoryBuilder
通過加載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 中加載資源文件。
4.2 SqlSession工廠對象SqlSessionFactory
SqlSessionFactory 有多個個方法創建SqlSession 實例。常用的有如下兩個:
4.3 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()