Mybatis次日前端
一、MyBatis框架中的日誌記錄
MyBatis框架中,能夠經過log4j實現日誌輸出。
顯示MyBatis訪問數據庫的過程。如:執行的SQL,迭代的ResultSet等.
log4j是MyBatis框架必須依賴的插件jar包。
顯示日誌信息,必須經過log4j的配置文件:log4j.properties實現配置.
在資料中有配置文件模板.
log4j.properties日誌配置文件,必須保持在classpath下.src或bin目錄中
或者在mybatis整體配置文件裏面開啓mybatis日誌
<!-- 開啓mybatis的日誌記錄 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>java
1 log4j.rootCategory=DEBUG, CONSOLE,LOGFILE 2 3 4 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 5 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 6 log4j.appender.CONSOLE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n 7 8 9 log4j.appender.LOGFILE=org.apache.log4j.FileAppender 10 log4j.appender.LOGFILE.File=D:/axis.log 11 log4j.appender.LOGFILE.Append=true 12 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout 13 log4j.appender.LOGFILE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n
二、MyBatis框架中的參數
1:佔位符
1.2 用途:至關於JDBC技術中SQL語法內的的 ?
1.2 語法:#{變量名}
1.3 位置:在MyBatis映射文件中定義. 編寫在SQL語法中
1.4 參數傳遞特徵:佔位符命名大小寫敏感.
1.5 簡單類型:傳遞簡單類型變量: 八種基本類型,對應封裝類型,String,忽略佔位符的個數和佔位符變量的命名,將數據傳遞給全部的佔位符。
1.6 Map集合對象:根據佔位符的命名,做爲Map中的Key,查詢value. 將對象的數據,賦值給佔位符.若是佔位符命名在Map中不存在key, 參數數據爲null.sql
2:拼接符
拼接符使用方式和佔位符徹底一致,傳遞參數的特性有區別。
拼接符不能傳遞簡單類型變量。能夠傳遞自定義對象或Map集合對象。
儘可能避免使用拼接符,有SQL注入安全隱患。
2.1 用途:使用特定的語法,爲映射文件中的SQL語句,實現動態字符串拼接.
2.2 語法:${變量名}
2.3 位置:在MyBatis映射文件中定義. 編寫在SQL語法中
佔位符與拼接符的區別:
1:#是將傳入的值當作字符串的形式,變量替換後,#{} 對應的變量自動加上單引號
eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就至關於 select id,name,age from student where id ='1'
2:$是將傳入的數據直接顯示生成sql語句,變量替換後,${} 對應的變量不會加上單引號
eg:select id,name,age from student where id =${id},當前端把id值1,傳入到後臺的時候,就至關於 select id,name,age from student where id = 1
3:1)#{} 能防止sql 注入
2)${} 不能防止sql 注入
4:可是若是使用在order by 中就須要使用 $
5:在大多數狀況下仍是常常使用#,但在不一樣狀況下必須使用$
6:1)#{} 爲參數佔位符 ?,即sql 預編譯
2)${} 爲字符串替換,即 sql 拼接
7:1)#{}:動態解析 -> 預編譯 -> 執行
2)${}:動態解析 -> 編譯 -> 執行
#{} 和 ${} 在使用中的技巧和建議
(1)不管是單個參數,仍是多個參數,一概都建議使用註解@Param("")
(2)能用 #{} 的地方就用 #{},不用或少用 ${}
(3)表名做參數時,必須用 ${}。如:select * from ${tableName}
(4)order by 時,必須用 ${}。如:select * from t_user order by ${columnName}
三、MyBatis框架中的CUD(增刪改)和事物的管理
MyBatis框架中,默認事務爲rollback.(全部對數據庫的操做,只有JDBC默認的自動提交)
在SqlSession對象回收的時候,自動回滾.
默認事務定義的位置:
SqlSessionFactory.openSession();調用的時候,設置的默認事務.底層調用的是 openSession(false);
SqlSessionFactory.openSession(boolean autoCommit);
含義: 爲JDBC中的Connection設定自動提交參數. connection.setAutoCommit (autoCommit);
Mybatis具體實例增刪改查+分頁
pojo層和xml映射配置數據庫
1 package com.boom.pojo; 2 3 import java.io.Serializable; 4 5 /** 6 * 實體對應的數據庫表 7 * @project_name mybatis-01 8 * @class_name User 9 * @author Dilraba 10 */ 11 public class User implements Serializable { 12 13 private Integer userid;//用戶名ID 14 private String username;//用戶姓名 15 private Integer userage;//用戶年齡 16 17 public Integer getUserid() { 18 return userid; 19 } 20 public void setUserid(Integer userid) { 21 this.userid = userid; 22 } 23 public String getUsername() { 24 return username; 25 } 26 public void setUsername(String username) { 27 this.username = username; 28 } 29 public Integer getUserage() { 30 return userage; 31 } 32 public void setUserage(Integer userage) { 33 this.userage = userage; 34 } 35 public User(Integer userid, String username, Integer userage) { 36 super(); 37 this.userid = userid; 38 this.username = username; 39 this.userage = userage; 40 } 41 42 public User() { 43 super(); 44 } 45 46 @Override 47 public String toString() { 48 return "User [userid=" + userid + ", username=" + username + ", userage=" + userage + "]"; 49 } 50 51 }
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 <mapper namespace="com.boom.pojo.User"> 6 7 <select id="selectById" parameterType="int" resultType="com.boom.pojo.User"> 8 select * from user where userid = #{userid} 9 </select> 10 11 <!-- mybatis分頁 --> 12 <select id="selsectByAll" resultType="com.boom.pojo.User"> 13 select * from user 14 </select> 15 16 <!-- 條件查詢(多個參數查詢,值綁定方式) --> 17 <select id="selsectByNameAndAge" resultType="com.boom.pojo.User"> 18 select * from user where username = #{username} and userage = #{userage} 19 </select> 20 21 <!-- 條件查詢(map方式多個參數查詢,將map的key綁定到佔位符中) --> 22 <select id="selsectByNameAndAgeMap" parameterType="map" resultType="com.boom.pojo.User"> 23 select * from user where username = #{uname} and userage = #{uage} 24 </select> 25 26 <!-- selectMap 拿結果集的值做爲map的key(key必須是結果集中存在的值) --> 27 <select id="selsectByName" resultType="com.boom.pojo.User"> 28 select * from user 29 </select> 30 31 <!-- 添加操做 --> 32 <insert id="insertUser" parameterType="com.boom.pojo.User" > 33 insert into user(username,userage) values(#{username},#{userage}) 34 </insert> 35 36 <!-- 更新 --> 37 <update id="updateById"> 38 update user set username = #{username},userage = #{userage} where userid = #{userid} 39 </update> 40 41 <!-- 刪除 --> 42 <delete id="deleteById"> 43 delete from user where userid = #{userid} 44 </delete> 45 46 </mapper>
數據庫持久層apache
1 package com.boom.dao; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import com.boom.pojo.User; 7 8 public interface IUserDao { 9 //根據ID查詢單條的數據 10 User selectById(); 11 12 //查詢全部的數據分頁顯示 13 List<User> selsectByAll(); 14 15 //條件查詢(多個參數查詢,值綁定方式) 16 List<User> selsectByNameAndAge(User user); 17 18 //條件查詢(map方式多個參數查詢,將map的key綁定到佔位符中) 19 List<User> selsectByNameAndAgeMap(Map<String, Object> map); 20 21 //selectMap 拿結果集的值做爲map的key(key必須是結果集中存在的值) 22 List<User> selsectByName(String username); 23 24 //添加操做 25 void insertUser(User user); 26 27 //更新 28 void updateById(User user); 29 30 //刪除 31 void deleteById(Integer userid); 32 }
1 package com.boom.dao.impl; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import org.apache.ibatis.session.RowBounds; 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 10 import com.boom.dao.IUserDao; 11 import com.boom.pojo.User; 12 import com.boom.util.MybatisUtil; 13 14 public class UserDaoImpl implements IUserDao { 15 16 /** 17 * 根據ID查詢單條的數據 18 */ 19 @Override 20 public User selectById() { 21 SqlSession session = MybatisUtil.openSession(); 22 return session.selectOne("selectById",4); 23 } 24 25 /** 26 * 查詢全部的數據分頁顯示 27 */ 28 @Override 29 public List<User> selsectByAll() { 30 SqlSession session = MybatisUtil.openSession(); 31 //RowBounds(offset, limit)分頁從下標0開始 32 List<User> list = session.selectList("selsectByAll", null, new RowBounds(0,3)); 33 return list; 34 } 35 36 /** 37 * 條件查詢(多個參數查詢,值綁定方式) 38 */ 39 @Override 40 public List<User> selsectByNameAndAge(User user) { 41 SqlSession session = MybatisUtil.openSession(); 42 List<User> selectList = session.selectList("selsectByNameAndAge", user); 43 return selectList; 44 } 45 46 /** 47 * 條件查詢(map方式多個參數查詢,將map的key綁定到佔位符中) 48 */ 49 @Override 50 public List<User> selsectByNameAndAgeMap(Map<String, Object> map) { 51 SqlSession session = MybatisUtil.openSession(); 52 List<User> selectListMap = session.selectList("selsectByNameAndAgeMap", map); 53 return selectListMap; 54 } 55 56 57 /** 58 * selectMap 拿結果集的值做爲map的key(key必須是結果集中存在的值) 59 */ 60 @Override 61 public List<User> selsectByName(String username) { 62 SqlSession session = MybatisUtil.openSession(); 63 Map<String, Object> selectMap = session.selectMap("selsectByName", "username"); 64 System.out.println(selectMap); 65 return null; 66 } 67 68 /** 69 * 添加操做 70 */ 71 @Override 72 public void insertUser(User user) { 73 SqlSession session = MybatisUtil.openSession(); 74 session.insert("insertUser", user); 75 //手動提交事務 76 session.commit(); 77 } 78 79 /** 80 * 更新 81 */ 82 @Override 83 public void updateById(User user) { 84 SqlSession session = MybatisUtil.openSession(); 85 session.update("updateById", user); 86 session.commit(); 87 } 88 89 /** 90 * 刪除 91 */ 92 @Override 93 public void deleteById(Integer userid) { 94 SqlSession session = MybatisUtil.openSession(); 95 session.delete("deleteById", userid); 96 session.commit(); 97 } 98 99 100 }
工具類安全
1 package com.boom.util; 2 3 import java.io.InputStream; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 public class MybatisUtil { 11 private static SqlSessionFactory factory = null; 12 static{ 13 try { 14 if(factory == null){ 15 //經過工具類加載配置文件,返回讀取配置文件的IO流 16 InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml"); 17 //SqlSessionFactoryBuilder建立SqlSessionFactory對象的構建器 18 factory = new SqlSessionFactoryBuilder().build(is); 19 } 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 //獲取mybatis上下文對象 25 public static SqlSessionFactory getSqlSessionFactory(){ 26 return factory; 27 } 28 //獲取SqlSession 29 public static SqlSession openSession(){ 30 return factory.openSession(); 31 } 32 }
測試類session
1 package com.boom.test; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 7 import com.boom.dao.IUserDao; 8 import com.boom.dao.impl.UserDaoImpl; 9 import com.boom.pojo.User; 10 11 public class MybatisTest { 12 13 public static void main(String[] args) { 14 15 //根據ID查詢單條的數據 16 IUserDao ud = new UserDaoImpl(); 17 System.out.println(ud.selectById()); 18 19 20 /* 21 // 查詢全部的數據分頁顯示 22 IUserDao ud = new UserDaoImpl(); 23 List<User> userList = ud.selsectByAll(); 24 for (int i = 0; i < userList.size(); i++) { 25 System.out.println(userList.get(i)); 26 } 27 */ 28 29 /* 30 //條件查詢(多個參數查詢) 31 IUserDao ud = new UserDaoImpl(); 32 //建立User對象 33 User u = new User(); 34 //將參數綁定經過user對象傳遞 35 u.setUsername("張三"); 36 u.setUserage(18); 37 List<User> userList = ud.selsectByNameAndAge(u); 38 System.out.println(userList); 39 */ 40 41 /* 42 //條件查詢(map方式多個參數查詢,將map的key綁定到佔位符中) 43 IUserDao ud = new UserDaoImpl(); 44 //建立map對象 45 Map<String , Object> map = new HashMap<>(); 46 map.put("uname", "張三"); 47 map.put("uage", 18); 48 List<User> userList = ud.selsectByNameAndAgeMap(map); 49 System.out.println(userList); 50 */ 51 52 /* 53 //selectMap 拿結果集的值做爲map的key(key必須是結果集中存在的值) 54 IUserDao ud = new UserDaoImpl(); 55 ud.selsectByName(null); 56 */ 57 58 /* 59 //添加 60 IUserDao ud = new UserDaoImpl(); 61 //建立User對象 62 User u = new User(); 63 u.setUsername("新增測試"); 64 u.setUserage(100); 65 ud.insertUser(u); 66 */ 67 68 /* 69 //更新 70 IUserDao ud = new UserDaoImpl(); 71 //建立User對象 72 User u = new User(); 73 u.setUserid(9); 74 u.setUsername("更新測試"); 75 u.setUserage(102); 76 ud.updateById(u); 77 */ 78 79 /* 80 //刪除 81 IUserDao ud = new UserDaoImpl(); 82 ud.deleteById(5); 83 */ 84 85 } 86 87 }
整體架構圖
mybatis