服務(wù)器上的網(wǎng)站怎么做3012022百度指數(shù)排名
day72
mybatis
mybatis的實(shí)現(xiàn)方式
三種實(shí)現(xiàn)方式:
純xml方式,namespace隨便寫,id隨便寫,只要保證整個(gè)項(xiàng)目namespace+id唯一即可
xml+接口的方式,namespace必須是接口的全路徑,id必須是接口的方法名,結(jié)合第一種方式,接口中不允許存在重載的方法
純注解方式,注冊(cè)時(shí)需要在mybatis的核心配置文件中設(shè)置mapper的class,或者mappers下面配置package
xml+接口方式
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> ?<settings><!--日志實(shí)現(xiàn)--><setting name="logImpl" value="STDOUT_LOGGING"/></settings> ?<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mi?useSSL=false&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="Abc@1234"/></dataSource></environment></environments><mappers><mapper resource="com/saas/dao/ProductsMapper.xml"/> <!-- ? ? ? <mapper class="com.saas.dao.IProductDaoAnnotation"/>--> <!-- ? ? ? <package name="com.saas.dao"/>--></mappers> </configuration>在mybatis-config的核心配置文件中,設(shè)置mappers節(jié)點(diǎn),里面放mapper節(jié)點(diǎn),mapper標(biāo)簽中使用resource屬性加入xml文件路徑
package com.saas.pojo; ? import lombok.Data; ? @Data public class Product {private int cid ? ? ;private String title ? ;private String subtitle;private String wtype ? ;private String img ? ? ;private String cdesc ? ;private double oprice ;private double nprice ;private int tid ? ? ; }package com.saas.dao; ? import com.saas.pojo.Product; ? import java.util.List; ? public interface IProductDao { ?List<Product> getAllProducts(); ?Product getProductById(int i); ?int updateProduct(Product product); }<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.saas.dao.IProductDao"><select id="getAllProducts" resultType="com.saas.pojo.Product">select * from products</select> ?<select id="getProductById" resultType="com.saas.pojo.Product">select * from products where cid = #{cid}</select> ?<update id="updateProduct">update products set title = #{title}, subtitle = #{subtitle}, wtype = #{wtype} , img = #{img} ,cdesc = #{cdesc} , oprice = #{oprice}, nprice = #{nprice}, tid = #{tid} where cid = #{cid}</update> </mapper>這里要特別注意:
namespace必須是接口的全路徑
id必須是接口中的每個(gè)方法的方法名
由于之前mybatis中不能存在同namespace+id的場(chǎng)景,所以接口中不允許存在重載方法
package com.saas.dao; ? import com.saas.pojo.Product; import com.saas.util.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; ? import java.util.List; ? public class TestProducts { ?private SqlSession session = null; ?@Testpublic void testGetAllProducts() { ?session = SessionUtil.getSession(); ?IProductDao iProductDao = session.getMapper(IProductDao.class); ?List<Product> list = iProductDao.getAllProducts(); ?for (Product p : list) {System.out.println(p);} ?SessionUtil.closeSession(session);} ?@Testpublic void testGetProductById() {session = SessionUtil.getSession();IProductDao iProductDao = session.getMapper(IProductDao.class);Product product = iProductDao.getProductById(1);System.out.println(product);SessionUtil.closeSession(session);} ?@Testpublic void testUpdateProduct() {session = SessionUtil.getSession();IProductDao iProductDao = session.getMapper(IProductDao.class); ?Product product = new Product();product.setCid(3);product.setTitle("iphone");product.setOprice(16999);product.setNprice(12999);product.setCdesc("iphone 15");product.setTid(1);product.setSubtitle("iphone15promax");product.setImg("ip15.jpg");product.setWtype("taobao"); ?int i = iProductDao.updateProduct(product); ?System.out.println(i > 0); ?SessionUtil.closeSession(session);} }這里注意,我們需要結(jié)束SqlSession對(duì)象的getMapper()方法,方法參數(shù)設(shè)置接口的類對(duì)象,來(lái)得到接口對(duì)象
一旦有了接口對(duì)象,則借助該接口對(duì)象調(diào)用接口中的方法即可完成所有的crud功能
測(cè)試完成其crud功能
純注解方式
按照之前兩種方式,最直接的結(jié)果是,每個(gè)crud方法最終都對(duì)應(yīng)一個(gè)正確的SQL語(yǔ)句即可,所以注解方式更“直接”
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> ?<settings><!--日志實(shí)現(xiàn)--><setting name="logImpl" value="STDOUT_LOGGING"/></settings> ?<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mi?useSSL=false&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="Abc@1234"/></dataSource></environment></environments><mappers> <!-- ? ? ? <mapper resource="com/saas/dao/ProductsMapper.xml"/>--><mapper class="com.saas.dao.IProductDaoAnnotation"/> <!-- ? ? ? <package name="com.saas.dao"/>--></mappers> </configuration>在mybatis的核心配置文件中,mappers節(jié)點(diǎn)放入mapper子節(jié)點(diǎn),mapper標(biāo)簽中使用class屬性來(lái)實(shí)現(xiàn)主責(zé)功能
或者在mappers節(jié)點(diǎn)中放入package子節(jié)點(diǎn),里面寫name為包名,那就意味著這個(gè)包下的所有dao類都可以被一次性注冊(cè)到mybatis的核心工廠之上
package com.saas.dao; ? import java.util.List; import com.saas.pojo.Product; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; ? public interface IProductDaoAnnotation { ?@Select("select * from products")List<Product> getAllProducts(); ? // ? @Select("select * from products limit #{param1}, #{param2}") // ? @Select("select * from products limit #{arg0}, #{arg1}")@Select("select * from products limit #{si}, #{ps}")List<Product> getProductsByPage(@Param("si") int si, @Param("ps") int ps); ? ?@Select("select * from products where cid = #{cid}")Product getProductById(int cid); ?@Insert("insert into products(title,subtitle,wtype,oprice,tid,img,cdesc,nprice) " +" values(#{title},#{subtitle},#{wtype},#{oprice},#{tid},#{img},#{cdesc},#{nprice})")int saveProduct(Product product); }第三種調(diào)用方式與第二種類似
需要借助SqlSession對(duì)象的getMapper()方法,將接口的類對(duì)象傳入后得到接口對(duì)象
一旦有了接口對(duì)象,則通過(guò)接口對(duì)象的crud方法完成對(duì)應(yīng)的curd功能
mybatis傳參
無(wú)參:SQL語(yǔ)句里面不寫占位符
一參:SQL語(yǔ)句里面#{}里面寫任意合法的標(biāo)識(shí)符
多參:
對(duì)象傳參
map傳參
arg0, arg1, arg2
param1, param2, param3
@Param(“si”), @Param("si")
config配置
properties
<properties resource="db.properties"> </properties>settings
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="safeResultHandlerEnabled" value="true"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/> <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/> <setting name="callSettersOnNulls" value="false"/> <setting name="returnInstanceForEmptyRow" value="false"/> <setting name="logPrefix" value="exampleLogPreFix_"/> <setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/> <setting name="proxyFactory" value="CGLIB | JAVASSIST"/> <setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/> <setting name="useActualParamName" value="true"/> <setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/> </settings>類型別名
<typeAliases><typeAlias type="com.saas.pojo.Product" alias="Product"/><package name="com.saas.pojo"/></typeAliases>環(huán)境配置
<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="${user}"/><property name="password" value="${pass}"/></dataSource></environment> </environments>其中datasource的type有三個(gè)值:
unpooled:不使用連接池
pooled:使用連接池
jndi:需要額外配置應(yīng)用服務(wù)器
其中transactionManager的type值有兩個(gè):
JDBC: jdbc自身的提交或者回滾來(lái)實(shí)現(xiàn)事務(wù)
MANAGED:由容器自動(dòng)決定事務(wù)的提交或者回滾
映射器
<mappers> <!-- <mapper resource="com/saas/dao/ProductsMapper.xml"/>--><mapper class="com.saas.dao.IProductDaoAnnotation"/> <!-- <package name="com.saas.dao"/>--></mappers>映射器的配置分為兩大類
mapper子節(jié)點(diǎn)
resource,配置xml文件的相對(duì)路徑
url: 配置xml文件的 絕對(duì)路徑
class:配置映射的文件類
package子節(jié)點(diǎn):該包下是所有類都會(huì)被自動(dòng)映射
mapper映射
cache
– 該命名空間的緩存配置。
cache-ref
– 引用其它命名空間的緩存配置。
resultMap
– 描述如何從數(shù)據(jù)庫(kù)結(jié)果集中加載對(duì)象,是最復(fù)雜也是最強(qiáng)大的元素。
parameterMap
– 老式風(fēng)格的參數(shù)映射。此元素已被廢棄,并可能在將來(lái)被移除!請(qǐng)使用行內(nèi)參數(shù)映射。文檔中不會(huì)介紹此元素。
sql
– 可被其它語(yǔ)句引用的可重用語(yǔ)句塊。
insert
– 映射插入語(yǔ)句。
update
– 映射更新語(yǔ)句。
delete
– 映射刪除語(yǔ)句。
select
– 映射查詢語(yǔ)句。<sql id="allPro">select * from products</sql><select id="getAllProducts" resultType="abc"><include refid="allPro"/></select><select id="getProductById" resultType="abc"><include refid="allPro"/>where cid = #{cid}</select><select id="getProductsByPage" resultType="abc"><include refid="allPro"/>limit #{si}, #{ps}</select><update id="updateProduct">update products set title = #{title}, subtitle = #{subtitle}, wtype = #{wtype} , img = #{img} ,cdesc = #{cdesc} , oprice = #{oprice}, nprice = #{nprice}, tid = #{tid} where cid = #{cid}</update>