SSM框架學習之MyBatis淺談
JDBC流程:
- 載入驅動
- 獲取連結
- 獲取操作物件
- 操作資料庫
- 返回結果
JDBCDemo(以MySql為例):
1 //載入驅動 2 Class.forName("com.mysql.jdbc.Driver"); 3 String url = "jdbc:mysql://127.0.0.1:3306/mysql";//jdbc:mysql://localhost:3306/+資料庫名稱 4 String userName = "root";//資料庫賬號 5 String passWord = "root";//資料庫密碼 6 //獲取連結 7 Connection connection = DriverManager.getConnection(url, userName, passWord); 8 //獲取操作物件 9 Statement statement = connection.createStatement(); 10 //操作資料庫 11 String querySql = "SELECT * FROM USER";//查詢語句 12 String addSql = "INSERT INTO USER VALUES ('001','zhangsan','001');";//增加語句 13 String deleteSql = "DELETE FROM USER WHERE id = '001';";//刪除語句 14 String updateSql = "UPDATE USER SET userName = 'lisi' WHERE id = '001';";//更新語句 15 //返回結果 16 ResultSet resultSet = statement.executeQuery(querySql); 17 int addFlag = statement.executeUpdate(addSql);//返回操作行數 18 int deleteFlag = statement.executeUpdate(deleteSql);//返回操作行數 19 int updateFlag = statement.executeUpdate(updateSql);//返回操作行數
Mybatis介紹:
百度:
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java物件)對映成資料庫中的記錄。
專案Demo:
資料庫準備:新建庫:mybatis,然後建表:user,插入幾行資料。
CREATE TABLE USER ( userId varchar(100), userName varchar(100), phoneNum varchar(100), passWorld varchar(100) );
INSERT INTO USER VALUES ('001','張三','13888888888','123'); INSERT INTO USER VALUES ('002','李四','13888888888','456'); INSERT INTO USER VALUES ('003','王五','13888888888','789');
Pom.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.demo.ibatis</groupId> 8 <artifactId>ibatis</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <packaging>war</packaging> 11 12 <name>ibatis Maven Webapp</name> 13 <!-- FIXME change it to the project's website --> 14 <url>http://www.example.com</url> 15 16 <properties> 17 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 18 <maven.compiler.source>1.8</maven.compiler.source> 19 <maven.compiler.target>1.8</maven.compiler.target> 20 </properties> 21 22 <dependencies> 23 <dependency> 24 <groupId>junit</groupId> 25 <artifactId>junit</artifactId> 26 <version>4.11</version> 27 <scope>test</scope> 28 </dependency> 29 <dependency> 30 <groupId>org.springframework</groupId> 31 <artifactId>spring-webmvc</artifactId> 32 <version>5.1.7.RELEASE</version> 33 </dependency> 34 <dependency> 35 <groupId>org.slf4j</groupId> 36 <artifactId>slf4j-log4j12</artifactId> 37 <version>1.7.12</version> 38 </dependency> 39 <dependency> 40 <groupId>jstl</groupId> 41 <artifactId>jstl</artifactId> 42 <version>1.2</version> 43 </dependency> 44 <dependency> 45 <groupId>javax.servlet</groupId> 46 <artifactId>servlet-api</artifactId> 47 <version>2.5</version> 48 </dependency> 49 <!-- MySql --> 50 <dependency> 51 <groupId>mysql</groupId> 52 <artifactId>mysql-connector-java</artifactId> 53 <version>8.0.16</version> 54 </dependency> 55 <dependency> 56 <groupId>org.mybatis</groupId> 57 <artifactId>mybatis</artifactId> 58 <version>3.5.1</version> 59 </dependency> 60 </dependencies> 61 62 <build> 63 <finalName>ibatis</finalName> 64 <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> 65 <plugins> 66 <plugin> 67 <artifactId>maven-clean-plugin</artifactId> 68 <version>3.1.0</version> 69 </plugin> 70 <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> 71 <plugin> 72 <artifactId>maven-resources-plugin</artifactId> 73 <version>3.0.2</version> 74 </plugin> 75 <plugin> 76 <artifactId>maven-compiler-plugin</artifactId> 77 <version>3.8.0</version> 78 </plugin> 79 <plugin> 80 <artifactId>maven-surefire-plugin</artifactId> 81 <version>2.22.1</version> 82 </plugin> 83 <plugin> 84 <artifactId>maven-war-plugin</artifactId> 85 <version>3.2.2</version> 86 </plugin> 87 <plugin> 88 <artifactId>maven-install-plugin</artifactId> 89 <version>2.5.2</version> 90 </plugin> 91 <plugin> 92 <artifactId>maven-deploy-plugin</artifactId> 93 <version>2.8.2</version> 94 </plugin> 95 </plugins> 96 </pluginManagement> 97 </build> 98 </project>Pom.xml檔案
Web.xml:不用動,使用建立專案時預設的即可。
下面四個檔案放在專案的“Resources”目錄下。
jdbc.properties(資料庫資訊):
1 driver=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 3 username=root 4 password=rootJDBC
log4j.properties(日誌資訊):
1 ### direct log messages to stdout ### 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 log4j.appender.stdout.Target=System.out 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 5 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n 6 7 ### direct messages to file mylog.log ### 8 log4j.appender.file=org.apache.log4j.FileAppender 9 log4j.appender.file.File=e:/mylog.log 10 log4j.appender.file.layout=org.apache.log4j.PatternLayout 11 log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n 12 13 ### set log levels - for more verbose logging change 'info' to 'debug' ### 14 15 log4j.rootLogger=debug, stdout,filelog
mybatis-config.xml(mybatis配置檔案★★★):
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!--獲取JDBC的相關資訊--> 7 <properties resource="jdbc.properties"></properties> 8 <!-- 配置環境:可以配置多個環境,default:配置某一個環境的唯一標識,表示預設使用哪個環境 --> 9 <environments default="development"> 10 <!-- 配置環境,id:環境的唯一標識 --> 11 <environment id="development"> 12 <!-- 事務管理器,type:使用jdbc的事務管理器 --> 13 <transactionManager type="JDBC"/> 14 <!-- 資料來源,type:資料來源型別,池型別的資料來源 --> 15 <dataSource type="POOLED"> 16 <!-- 配置連線資訊 --> 17 <property name="driver" value="${driver}" /> 18 <property name="url" value="${url}" /> 19 <property name="username" value="${username}" /> 20 <property name="password" value="${password}" /> 21 </dataSource> 22 </environment> 23 </environments> 24 <!-- 配置對映檔案:用來配置sql語句和結果集型別等 --> 25 <mappers> 26 <mapper resource="UserMapper.xml"/> 27 </mappers> 28 </configuration>Mybaits-config
UserMapper.xml(程式碼操作資料庫的對映檔案):
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!-- 6 mapper標籤:配置各類宣告 7 namespace:名稱空間,由於對映檔案有多個,為了防止crud語句的唯一標識被重複,可以設定空間名稱。 8 --> 9 <mapper namespace="com.demo.mapper.UserMapper"> 10 <!-- 11 select:查詢的statement(宣告),用來編寫查詢語句 12 id:語句的唯一標識 13 resultType:配置返回的結果集型別 14 parameterType:傳遞的引數型別,可以省略 15 --> 16 <select id="queryUserById" resultType="com.demo.bean.User"> 17 select * from user where userId = #{id} ; 18 </select> 19 <select id="queryUserList" resultType="com.demo.bean.User"> 20 select * from user ; 21 </select> 22 <!-- 23 insert:插入的statement,編寫插入語句 24 id:插入語句的唯一標識 25 parameterType:插入語句的引數,可以省略 26 --> 27 <insert id="insertUser" parameterType="com.demo.bean.User"> 28 insert into user VALUES ( 29 #{userId}, 30 #{userName}, 31 #{phoneNum}, 32 #{passWorld} 33 ); 34 </insert> 35 <!-- 36 update:更新的statement,用來編寫更新語句 37 id:語句的唯一標識 38 parameterType:語句的引數,可以省略 39 --> 40 <update id="updateUser"> 41 update user set userName = #{userName} where userId = #{userId}; 42 </update> 43 <!-- 44 delete:刪除的statement,用來編寫刪除語句 45 id:語句的唯一標識 46 parameterType:語句的引數,可以省略 47 --> 48 <delete id="deleteUserById"> 49 delete from user where userId = #{id}; 50 </delete> 51 52 </mapper>UserMapper
User:
1 public class User { 2 private String userId; 3 private String userName; 4 private String phoneNum; 5 private String passWorld; 6 7 public User() { 8 } 9 10 public User(String userId, String userName, String phoneNum, String passWorld) { 11 this.userId = userId; 12 this.userName = userName; 13 this.phoneNum = phoneNum; 14 this.passWorld = passWorld; 15 } 16 17 public void setUserId(String userId) { 18 this.userId = userId; 19 } 20 21 public void setUserName(String userName) { 22 this.userName = userName; 23 } 24 25 public void setPhoneNum(String phoneNum) { 26 this.phoneNum = phoneNum; 27 } 28 29 public void setPassWorld(String passWorld) { 30 this.passWorld = passWorld; 31 } 32 33 public String getUserId() { 34 return userId; 35 } 36 37 public String getUserName() { 38 return userName; 39 } 40 41 public String getPhoneNum() { 42 return phoneNum; 43 } 44 45 public String getPassWorld() { 46 return passWorld; 47 } 48 49 @Override 50 public String toString() { 51 return "User{" + 52 "userId='" + userId + '\'' + 53 ", userName='" + userName + '\'' + 54 ", phoneNum='" + phoneNum + '\'' + 55 ", passWorld='" + passWorld + '\'' + 56 '}'; 57 } 58 }Bean
UserMapper(上面的時配置檔案,這個時程式碼檔案):
1 public interface UserMapper { 2 /** 3 * 通過id查詢user物件 4 * @param id 5 * @return 6 */ 7 User queryUserById(String id); 8 /** 9 * 查詢所有使用者 10 * @return 11 */ 12 List<User> queryUserList(); 13 14 /** 15 * 插入使用者 16 * @param user 17 */ 18 void insertUser(User user); 19 20 /** 21 * 更新使用者 22 * @param user 23 */ 24 void updateUser(User user); 25 /** 26 * 通過id刪除使用者 27 * @param id 28 */ 29 void deleteUserById(String id); 30 31 }UserMapper
測試:
1 public class MyController { 2 public static void main(String[] args) throws IOException { 3 //獲取全域性配置檔案的輸入流 4 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 5 //載入全域性配置檔案獲取sqlSessionFactory 6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 7 //獲取sqlSession,引數:true,自動開啟事務 8 SqlSession sqlSession = sqlSessionFactory.openSession(true); 9 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 10 //單個查詢 11 User user1 = mapper.queryUserById("001"); 12 System.out.println(user1); 13 //多個查詢 14 List<User> users = mapper.queryUserList(); 15 for (User user2 : users) { 16 System.out.println(user2); 17 } 18 User user3 = new User(); 19 user3.setUserId("004"); 20 user3.setUserName("趙六"); 21 user3.setPhoneNum("13888888888"); 22 user3.setPassWorld("000"); 23 //增加 24 mapper.insertUser(user3); 25 //修改(把張三改為吳彥祖) 26 User user4 = new User("001","吳彥祖","13888888888","123"); 27 mapper.updateUser(user4); 28 //刪除 29 mapper.deleteUserById("002"); 30 } 31 }Controller
結果:
配置檔案:
配置步驟:
1、 配置全域性配置檔案
設定環境(事務、資料來源)
管理對映檔案XxxMapper.xml
2、 配置對映檔案
Mapper標籤:用來配置不同的statement
Namespace屬性:用來配置名稱空間,來區分不同的對映檔案中的statement
編寫crud的statement:select 、update 、insert 、delete
Select:專門用於查詢的statement,可以編寫查詢語句
Id屬性:該statement的唯一標識,一般用來被引用
resultType:結果集型別
paramterType:引數型別,可以省略,一般都省略
使用步驟:
1、獲取全域性配置檔案的資料流,載入全域性配置檔案
2、通過全域性配置檔案的輸入流建立SqlSessionFactory
3、通過SqlSessionFactory獲取SqlSession
4、通過SqlSession操作crud
5、關閉SqlSession,釋放資源。
補充:
#{}:
1、 是預編譯
2、 編譯成佔位符
3、 可以防止sql注入
4、 自動判斷資料型別
5、 一個引數時,可以使用任意引數名稱進行接收
${}:
1、 非預編譯
2、 sql的直接拼接
3、 不能防止sql注入
4、 需要判斷資料型別,如果是字串,需要手動新增引號。
5、 一個引數時,引數名稱必須是value,才能接收引數。
ResultMap:
ResultMap是mybatis中最重要最強大的元素,使用ResultMap可以解決兩大問題:
- POJO屬性名和表結構欄位名不一致的問題(有些情況下也不是標準的駝峰格式,比如id和userId)
- 完成高階查詢,比如說,一對一、一對多、多對多。