Mybatis的增删改查操作(包含动态代理,动态SQL标签,缓存,#与$的使用传入多参数,获取自增id等基本操作)
生活随笔
收集整理的這篇文章主要介紹了
Mybatis的增删改查操作(包含动态代理,动态SQL标签,缓存,#与$的使用传入多参数,获取自增id等基本操作)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我是在idea中創建的項目
首先項目大致目錄:其中UserMapperImpl和UserTest是多余的,當做紀念所以沒有刪除。
User pojo類:
package com.ljh.pojo;public class User {private Integer id;private String userName;private String sex;private Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", sex='" + sex + '\'' +", age=" + age +'}';} }UserMapper mapper層:
package com.ljh.Mapper;import com.ljh.pojo.User; import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper {//根據id查找public User selectById(int id);//查詢全部public List<User> selectAll();//添加用戶public boolean addUser(User user);//根據id刪除用戶public boolean deleteUser(int id);//更新用戶信息public boolean updateUser(User user);//查詢當前總人數public Integer selectCount();//根據表明查詢用戶public List<User> selectByTable(@Param("table")String table);//loginpublic List<User> login(@Param("userName")String userName,@Param("sex")String sex);//需求:查詢性別W為男的用戶 如果輸入姓名就按照姓名查詢public List<User> selectBySex(@Param("username") String userName);//需求:查詢性別為男的用戶 如果輸入姓名就按照姓名查 如果輸入年齡就按照年齡查public List<User> selectByNameAndAge(@Param("username")String username,@Param("age")Integer age);//需求:輸入姓名就按照姓名查 輸入性別就按照性別查public List<User> selectByNameAndSex(@Param("username")String username,@Param("sex")String sex);//需求:輸入姓名就修改姓名 輸入年齡就修改年齡public void updateNameAndAge(@Param("username")String username,@Param("age")Integer age,@Param("id")Integer id);//傳入多個id查詢用戶信息public List<User> selectListUserById(@Param("ids")int[] ids);//測試trim 方法public List<User> selectTrim(@Param("username")String username,@Param("sex")String sex);//測試trim 更新方法public void updateTrim(@Param("username")String username,@Param("sex")String sex,@Param("id")Integer id);//測試一級緩存public User selectCache(int id);//測試二級緩存public User selectCache2(int id); }UserMapperTest 測試類:
package com.ljh.text;import com.ljh.Mapper.UserMapper; import com.ljh.MapperImpl.UserMapperImpl; import com.ljh.pojo.User; 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.Before; import org.junit.Test;import java.io.InputStream; import java.util.List;import static org.junit.Assert.*;public class UserMapperTest {private SqlSession sqlSession;private UserMapper userMapper;private SqlSessionFactory sqlSessionFactory;@Beforepublic void setUp() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);sqlSession = sqlSessionFactory.openSession();//mybatis的動態代理 從此不需要再寫接口的實現類了userMapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void selectById() {System.out.println(userMapper.selectById(1));}@Testpublic void selectAll() {System.out.println(userMapper.selectAll());}@Testpublic void addUser() {User user = new User();user.setUserName("小明");user.setSex("男");boolean f = this.userMapper.addUser(user);sqlSession.commit();if(f){System.out.println("添加成功");System.out.println(user.getId());}}@Testpublic void deleteUser() {boolean f = userMapper.deleteUser(6);sqlSession.commit();if(f){System.out.println("刪除成功");}}@Testpublic void updateUser() {User user = new User();user.setUserName("qq");user.setSex("企鵝");user.setId(3);boolean f = userMapper.updateUser(user);sqlSession.commit();if(f){System.out.println("更新成功");}}@Testpublic void selectCount(){Integer integer = userMapper.selectCount();System.out.println(integer);}@Testpublic void selectByTable(){List<User> list = userMapper.selectByTable("user");for(User u : list){System.out.println(u);}}@Testpublic void login(){List<User> list = userMapper.login("小明","男");for(User u : list){System.out.println(u);}}@Testpublic void selectBySex(){List<User> user = userMapper.selectBySex(null);for(User u : user){System.out.println(u);}}@Testpublic void selectByNameAndAge(){List<User> user = userMapper.selectByNameAndAge("",12);for(User u : user){System.out.println(u);}}@Testpublic void selectByNameAndSex(){List<User> user = userMapper.selectByNameAndSex("","");for(User u : user){System.out.println(u);}}@Testpublic void updateNameAndAge(){userMapper.updateNameAndAge("",30,7);sqlSession.commit();}@Testpublic void selectListUserById(){List<User> user = userMapper.selectListUserById(new int[] {1,2,3});for(User u : user){System.out.println(u);}}@Testpublic void selectTrim(){List<User> user = userMapper.selectTrim("aa","bb");for(User u : user){System.out.println(u);}}@Testpublic void updateTrim(){userMapper.updateTrim("小李","男",8);sqlSession.commit();}//一級緩存的范圍是session 可以關閉session 但是一級緩存默認是無法關閉的 一直開啟// 當mybatis執行查詢時 首先回去緩存區命中 如果命中了 就會直接返回結果 如果沒有命中 那么才會發生SQL執行查詢@Testpublic void selectCache(){//第一次去查詢 會發生sql語句 并執行User user1 = userMapper.selectCache(1);System.out.println(user1);//此方法可以強制清空緩存 并且在執行更新 刪除 添加操作后 也會自動清空緩存sqlSession.clearCache();//第二次查詢的SQL語句和參數一模一樣 就不會再發生sql執行了 而是在緩存區命中 直接返回參數User user2 = userMapper.selectCache(1);System.out.println(user2);}//測試二級緩存 二級緩存的范圍是mapper的namespace 是跨session的//開啟二級緩存需要在mapper.xml文件中配置 添加<cache/>即可@Testpublic void selectCache2(){//第一次查詢User user1 = userMapper.selectCache(1);System.out.println(user1);//先關閉session 然后再開啟一個新的session 然后執行相同的SQL 如果沒有重新發送sql語句的話 那就是從二級緩存中獲取的數據sqlSession.close();//開啟新的sessionSqlSession sqlSession = sqlSessionFactory.openSession();userMapper = sqlSession.getMapper(UserMapper.class);//第二次查詢User user2 = userMapper.selectCache(1);System.out.println(user2);} }jdbc.properties :
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql:///mybatis username=root password=rootlog4j.properties:
這個配置文件主要是配合pom.xml:中的日志依賴一起使用的
log4j.rootLogger=DEBUG,A1 log4j.logger.org.mybatis=DEBUG log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%npom.xml:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ljh.mybatis</groupId><artifactId>mybatis-01</artifactId><version>1.0-SNAPSHOT</version><!--<name>mybatis-01</name><!– FIXME change it to the project's website –><url>http://www.example.com</url>--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><!--添加日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.4</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--mysql驅動包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency></dependencies></project>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><!--引入外部的jdbc文件--><properties resource="jdbc.properties"></properties><!--開啟駝峰匹配--><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--配置別名--><typeAliases><!-- <typeAlias type="com.ljh.pojo.User" alias="User"></typeAlias>--><!--直接掃描包 別名就是類名 不區分大小寫 但內容必須一致 比如類名是User 那么別名可以是User 也可以是user--><package name="com.ljh.pojo"></package></typeAliases><!--配置數據源--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driverClass}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--引入mapper文件 執行sql語句--><mappers><mapper resource="UserMapper.xml"/></mappers> </configuration>UserMapper.xml:
所有標簽的id我是都和接口中的方法名對應一致的 ,所以在此沒有具體標明是哪個具體操作
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ljh.Mapper.UserMapper"><!--開啟二級緩存--><cache/><!--根據id查詢用戶--><select id="selectById" resultType="User">select * from user where id = #{id}</select><!--type 是查詢的結果類型 也可以寫實體類的路徑 但前提都是需要在mybatis-config文件中開啟別名配置--><!--resultMap標簽中的autoMapping="true" 意思等同于駝峰匹配將數據庫名稱 和 實體類中的屬性 一一對應數據庫的主鍵的標簽是<id></id> 除此以外其余對應全部用<result></result>標簽對應id和result標簽中的column屬性表示的是數據庫中的名稱 property屬性表示實體類中的屬性如果數據庫中的名稱和實體類中的屬性名稱一致的話 就不需要匹配了--><resultMap id="userResultMap" type="User" ></resultMap><!--定義當前文件中SQL片段 也就是抽取SQL片段使用sql標簽進行定義SQL片段 然后在SQL語句中使用<include refid="sql"/>引入SQL片段但是目前只能在當前的mapper文件中使用 另外有可以定義一個全局的sql片段 步驟:在同一目錄下創建一個mapper.xml文件 然后將這個文件的命名空間自定義名稱 再編寫sql標簽 定義SQL片段然后在mybatis-config文件中引入這個文件 最后在SQLmapper文件中通過<include refid="命名空間.sql標簽id"/> 來引入sql片段--><sql id="sql">select * from</sql><!--查詢全部用戶--><select id="selectAll" resultMap="userResultMap"><include refid="sql"/>user;</select><!--添加用戶--><insert id="addUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id">insert into user(user_name,sex) values(#{userName},#{sex});</insert><!--根據id刪除用戶--><delete id="deleteUser">delete from user where id = #{id};</delete><!--更新用戶--><update id="updateUser">update user set user_name = #{userName},sex = #{sex} where id = #{id};</update><!--查找當前人數--><select id="selectCount" resultType="Integer">select count(1) from user;</select><!--根據表名查詢全部用戶--><select id="selectByTable" resultType="User">select * from ${table};</select><!-- 當傳入多個參數時 有以下三種方式可以傳入 第一種和第二種前提是接口方法中的參數必須使用@Param()聲明 第三種可以使用也可以不使用第一種不需要考慮傳入參數類型 可以防止SQL注入第二種需要考慮參數傳入類型 不能防止SQL注入第三種了解即可 不經常使用 里面的數字1,2是參數的順序位置select * from user where user_name = #{username} and sex = #{sex};select * from user where user_name = '${userName}' and sex = '${sex}';select * from user where user_name = #{param1} and sex = #{param2};--><!--模擬登陸--><select id="login" resultType="User">select * from user where user_name = '${userName}' and sex = '${sex}';</select><!--需求:如果輸入姓名就按照姓名查詢 如果不輸入 就查找性別為男的用戶--><select id="selectBySex" resultType="User">select * from user where sex = '男'<if test="username != null and username != '' ">and user_name = #{username};</if></select><!--需求:查詢性別為男的用戶 如果輸入姓名就按照姓名查 如果輸入年齡就按照年齡查--><!--如果第一個when成立的話 后面的都不執行 如果when都沒有成立 再執行otherwise--><select id="selectByNameAndAge" resultType="User">select * from user where sex = '男'<choose><when test="username != null and username != '' ">and user_name = #{username}</when><when test="age != null and age != '' ">and age = #{age}</when><otherwise></otherwise></choose></select><!--需求:輸入姓名就按照姓名查 輸入性別就按照性別查--><!--如果if條件條件成立 那么where標簽就會在SQL語句中自動生成where關鍵字如果兩個if條件都成立或者一個成立 都會自動去除掉多余的 and關鍵字 --><select id="selectByNameAndSex" resultType="User">select * from user<where><if test="username != null and username != '' ">and user_name = #{username}</if><if test="sex != null and sex != '' ">and sex = #{sex}</if></where></select><!--需求:輸入姓名就修改姓名 輸入年齡就修改年齡--><!--set標簽可以去除多余的,號--><update id="updateNameAndAge">update user<set><if test="username != null and username != '' ">user_name = #{username},</if><if test="age != null and age != '' ">age = #{age},</if></set>where id = #{id};</update><!--傳入多個id查詢用戶--><!--foreach就相當于循環 collection是傳來的參數名稱item是傳入參數的屬性名稱 需要在下面使用#{屬性名稱獲取 } open是開始 close是結束separator是分割多個參數的符號 這個標簽讀取的最終結果就相當于 (1,2,3)--><select id="selectListUserById" resultType="User">select * from user where id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></select><!--selectTrim 需求:輸入姓名就按照姓名查詢 輸入性別按照性別查詢--><!--prefix表示前綴 如果下面的if條件成立 那么就會加上前綴也就是查詢時加上where關鍵字prefixOverrides表示前綴重寫 如果兩個條件都成立的話 那么會自動去除and 也就是會自動去除前綴重寫的內容同樣 前綴重寫只能去除語句前面的內容 后面的不行 也不能換為后綴重寫--><select id="selectTrim" resultType="User">select * from user<trim prefix="where" prefixOverrides="and"><if test="username != null and username !='' ">and user_name = #{username}</if><if test="sex != null and sex != '' ">and sex = #{sex}</if></trim></select><!--測試trim--><!--suffix表示后綴 條件成立的話 會加上后綴內容 也就是where id = #{id}suffixOverrides表示后綴重寫 可以去除后面的,號 只能去掉后面 例如上面條件語句前面的and不行在這里也不能使用前綴重寫 只能使用后綴重寫去除--><update id="updateTrim" >update user<trim prefix="set" suffix="where id = #{id}" suffixOverrides=","><if test="username != null and username != '' ">user_name = #{username},</if><if test="sex != null and sex != '' ">sex = #{sex},</if></trim></update><!--測試一級緩存--><select id="selectCache" resultType="User">select * from user where id = #{id};</select><!--測試二級緩存--><select id="selectCache2" resultType="User">select * from user where id = #{id};</select> </mapper>總結
以上是生活随笔為你收集整理的Mybatis的增删改查操作(包含动态代理,动态SQL标签,缓存,#与$的使用传入多参数,获取自增id等基本操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN和Git 介绍,区别,优缺点以及适
- 下一篇: Mybatis的高级查询(包含一对一,一