3.尚矽谷_MyBatis_HelloWorld.avi
CREATE TABLE `tbl_employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `last_name` varchar(255) DEFAULT NULL, `gender` varchar(1) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立與之對應的bean文件
package com.atguigu.mybatis.bean; publicclass Employee { private Integer id; private String lastName; private String email; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { returnlastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; }public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]"; } }
編寫的時候最好保證bean對象的屬性值和表名的字段一一對應,這裏 private String lastName;和表字段last_name不對應我們看後面如何處理了這是一個關鍵點
導入所需的jar包
mybatis用到了log4j我們需要在src目錄下建立一個log4j.xml
我們創建一個source folder文件夾,必須是這個類型的文件夾,該類型下的文件夾和src在同一目錄
source folder文件夾是一種特別的文件夾,如果你用面向對象的思想去看待這個source folder,那麽他是folder的一個子集,作為子集,肯定是有folder的所有功能,而且還有自己特別的功能,他的特別之處,就是在source folder下面的java文件都會被編譯,編譯後的文件會被放在我們設置的某個文件夾下面(一般我們設置成WEB-INF/classes)
log4m.xml文件夾的內容如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /> </layout> </appender> <logger name="java.sql"> <level value="debug" /> </logger> <logger name="org.apache.ibatis"> <level value="info" /> </logger> <root> <level value="debug" /> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
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" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要註冊到全局配置文件(mybatis-config.xml)中 --> <mappers> <mapper resource="EmployeeMapper.xml" /> </mappers> </configuration>
EmployeeMapper.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.atguigu.mybatis.dao.EmployeeMapper"> <!-- namespace:名稱空間;指定為接口的全類名 id:唯一標識 resultType:返回值類型 #{id}:從傳遞過來的參數中取出id值 public Employee getEmpById(Integer id); --> <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"> select id,last_name lastName,email,gender from tbl_employee where id = #{id} </select> </mapper>
上面因為bean的屬性和數據庫表名不一樣,如何解決了在編寫mysql的時候可以使用別名的方式來解決select id,last_name lastName,email,gender from tbl_employee where id = #{id} 這裏起了一個別名,last_name lastName 第一個是bean中的屬性值,第二個是數據庫的列名
否則會出現問題
EmployeeMapper
package com.atguigu.mybatis.dao;
import com.atguigu.mybatis.bean.Employee;
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
MyBatisTest.java
package com.atguigu.mybatis.test; import java.io.IOException; import java.io.InputStream; 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 org.junit.Test; import com.atguigu.mybatis.bean.Employee; import com.atguigu.mybatis.dao.EmployeeMapper; /** * 1、接口式編程 * 原生: Dao ====> DaoImpl * mybatis: Mapper ====> xxMapper.xml * * 2、SqlSession代表和數據庫的一次會話;用完必須關閉; * 3、SqlSession和connection一樣她都是非線程安全。每次使用都應該去獲取新的對象。 * 4、mapper接口沒有實現類,但是mybatis會為這個接口生成一個代理對象。 * (將接口和xml進行綁定) * EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class); * 5、兩個重要的配置文件: * mybatis的全局配置文件:包含數據庫連接池信息,事務管理器信息等...系統運行環境信息 * sql映射文件:保存了每一個sql語句的映射信息: * 將sql抽取出來。 * * * @author lfy * */ public class MyBatisTest { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } /** * 1、根據xml配置文件(全局配置文件)創建一個SqlSessionFactory對象 有數據源一些運行環境信息 * 2、sql映射文件;配置了每一個sql,以及sql的封裝規則等。 * 3、將sql映射文件註冊在全局配置文件中 * 4、寫代碼: * 1)、根據全局配置文件得到SqlSessionFactory; * 2)、使用sqlSession工廠,獲取到sqlSession對象使用他來執行增刪改查 * 一個sqlSession就是代表和數據庫的一次會話,用完關閉 * 3)、使用sql的唯一標誌來告訴MyBatis執行哪個sql。sql都是保存在sql映射文件中的。 * * @throws IOException */ @Test public void test() throws IOException { // 2、獲取sqlSession實例,能直接執行已經映射的sql語句 // sql的唯一標識:statement Unique identifier matching the statement to use. // 執行sql要用的參數:parameter A parameter object to pass to the statement. SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { Employee employee = openSession.selectOne( "com.atguigu.mybatis.dao.EmployeeMapper.getEmpById", 1); System.out.println(employee); } finally { openSession.close(); } } @Test public void test01() throws IOException { // 1、獲取sqlSessionFactory對象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); // 2、獲取sqlSession對象 SqlSession openSession = sqlSessionFactory.openSession(); try { // 3、獲取接口的實現類對象 //會為接口自動的創建一個代理對象,代理對象去執行增刪改查方法 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(mapper.getClass()); System.out.println(employee); } finally { openSession.close(); } } }
4.尚矽谷_MyBatis_接口式編程.avi
註意幾點:
<?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.atguigu.mybatis.dao.EmployeeMapper"> <!-- namespace:名稱空間;指定為接口的全類名 id:唯一標識 resultType:返回值類型 #{id}:從傳遞過來的參數中取出id值 public Employee getEmpById(Integer id); --> <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"> select id,last_name lastName,email,gender from tbl_employee where id = #{id} </select> </mapper>
第一點:namespace="com.atguigu.mybatis.dao.EmployeeMapper">對應的是需要訪問的接口的全類名
第二點:<select id="getEmpById"中id的值和接口下的 public Employee getEmpById(Integer id);名字一一對應
在程序中我們就可以采用接口編程了
package com.atguigu.mybatis.test; import java.io.IOException; import java.io.InputStream; 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 org.junit.Test; import com.atguigu.mybatis.bean.Employee; import com.atguigu.mybatis.dao.EmployeeMapper; /** * 1、接口式編程 * 原生: Dao ====> DaoImpl * mybatis: Mapper ====> xxMapper.xml * * 2、SqlSession代表和數據庫的一次會話;用完必須關閉; * 3、SqlSession和connection一樣她都是非線程安全。每次使用都應該去獲取新的對象。 * 4、mapper接口沒有實現類,但是mybatis會為這個接口生成一個代理對象。 * (將接口和xml進行綁定) * EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class); * 5、兩個重要的配置文件: * mybatis的全局配置文件:包含數據庫連接池信息,事務管理器信息等...系統運行環境信息 * sql映射文件:保存了每一個sql語句的映射信息: * 將sql抽取出來。 * * * @author lfy * */ public class MyBatisTest { public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } /** * 1、根據xml配置文件(全局配置文件)創建一個SqlSessionFactory對象 有數據源一些運行環境信息 * 2、sql映射文件;配置了每一個sql,以及sql的封裝規則等。 * 3、將sql映射文件註冊在全局配置文件中 * 4、寫代碼: * 1)、根據全局配置文件得到SqlSessionFactory; * 2)、使用sqlSession工廠,獲取到sqlSession對象使用他來執行增刪改查 * 一個sqlSession就是代表和數據庫的一次會話,用完關閉 * 3)、使用sql的唯一標誌來告訴MyBatis執行哪個sql。sql都是保存在sql映射文件中的。 * * @throws IOException */ @Test public void test() throws IOException { // 2、獲取sqlSession實例,能直接執行已經映射的sql語句 // sql的唯一標識:statement Unique identifier matching the statement to use. // 執行sql要用的參數:parameter A parameter object to pass to the statement. SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { Employee employee = openSession.selectOne( "com.atguigu.mybatis.dao.EmployeeMapper.getEmpById", 1); System.out.println(employee); } finally { openSession.close(); } } @Test public void test01() throws IOException { // 1、獲取sqlSessionFactory對象 SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); // 2、獲取sqlSession對象 SqlSession openSession = sqlSessionFactory.openSession(); try { // 3、獲取接口的實現類對象 //會為接口自動的創建一個代理對象,代理對象去執行增刪改查方法 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(mapper.getClass()); System.out.println(employee); } finally { openSession.close(); } } }
上面不在使用session的方法去增刪改查,而使用getMapper將sql與接口對象進行綁定,獲得接口操作的實現類,這樣就可以使用接口的實現對象進行增刪改查的操作了,接口的實現類是mybatis自己創建出來的,該對象是一個代理對象去實現增刪改查操作。
5.尚矽谷_MyBatis_小結(1).avi
SqlSession代表和數據庫的一次會話;用完必須關閉,每一次增刪改查都是一次會話
SqlSession和connection一樣她都是非線程安全。每次使用都應該去獲取新的對象。所以不能定義成一個類的成員變量,各個方法進行共享,而應該每個方法使用都應用區獲得新的對象
* 5、兩個重要的配置文件:
* mybatis的全局配置文件:包含數據庫連接池信息,事務管理器信息等...系統運行環境信息
* sql映射文件:保存了每一個sql語句的映射信息:
* 將sql抽取出來
6.尚矽谷_MyBatis_全局配置文件_引入dtd約束.avi
我們如何在mybatis的全局配置文件中如何能夠引入源文件了
在上面的mybatis-config.xml中我們引入了mybatis的約束文件"http://mybatis.org/dtd/mybatis-3-config.dtd">
EmployeeMapper.xml中引入了"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
,我們如何因為該約束文件的源碼了,第一找到mybatis的jar包將該jar包解壓
找到下面的兩個文件
在eclipse中做下面操作
key type必須是URI
key就是對於的http://mybatis.org/dtd/mybatis-3-mapper.dtd
location就是解壓對於的文件
引入之後在xml中就能夠實現代碼的自動提示了
7.尚矽谷_MyBatis_全局配置文件_properties_引入外部配置文件.avi
上面中因為conf是一個source folder文件夾,所以配置文件EmployeeMapper.xml和實體類Employee在同樣的包名com.atguigu.mybatis.bean下,並且xml文件以實體類的類命名
dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=123456 orcl.driver=oracle.jdbc.OracleDriver orcl.url=jdbc:oracle:thin:@localhost:1521:orcl orcl.username=scott orcl.password=123456
<!--
1、mybatis可以使用properties來引入外部properties配置文件的內容;
resource:引入類路徑下的資源
url:引入網絡路徑或者磁盤路徑下的資源
-->
<properties resource="dbconfig.properties"></properties>
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> <!-- 1、mybatis可以使用properties來引入外部properties配置文件的內容; resource:引入類路徑下的資源 url:引入網絡路徑或者磁盤路徑下的資源 --> <properties resource="dbconfig.properties"></properties> <!-- 2、settings包含很多重要的設置項 setting:用來設置每一個設置項 name:設置項名 value:設置項取值 --> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 3、typeAliases:別名處理器:可以為我們的java類型起別名 別名不區分大小寫 --> <typeAliases> <!-- 1、typeAlias:為某個java類型起別名 type:指定要起別名的類型全類名;默認別名就是類名小寫;employee alias:指定新的別名 --> <!-- <typeAlias type="com.atguigu.mybatis.bean.Employee" alias="emp"/> --> <!-- 2、package:為某個包下的所有類批量起別名 name:指定包名(為當前包以及下面所有的後代包的每一個類都起一個默認別名(類名小寫),) --> <package name="com.atguigu.mybatis.bean"/> <!-- 3、批量起別名的情況下,使用@Alias註解為某個類型指定新的別名 --> </typeAliases> <!-- 4、environments:環境們,mybatis可以配置多種環境 ,default指定使用某種環境。可以達到快速切換環境。 environment:配置一個具體的環境信息;必須有兩個標簽;id代表當前環境的唯一標識 transactionManager:事務管理器; type:事務管理器的類型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory) 自定義事務管理器:實現TransactionFactory接口.type指定為全類名 dataSource:數據源; type:數據源類型;UNPOOLED(UnpooledDataSourceFactory) |POOLED(PooledDataSourceFactory) |JNDI(JndiDataSourceFactory) 自定義數據源:實現DataSourceFactory接口,type是全類名 --> <environments default="dev_mysql"> <environment id="dev_mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> <environment id="dev_oracle"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${orcl.driver}" /> <property name="url" value="${orcl.url}" /> <property name="username" value="${orcl.username}" /> <property name="password" value="${orcl.password}" /> </dataSource> </environment> </environments> <!-- 5、databaseIdProvider:支持多數據庫廠商的; type="DB_VENDOR":VendorDatabaseIdProvider 作用就是得到數據庫廠商的標識(驅動getDatabaseProductName()),mybatis就能根據數據庫廠商標識來執行不同的sql; MySQL,Oracle,SQL Server,xxxx --> <databaseIdProvider type="DB_VENDOR"> <!-- 為不同的數據庫廠商起別名 --> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> <property name="SQL Server" value="sqlserver"/> </databaseIdProvider> <!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要註冊到全局配置文件(mybatis-config.xml)中 --> <!-- 6、mappers:將sql映射註冊到全局配置中 --> <mappers> <!-- mapper:註冊一個sql映射 註冊配置文件 resource:引用類路徑下的sql映射文件 mybatis/mapper/EmployeeMapper.xml url:引用網路路徑或者磁盤路徑下的sql映射文件 file:///var/mappers/AuthorMapper.xml 註冊接口 class:引用(註冊)接口, 1、有sql映射文件,映射文件名必須和接口同名,並且放在與接口同一目錄下; 2、沒有sql映射文件,所有的sql都是利用註解寫在接口上; 推薦: 比較重要的,復雜的Dao接口我們來寫sql映射文件 不重要,簡單的Dao接口為了開發快速可以使用註解; --> <!-- <mapper resource="mybatis/mapper/EmployeeMapper.xml"/> --> <!-- <mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/> --> <!-- 批量註冊: --> <package name="com.atguigu.mybatis.dao"/> </mappers> </configuration>
註意點:使用properties 標簽導入外面的dbconfig.properties文件
<setting name="mapUnderscoreToCamelCase" value="true"/>設置向映射下劃線映射成駝峰命名
作用例如數據庫的字段是last_name,實體類的字段是private String lastName;,在mybatis執行查詢
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where id = #{id}
</select>
會把數據庫的last_name的字段轉化成lastName達到一一對應,但是在寫代碼的時候最好數據庫的字段和實體類屬性一一對應。
3.尚矽谷_MyBatis_HelloWorld.avi