mybatis使用xml進(jìn)行增刪改查代碼解析
MyBatis是支持普通sql查詢、存儲(chǔ)過程和高級(jí)映射的持久層框架。
MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對(duì)結(jié)果集的檢索封裝。
MyBatis可以使用 簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects 普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
每一個(gè)Mybatis應(yīng)用程序都以一個(gè)sqlSessionFactory對(duì)象的實(shí)例為核心。
sqlSessionFactory對(duì)象的實(shí)例可以通過sqlSessionFactoryBuilder對(duì)象來獲得。sqlSessionFactoryBuilder對(duì)象可以通過xml配置文件,或從以往使用管理中準(zhǔn)備好的Configuration類實(shí)例中來構(gòu)建sqlSessionFactory對(duì)象。
【示例:使用配置類獲取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映射語(yǔ)句的注解從而避免了xml文件的依賴,但是xml映射仍然在 大多數(shù)高級(jí)映射(比如:嵌套join映射)時(shí)需要。
出于這樣的原因,如果存在xml配置文件的話,MyBatis將會(huì)自動(dòng)查找和加載一個(gè)對(duì)等的XML文件(這種情況下,基于類路徑下的BlogMapper.class類的類名,那么BlogMapper.xml將會(huì)被加載–即class 與 XML在同一個(gè)文件目錄下。如果非,則需要手動(dòng)配置加載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.查詢語(yǔ)句使用別名
-->
<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>
注冊(cè)到mybatis.xml [當(dāng)與spring結(jié)合時(shí),將不需要這個(gè)配置文件]
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"/>
<!-- 配置實(shí)體類的別名 -->
<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)手動(dòng)提交;
/*
兩種解決方式:
1.factory.opensession(true);
2.session.commit();
*/
【3】增刪改查后臺(tái)測(cè)試代碼
/*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 會(huì)根據(jù)參數(shù)類型和結(jié)果類型,自動(dòng)進(jìn)行解析封裝。
【擴(kuò)展 基本方法】
【1】分頁(yè)列表
<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
--使用動(dòng)態(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>
--添加分頁(yè)
limit ${(page-1)*pagesize},${pagesize}
</select>
【2】刪除方法–根據(jù)對(duì)象或者Id
如果參數(shù)為pojo,mybatis會(huì)自動(dòng)從對(duì)象里面獲取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進(jìn)行增刪改查代碼解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)詳解
在本文里小編給大家分享了關(guān)于java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)以及實(shí)例代碼內(nèi)容,需要的朋友們參考學(xué)習(xí)下。2019-08-08
Java中基于DeferredResult的異步服務(wù)詳解
這篇文章主要介紹了Java中基于DeferredResult的異步服務(wù)詳解,DeferredResult字面意思是"延遲結(jié)果",它允許Spring MVC收到請(qǐng)求后,立即釋放(歸還)容器線程,以便容器可以接收更多的外部請(qǐng)求,提升吞吐量,需要的朋友可以參考下2023-12-12
springboot下添加日志模塊和設(shè)置日志文件輸出的方法
日志的使用將通過SLF4J來使用,SLF4J是一個(gè)為Java應(yīng)用提供簡(jiǎn)單日志記錄的接口,在Spring框架中,SLF4J常常用于處理框架本身以及應(yīng)用程序的日志記錄,本文給大家介紹springboot下添加日志模塊和設(shè)置日志文件輸出的相關(guān)知識(shí),感興趣的朋友一起看看吧2023-12-12
Java實(shí)現(xiàn)字符串的分割(基于String.split()方法)
Java中的我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)字符串的分割的相關(guān)資料,是基于jDK1.8版本中的String.split()方法,需要的朋友可以參考下2022-09-09
JDK21中虛擬線程到底是什么以及用法總結(jié)(看完便知)
這篇文章主要給大家介紹了關(guān)于JDK21中虛擬線程到底是什么以及用法的相關(guān)資料,虛擬線程是一種輕量化的線程封裝,由jvm直接調(diào)度和管理,反之普通的線程其實(shí)是調(diào)用的操作系統(tǒng)的能力,對(duì)應(yīng)的是操作系統(tǒng)級(jí)的線程,需要的朋友可以參考下2023-12-12
Java設(shè)計(jì)模式之創(chuàng)建者模式詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之創(chuàng)建者模式詳解,創(chuàng)建者模式,顧名思義,就是提供友好的創(chuàng)建對(duì)象的方式?,對(duì)象都是?new?出來的,但是在一些情況下,這種方式不是很友好,首先,它不夠直觀,需要的朋友可以參考下2023-08-08
java區(qū)分絕對(duì)路徑和相對(duì)路徑的方法
這篇文章主要介紹了java區(qū)分絕對(duì)路徑和相對(duì)路徑的方法,實(shí)例分析了java針對(duì)路徑操作的相關(guān)技巧,需要的朋友可以參考下2015-04-04
springboot組件初始化后的4種啟動(dòng)方式及常用方法
在Spring Boot中,您可以通過幾種方式在組件初始化后執(zhí)行啟動(dòng)任務(wù),下面小編給大家分享springboot組件初始化后的4種啟動(dòng)方式及常用方法,感興趣的朋友一起看看吧2024-06-06
java中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為int類型
這篇文章主要講解Java中基本數(shù)據(jù)類型,java long 類型與其java int類型的轉(zhuǎn)換的幾種方法,希望能給大家做一個(gè)參考2016-07-07
簡(jiǎn)單實(shí)現(xiàn)Java通訊錄系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)Java通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

