mybatis使用xml進行增刪改查代碼解析
MyBatis是支持普通sql查詢、存儲過程和高級映射的持久層框架。
MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對結(jié)果集的檢索封裝。
MyBatis可以使用 簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects 普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
每一個Mybatis應(yīng)用程序都以一個sqlSessionFactory對象的實例為核心。
sqlSessionFactory對象的實例可以通過sqlSessionFactoryBuilder對象來獲得。sqlSessionFactoryBuilder對象可以通過xml配置文件,或從以往使用管理中準(zhǔn)備好的Configuration類實例中來構(gòu)建sqlSessionFactory對象。
【示例:使用配置類獲取sqlSessionFactory】
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource(); TransactionFactory transactionFactory = new JdbcTransactionFactory(); //環(huán)境 Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); //映射器類 configuration.addMapper(BlogMapper.class); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意這種情況下配置是添加映射器類。映射器類是Java類,這些類包含SQL映射語句的注解從而避免了xml文件的依賴,但是xml映射仍然在 大多數(shù)高級映射(比如:嵌套join映射)時需要。
出于這樣的原因,如果存在xml配置文件的話,MyBatis將會自動查找和加載一個對等的XML文件(這種情況下,基于類路徑下的BlogMapper.class類的類名,那么BlogMapper.xml將會被加載–即class 與 XML在同一個文件目錄下。如果非,則需要手動配置加載xml)。
【1】基本增刪改查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.web.mapper.userMapper"> <!-- 可以解決model屬性名與數(shù)據(jù)表中column列名不一致問題 jdbcType一定要大寫 --> <resultMap type="User" id="UserMap"> <id property="id" column="id" javaType="int" jdbcType="INTEGER"/> <result property="name" column="username" javaType="string" jdbcType="VARCHAR"/> <result property="age" column="age" javaType="int" jdbcType="INTEGER"/> </resultMap> <!-- 注意這里的result,如果column == property 則可以直接返回Java object。 如果屬性名與列名不一致,解決方法如下: 1. 使用resultMap; 2.返回hashmap ; 3.查詢語句使用別名 --> <select id="getUser" parameterType="int" resultMap="UserMap"> select * from t_user where id=#{id} </select> <delete id="deleteUser" parameterType="int" > delete from t_user where id=#{id} </delete> <update id="updateUser" parameterType="User" > update t_user set username=#{name},age=#{age} where id=#{id} </update> <insert id="insertUser" parameterType="User" > insert into t_user(username,age) values(#{name},#{age}) </insert> <!-- model's attr(name) different from column(username), so the result use UserMap --> <select id="getUsers" resultMap="UserMap"> select * from t_user </select> </mapper>
注冊到mybatis.xml [當(dāng)與spring結(jié)合時,將不需要這個配置文件]
mybatis的配置文件
<?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> <properties resource="jdbc.properties"/> <!-- 配置實體類的別名 --> <typeAliases> <!-- <typeAlias type="com.web.model.User" alias="User"/> --> <package name="com.web.model"/> </typeAliases> <!-- development : 開發(fā)模式 work : 工作模式 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/web/mapper/userMapper.xml"/> <mapper resource="com/web/mapper/orderMapper.xml"/> <mapper class="com.web.mapperClass.UserMapper"/> </mappers> </configuration>
【2】通過SqlSessionFactory拿到session
這里使用xml文件獲取sqlSessionFactory和sqlSession。
public static SqlSessionFactory getFactory(){ /* flow the src dir*/ String resource = "mybatis.xml"; /*MybatisUtils.class.getResourceAsStream(resource)----- it's wrong !!!! * please distinguish the two up and down * */ InputStream inputStream = MybatisUtils.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); return factory; } SqlSession session = factory.openSession(true); //默認(rèn)手動提交; /* 兩種解決方式: 1.factory.opensession(true); 2.session.commit(); */
【3】增刪改查后臺測試代碼
/*use sql xml not annotation*/ @Test public void testAdd(){ SqlSession session = MybatisUtils.getFactory().openSession(); String statement = "com.web.mapper.userMapper.insertUser"; /*return the effect rows*/ int insert= session.insert(statement, new User("tom5", 15)); /*default is not auto commit*/ session.commit(true); session.close(); System.out.println("effect rows.."+insert); } @Test public void testSelect(){ /*set auto commit ,which equals to the above*/ SqlSession session = MybatisUtils.getFactory().openSession(true); String statement = "com.web.mapper.userMapper.getUser"; /*return the effect rows*/ User user = session.selectOne(statement, 3); System.out.println("effect rows.."+user); } @Test public void testUpdate(){ SqlSession session = MybatisUtils.getFactory().openSession(true); String statement = "com.web.mapper.userMapper.updateUser"; /*return the effect rows*/ int update= session.update(statement, new User(3,"tom4", 13)); System.out.println("effect rows.."+update); } @Test public void testDelete(){ SqlSession session = MybatisUtils.getFactory().openSession(); String statement = "com.web.mapper.userMapper.deleteUser"; /*return the effect rows*/ int delete= session.delete(statement, 6); /* commit by yourself*/ session.commit(); System.out.println("effect rows.."+delete); session.close(); } @Test public void testGetUsers(){ SqlSession session = MybatisUtils.getFactory().openSession(); String statement = "com.web.mapper.userMapper.getUsers"; /*return the List<User>*/ List<User> users= session.selectList(statement); session.commit(); System.out.println("effect rows.."+users); session.close(); }
Tips :
parameterType 和 resultType 為 hashmap :
- mapper.xml :
<select id="getUserForMap" parameterType="hashmap" resultType="hashmap"> select * from c_user where id=#{id}; </select>
- test code :
@Test public void getUserForMap(){ SqlSession session = MybatisUtils.getFactory().openSession(); String statement = "com.web.mapper.userMapper.getUserForMap"; HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); /*return the effect rows*/ Object selectOne = session.selectOne(statement, map); /*default is not auto commit*/ session.commit(true); session.close(); System.out.println("effect rows.."+selectOne+" ,class :"+selectOne.getClass()); }
- result as follows :
effect rows..{id=1, age=12, name=luli} ,class :class java.util.HashMap
綜上可知:mybatis 會根據(jù)參數(shù)類型和結(jié)果類型,自動進行解析封裝。
【擴展 基本方法】
【1】分頁列表
<select id="getListPage" parameterType="hashmap" resultMap="siteExtendDaoMap"> select id,site_id,site_name,site_number,province,city,area,address,internal_number,longitude,latitude from tb_site --使用動態(tài)sql <trim prefix="where" prefixOverrides="AND |OR "> <if test="checkState!= null and checkState!=''"> and check_state = #{checkState,jdbcType=INTEGER} </if> <if test="siteId!= null and siteId!=''"> and site_id like concat('%',#{siteId},'%') </if> <if test="siteName!= null and siteName!=''"> and site_name like concat('%',#{siteName},'%') </if> <if test="siteNumber!= null and siteNumber!=''"> and site_number like concat('%', #{siteNumber},'%') </if> <if test="province!= null and province!=''"> and province = #{province} </if> <if test="city!= null and city!=''"> and city = #{city} </if> <if test="area!= null and area!=''"> and area = #{area} </if> </trim> --添加排序 <if test="sortname!= null and sortname!='' and sortorder!= null and sortorder!=''"> order by ${sortname} ${sortorder} </if> --添加分頁 limit ${(page-1)*pagesize},${pagesize} </select>
【2】刪除方法–根據(jù)對象或者Id
如果參數(shù)為pojo,mybatis會自動從對象里面獲取id ;
<delete id="delete" parameterType="User"> delete from tb_user where id = #{id} </delete> <delete id="deleteById" parameterType="long"> delete from tb_user where id = #{id} </delete>
【3】根據(jù) id list 刪除數(shù)據(jù)
<delete id="deleteByIds"> delete from tb_user where id in --使用foreach <foreach collection="list" item="id" open="(" separator=","close=")"> #{id} </foreach> </delete>
【4】getRows
通常與getListPage聯(lián)合使用。
<select id="getRows" parameterType="hashmap" resultType="long"> select count(*) from tb_sys_role <if test="keySysRole!= null"> <trim prefix="WHERE" prefixOverrides="AND |OR "> <if test="keySysRole.id!= null"> and id = #{keySysRole.id} </if> <if test="keySysRole.name!= null and keySysRole.name!=''"> and name = #{keySysRole.name} </if> <if test="keySysRole.available!= null and keySysRole.available!=''"> and available = #{keySysRole.available} </if> </trim> </if> </select>
總結(jié)
以上就是本文關(guān)于mybatis使用xml進行增刪改查代碼解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java中基于DeferredResult的異步服務(wù)詳解
這篇文章主要介紹了Java中基于DeferredResult的異步服務(wù)詳解,DeferredResult字面意思是"延遲結(jié)果",它允許Spring MVC收到請求后,立即釋放(歸還)容器線程,以便容器可以接收更多的外部請求,提升吞吐量,需要的朋友可以參考下2023-12-12springboot下添加日志模塊和設(shè)置日志文件輸出的方法
日志的使用將通過SLF4J來使用,SLF4J是一個為Java應(yīng)用提供簡單日志記錄的接口,在Spring框架中,SLF4J常常用于處理框架本身以及應(yīng)用程序的日志記錄,本文給大家介紹springboot下添加日志模塊和設(shè)置日志文件輸出的相關(guān)知識,感興趣的朋友一起看看吧2023-12-12Java實現(xiàn)字符串的分割(基于String.split()方法)
Java中的我們可以利用split把字符串按照指定的分割符進行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)字符串的分割的相關(guān)資料,是基于jDK1.8版本中的String.split()方法,需要的朋友可以參考下2022-09-09JDK21中虛擬線程到底是什么以及用法總結(jié)(看完便知)
這篇文章主要給大家介紹了關(guān)于JDK21中虛擬線程到底是什么以及用法的相關(guān)資料,虛擬線程是一種輕量化的線程封裝,由jvm直接調(diào)度和管理,反之普通的線程其實是調(diào)用的操作系統(tǒng)的能力,對應(yīng)的是操作系統(tǒng)級的線程,需要的朋友可以參考下2023-12-12java中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為int類型
這篇文章主要講解Java中基本數(shù)據(jù)類型,java long 類型與其java int類型的轉(zhuǎn)換的幾種方法,希望能給大家做一個參考2016-07-07