MyBatis3详细教程

合集下载

使用MyBatis返回map对象,字段值为null时不返回或返回null,目标返回自定义的。。。

使用MyBatis返回map对象,字段值为null时不返回或返回null,目标返回自定义的。。。

52
}
53
}
54
this.objectMapper.setFilterProvider(filterProvider);
55
this.objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
56
@Override
12 import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
13 import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
14 import message.Message;
59
}
60
});
61
}
62
super.writeInternal(object, type, outputMessage);
63clearLocal源自ilter();64 }65
66
67 public static void except(Class aClass, String... field){
在mybatis 中,返回map字段值为null 时是有返回的,例如:
<result column="name" property="name" jdbcType="VARCHAR" javaType="ng.String"/>
在mapper.xml 文件中使用以上的格式返回名称为name的数据,如果name的值为null ,那么返回值也为null,并不会无故的消失掉,所以我们如果需要字段值为null的字段不回传,需要用到另外的jar 包 我当前项目中使用的jar 为:

Mybatis懒加载的实现

Mybatis懒加载的实现

Mybatis懒加载的实现因为通过javassist和cglib代理实现的,所以说到底最主要的就是JavasisstProxyFactory类中的invoke⽅法和⾥⾯的load⽅法。

其实读⼀读,⾥⾯的逻辑就是跟配置中定义的规则⼀样的因为github上的mybatis中⽂版中这部分注释⽐较少,所以从⽹上寻找博客,截取了代码注释⽚段记录下。

JavasisstProxyFactorypublic class JavassistProxyFactory implements org.apache.ibatis.executor.loader.ProxyFactory {/*** 接⼝实现* @param target ⽬标结果对象* @param lazyLoader 延迟加载对象* @param configuration 配置* @param objectFactory 对象⼯⼚* @param constructorArgTypes 构造参数类型* @param constructorArgs 构造参数值* @return*/@Overridepublic Object createProxy(Object target, ResultLoaderMap lazyLoader, Configuration configuration, ObjectFactory objectFactory, List&lt;Class&lt;?&gt;&gt; constructorArgTypes, List&lt;Object&gt; constructorArgs) { return EnhancedResultObjectProxyImpl.createProxy(target, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);}//省略.../*** 代理对象实现,核⼼逻辑执⾏*/private static class EnhancedResultObjectProxyImpl implements MethodHandler {/*** 创建代理对象* @param type* @param callback* @param constructorArgTypes* @param constructorArgs* @return*/static Object crateProxy(Class&lt;?&gt; type, MethodHandler callback, List&lt;Class&lt;?&gt;&gt; constructorArgTypes, List&lt;Object&gt; constructorArgs) {ProxyFactory enhancer = new ProxyFactory();enhancer.setSuperclass(type);try {//通过获取对象⽅法,判断是否存在该⽅法type.getDeclaredMethod(WRITE_REPLACE_METHOD);// ObjectOutputStream will call writeReplace of objects returned by writeReplaceif (log.isDebugEnabled()) {log.debug(WRITE_REPLACE_METHOD + &quot; method was found on bean &quot; + type + &quot;, make sure it returns this&quot;);}} catch (NoSuchMethodException e) {//没找到该⽅法,实现接⼝enhancer.setInterfaces(new Class[]{WriteReplaceInterface.class});} catch (SecurityException e) {// nothing to do here}Object enhanced;Class&lt;?&gt;[] typesArray = constructorArgTypes.toArray(new Class[constructorArgTypes.size()]);Object[] valuesArray = constructorArgs.toArray(new Object[constructorArgs.size()]);try {//创建新的代理对象enhanced = enhancer.create(typesArray, valuesArray);} catch (Exception e) {throw new ExecutorException(&quot;Error creating lazy proxy. Cause: &quot; + e, e);}//设置代理执⾏器((Proxy) enhanced).setHandler(callback);return enhanced;}/*** 代理对象执⾏* @param enhanced 原对象* @param method 原对象⽅法* @param methodProxy 代理⽅法* @param args ⽅法参数* @return* @throws Throwable*/@Overridepublic Object invoke(Object enhanced, Method method, Method methodProxy, Object[] args) throws Throwable {final String methodName = method.getName();try {synchronized (lazyLoader) {if (WRITE_REPLACE_METHOD.equals(methodName)) {//忽略暂未找到具体作⽤Object original;if (constructorArgTypes.isEmpty()) {original = objectFactory.create(type);} else {original = objectFactory.create(type, constructorArgTypes, constructorArgs);}PropertyCopier.copyBeanProperties(type, enhanced, original);if (lazyLoader.size() &gt; 0) {return new JavassistSerialStateHolder(original, lazyLoader.getProperties(), objectFactory, constructorArgTypes, constructorArgs);} else {return original;}} else {//延迟加载数量⼤于0if (lazyLoader.size() &gt; 0 &amp;&amp; !FINALIZE_METHOD.equals(methodName)) {//aggressive ⼀次加载性所有需要要延迟加载属性或者包含触发延迟加载⽅法if (aggressive || lazyLoadTriggerMethods.contains(methodName)) {log.debug(&quot;==&gt; laze lod trigger method:&quot; + methodName + &quot;,proxy method:&quot; + methodProxy.getName() + &quot; class:&quot; + enhanced.getClass());//⼀次全部加载lazyLoader.loadAll();} else if (PropertyNamer.isSetter(methodName)) {//判断是否为set⽅法,set⽅法不需要延迟加载final String property = PropertyNamer.methodToProperty(methodName);lazyLoader.remove(property);} else if (PropertyNamer.isGetter(methodName)) {final String property = PropertyNamer.methodToProperty(methodName);if (lazyLoader.hasLoader(property)) {//延迟加载单个属性lazyLoader.load(property);log.debug(&quot;load one :&quot; + methodName);}}}}}return methodProxy.invoke(enhanced, args);} catch (Throwable t) {throw ExceptionUtil.unwrapThrowable(t);}}}load⽅法/*** 执⾏懒加载查询,获取数据并且set到userObject中返回* @param userObject* @throws SQLException*/public void load(final Object userObject) throws SQLException {//合法性校验if (this.metaResultObject == null || this.resultLoader == null) {if (this.mappedParameter == null) {throw new ExecutorException("Property [" + this.property + "] cannot be loaded because "+ "required parameter of mapped statement ["+ this.mappedStatement + "] is not serializable.");}//获取mappedstatement并且校验final Configuration config = this.getConfiguration();final MappedStatement ms = config.getMappedStatement(this.mappedStatement);if (ms == null) {throw new ExecutorException("Cannot lazy load property [" + this.property+ "] of deserialized object [" + userObject.getClass()+ "] because configuration does not contain statement ["+ this.mappedStatement + "]");}//使⽤userObject构建metaobject,并且重新构建resultloader对象this.metaResultObject = config.newMetaObject(userObject);this.resultLoader = new ResultLoader(config, new ClosedExecutor(), ms, this.mappedParameter,metaResultObject.getSetterType(this.property), null, null);}/* We are using a new executor because we may be (and likely are) on a new thread* and executors aren't thread safe. (Is this sufficient?)** A better approach would be making executors thread safe. */if (this.serializationCheck == null) {final ResultLoader old = this.resultLoader;this.resultLoader = new ResultLoader(old.configuration, new ClosedExecutor(), old.mappedStatement,old.parameterObject, old.targetType, old.cacheKey, old.boundSql);}//获取数据库查询结果并且set到结果对象返回this.metaResultObject.setValue(property, this.resultLoader.loadResult());}到此这篇关于Mybatis懒加载的实现的⽂章就介绍到这了,更多相关Mybatis 懒加载内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

struts2+spring3+mybatis整合

struts2+spring3+mybatis整合

--src|-com.ssm|-action|-LoginAction.java|-entity|-User.java|-iface|-IUserDao.java|-impl|-UserDao.java|-seriface|-IUserServices.java|-impl|-UserServices.java|-sqlmap|-User.xmlapplicationContext.xmldatabase.Propertieslog4j.PropertiesmyBatis-config.xmlstruts.Propertiesstruts.xmlok直接上代码了:Action类: LoginAction.javapackage com.ssm.action;import java.util.ArrayList;import java.util.List;import com.opensymphony.xwork2.Action;import er;import com.ssm.seriface.IUserService;public class LoginAction implements Action{private User user;private IUserService userServices;public void setUserServices(IUserService userServices) {erServices = userServices;}public User getUser(){return user;}public void setUser(User user){er = user;}public String execute() throws Exception{String aaa= getUser().getId()+"";List userList= new ArrayList();userList= userServices.selectUserById(getUser().getId()); if(userList.size()>0){return Action.SUCCESS;}else{return Action.ERROR;}}}实体类User.javapackage com.ssm.entity;import java.io.Serializable;import java.util.Date;public class User implements Serializable{private int id;private String name;private String password;private Date birthday;public User(){}public User(String name, String password, Date birthday) {= name;this.password= password;this.birthday= birthday;}public int getId(){return id;}public void setId(int id){this.id = id;}public String getName(){return name;}public void setName(String name){ = name;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;}public Date getBirthday(){return birthday;}public void setBirthday(Date birthday){this.birthday = birthday;}}IUserDao接口类IUserDao.javapackage com.ssm.iface;import java.util.List;public interface IUserDao{public boolean userVaild(String name, String password);public List selectUserById(int id);}UserDaoImpl实现接口类:UserDaoImpl.javapackage com.ssm.iface.impl;import java.util.List;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import com.ssm.iface.IUserDao;//import com.ssb.baseutil.SqlMapClientDaoSupport;//import com.ssb.iface.IUserDao;//import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; public class UserDaoImpl extends SqlMapClientDaoSupport implements IUserDao {public List selectUserById(int id){// TODO Auto-generated method stubreturn getSqlMapClientTemplate().queryForList("selectUserById", id);}public boolean userVaild(String name, String password){// TODO Auto-generated method stubreturn false;}/*public boolean userVaild(String name, String password){return false;}public List selectUserById(String id){return getSqlMapClientTemplate().queryForList("getUserById", id);}*/}业务类IUserServices.javapackage com.ssm.seriface;import java.util.List;public interface IUserService{public boolean userVaild(String name, String password); public List selectUserById(int id);}UserServicesImpl.javapackage com.ssm.seriface.impl;import java.util.List;import com.ssm.iface.IUserDao;import com.ssm.seriface.IUserService;public class UserServiceImpl implements IUserService{private IUserDao serviceUserDao= null;public IUserDao getServiceUserDao(){return serviceUserDao;}public void setServiceUserDao(IUserDao serviceUserDao) {this.serviceUserDao = serviceUserDao;}public List selectUserById(int id){// TODO Auto-generated method stubreturn serviceUserDao.selectUserById(id);}public boolean userVaild(String name, String password){// TODO Auto-generated method stubreturn erVaild(name, password);}}mybatis实体配置文件User.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC"-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="user"><resultMap type="User" id="userResultMap"><id property="id" column="ID"/><result property="name" column="NAME"/><result property="password" column="PASSWORD"/><result property="birthday" column="BIRTHDAY"/></resultMap><select id="selectUserById" parameterType="ng.String" resultType="User"><![CDATA[SELECT * FROM USER SUWHERE SU.ID = #{id}]]></select></mapper>sprng配置文件applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p" xmlns:context="/schema/context"xmlns:jee="/schema/jee" xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd/schema/context/schema/context/spring-context-2.5.xsd/schema/jee/schema/jee/spring-jee-2.5.xsd/schema/tx/schema/tx/spring-tx-2.5.xsd"><!-- 数据源属性配置文件--><!-- <bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:com/databaseconfig/database.properties"/></bean>--><context:property-placeholder location="classpath:database.properties"/><bean id="dataSource" class="boPooledDataSource"><property name="driverClass" value="${jdbc.driverClassName}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${ername}" /><property name="password" value="${jdbc.password}" /><property name="autoCommitOnClose" value="true"/><property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/><property name="initialPoolSize" value="${cpool.minPoolSize}"/><property name="minPoolSize" value="${cpool.minPoolSize}"/><property name="maxPoolSize" value="${cpool.maxPoolSize}"/><property name="maxIdleTime" value="${cpool.maxIdleTime}"/><property name="acquireIncrement" value="${cpool.acquireIncrement}"/><property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/> </bean><!-- 数据连接管理--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- myBatis文件--><!--<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:myBatis-config.xml"/></bean>--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="configLocation" value="classpath:myBatis-config.xml"/><property name="dataSource" ref="dataSource"/></bean><!-- ibatis2.x 配置<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:myBatis-config.xml"/><property name="dataSource" ref="dataSource"/></bean>--><bean id="mapDao" class="org.mybatis.spring.MapperFactoryBean"><!-- 这里是接口,不是接口实现类了--><property name="mapperInterface" value="com.ssm.iface.IUserDao"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean><bean id="userServices" class="erServiceImpl"><property name="serviceUserDao" ref="mapDao"/></bean><bean id="LoginAction" class="com.ssm.action.LoginAction"><property name="userServices" ref="userServices"/></bean></beans>数据库连接属性配置文件(其实可以不用这么复杂)database.Propertiesjdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/ddtest?characterEncoding=utf8 ername=rootjdbc.password=123cpool.checkoutTimeout=5000cpool.minPoolSize=20cpool.maxPoolSize=50cpool.maxIdleTime=7200cpool.maxIdleTimeExcessConnections=1800cpool.acquireIncrement=10log4j 随便到log4j里copy一个吧mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC"-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><typeAliases><typeAlias alias="User" type="er"/></typeAliases><mappers><mapper resource="com/ssm/sqlmap/User.xml" /></mappers></configuration>struts配置文件struts.Properties##整合spring的struts.objectFactory=springeClassCache = truestruts.locale=zh_CNstruts.i18n.encoding=GBKstruts的Action配置文件struts.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="style" extends="struts-default"><!--<action name="loginAction" class="sys.style.design.action.LoginAction"> <result name="success">success.jsp</result><result name="error">error.jsp</result></action>--><action name="loginAction" class="com.ssm.action.LoginAction"><result name="success">success.jsp</result><result name="error">error.jsp</result></action></package></struts>。

Mybatis3详解(四)----SQL映射文件详解(XxxMapper.xml)

Mybatis3详解(四)----SQL映射文件详解(XxxMapper.xml)

Mybatis3详解(四)----SQL映射⽂件详解(XxxMapper.xml)1映射器是Mybatis中最复杂并且是最重要的组件。

它由⼀个接⼝和xml映射⽂件(或者注解)组成。

在映射器中我们可以配置各类SQL、动态SQL、缓存、存储过程、级联等复杂的内容。

并且通过简易的映射规则映射到指定的POJO或者其它对象上,映射器能有效的消除JDBC的底层代码。

在Mybatis的应⽤程序开发中,映射器的开发⼯作量占全部⼯作量的80%,可见其重要性。

映射⽂件的作⽤是⽤来配置SQL映射语句,根据不同的SQL语句性质,使⽤不同的标签,其中常⽤的标签有:<select>、<insert>、<update>、<delete>。

下⾯列出了SQL 映射⽂件的⼏个顶级元素(按照应被定义的顺序列出):元素描述cache该命名空间的缓存配置(会在缓存部分进⾏讲解)cache-ref引⽤其它命名空间的缓存配置resultMap描述如何从数据库结果集中加载对象,它是最复杂也是最强⼤的元素parameterMap定义参数映射。

此元素已被废弃,并可能在将来被移除!请使⽤⾏内参数映射parameType。

所以本⽂中不会介绍此元素sql可被其它语句引⽤的可重⽤语句块select映射查询语句insert映射插⼊语句update映射更新语句delete映射删除语句2select元素表⽰SQL 的select 语句,⽤于查询,⽽查询语句是我们⽇常中⽤的最多的,使⽤的多就意味它有着强⼤和复杂的功能,所以我们先来看看select元素的属性有哪些(加粗为最常⽤的)。

select元素中的属性属性描述id在命名空间中唯⼀的标识符,可以被⽤来引⽤这条语句parameterType将会传⼊这条语句的参数类的完全限定名或别名。

这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传⼊语句的参数,默认值为未设置(unset)parameterMap这是引⽤外部 parameterMap 的已经被废弃的⽅法。

MyBatis(三)MyBatisresultMap和注解

MyBatis(三)MyBatisresultMap和注解

MyBatis(三)MyBatisresultMap和注解MyBatis ⽬录MyBatis resultMap元素resultMap 是 MyBatis 中最复杂的元素,主要⽤于解决实体类属性名与数据库表中字段名不⼀致的情况,可以将查询结果映射成实体对象。

下⾯我们先从最简单的功能开始介绍。

resultMap元素的构成resultMap 元素还可以包含以下⼦元素,代码如下。

<resultMap id="" type=""><constructor><!-- 类再实例化时⽤来注⼊结果到构造⽅法 --><idArg/><!-- ID参数,结果为ID --><arg/><!-- 注⼊到构造⽅法的⼀个普通结果 --></constructor><id/><!-- ⽤于表⽰哪个列是主键 --><result/><!-- 注⼊到字段或JavaBean属性的普通结果 --><association property=""/><!-- ⽤于⼀对⼀关联 --><collection property=""/><!-- ⽤于⼀对多、多对多关联 --><discriminator javaType=""><!-- 使⽤结果值来决定使⽤哪个结果映射 --><case value=""/><!-- 基于某些值的结果映射 --></discriminator></resultMap>其中:元素的 type 属性表⽰需要的 POJO,id 属性是 resultMap 的唯⼀标识。

MyBatis三个查询方法_selectList_selectOne_selectMap

MyBatis三个查询方法_selectList_selectOne_selectMap

MyBatis三个查询⽅法_selectList_selectOne_selectMap mybatis-cfg.xml的配置:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!-- properties加载配置⽂件--><properties resource="db.properties"></properties><settings><setting name="logImpl" value="LOG4J"/></settings><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers ><mapper resource="com/bjsxt/mapper/UserMapper.xml"/></mappers></configuration>db.properties:jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://192.168.5.129:3306/bjsxtername=rootjdbc.password=rootlog4j.properties:# Set root category priority to INFO and its only appender to CONSOLE.log4j.rootCategory=info, CONSOLE# log4j.rootCategory=DEBUG, CONSOLE, LOGFILE# 单独设置SQL语句的输出级别为DEBUG级别# ⽅法级别# erMapper.selAll=DEBUG# 类级别# erMapper=DEBUG# 包级别.bjsxt.mapper=DEBUG# CONSOLE is set to be a ConsoleAppender using a PatternLayout.log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=- %m%l%n# LOGFILE is set to be a File appender using a PatternLayout.log4j.appender.LOGFILE=org.apache.log4j.FileAppenderlog4j.appender.LOGFILE.File=d:/test.loglog4j.appender.LOGFILE.Append=trueyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=- %m %l%nUser实体类package com.bjsxt.pojo;import java.io.Serializable;public class User implements Serializable{private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", password=" + password + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + id;result = prime * result + ((password == null) ? 0 : password.hashCode());result = prime * result + ((username == null) ? 0 : username.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (id != other.id)return false;if (password == null) {if (other.password != null)return false;} else if (!password.equals(other.password))return false;if (username == null) {if (ername != null)return false;} else if (!username.equals(ername))return false;return true;}public User() {super();}}selectList_selectOne_selectMap:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="erMapper"><select id="sellAll" resultType="er">select * from t_user</select><select id="sellOne" resultType="er">select * from t_user where id=2</select></mapper>package com.bjsxt.TestSelect;import java.io.IOException;import java.io.InputStream;import java.util.List;import java.util.Map;import java.util.Set;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.Test;import er;public class TestSelect {@Testpublic void testSelectList() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);SqlSession session = factory.openSession();List<User> list = session.selectList("erMapper.sellAll"); for (User user : list) {System.out.println(user);}session.close();}@Testpublic void testSelectOne() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);SqlSession session = factory.openSession();User u = session.selectOne("erMapper.sellOne");System.out.println(u);session.close();}@Testpublic void testSelectMap() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);SqlSession session = factory.openSession();Map<Integer, User> map = session.selectMap("erMapper.sellAll", "id"); Set<Integer> ks = map.keySet();for (Integer k : ks) {System.out.println(map.get(k));}session.close();}}。

【MyBatis系列3】最全MyBatis中XML映射文件(Mapper)标签分析及示例

【MyBatis系列3】最全MyBatis中XML映射文件(Mapper)标签分析及示例

【MyBatis系列3】最全MyBatis中XML映射⽂件(Mapper)标签分析及⽰例前⾔MyBatis的强⼤之处就在于它的映射器⽂件,⽽这也正是MyBatis的魔⼒所在,对于任何MyBatis的使⽤者来说,MyBatis的映射⽂件是必须要掌握的。

Mapper⽂件标签Mapper中⼀个提供了9个顶层标签,除了1个已经过期的我们不需要去了解,另外8个都是必须要掌握的,只要熟练掌握了标签的使⽤,使⽤MyBatis才能如鱼得⽔。

接下来我们就⼀个个来分析⼀下这些标签的使⽤。

<cache> – 该命名空间的缓存配置。

<cache-ref> – 引⽤其它命名空间的缓存配置。

<resultMap> – 描述如何从数据库结果集中加载对象,是最复杂也是最强⼤的元素。

<parameterMap> – ⽼式风格的参数映射。

此元素已被废弃,并可能在将来被移除!请使⽤⾏内参数映射。

⽂档中不会介绍此元素。

<sql> – 可被其它语句引⽤的可重⽤语句块。

<insert> – 映射插⼊语句。

<update> – 映射更新语句。

<delete> – 映射删除语句。

<select> – 映射查询语句。

selectselect⽤来映射查询语句,是我们使⽤最多的⼀种标签,也是最复杂的⼀种标签。

⽐如下⾯就是⼀个简单的select标签的使⽤<select id="listUserByUserName" parameterType="String" resultType="lwUser">select user_id,user_name from lw_user where user_name=#{userName}</select>select标签内,提供了⼀些⼆级标签,下⾯就列举出了全部的⼆级标签:<selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10000"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY"databaseId="mysql"resultOrdered="false"resultSets="xxx,xxx"lang=""></select>id必选标签。

从零开始学习黑客技术入门教程(基础)

从零开始学习黑客技术入门教程(基础)

从零开始学习黑客技术入门教程〔根底〕最简单的黑客入门教程目录1 2 3 4 5黑客简介 .................................................................. .. (2)保护自己电脑绝对不做黑客肉鸡 .................................................................. ......................... 2 抓肉鸡的几种方法 .................................................................. ................................................. 5 防止黑客通过Explorer侵入系统 .................................................................. ......................... 9 SQL注入详解 .................................................................. ...................................................... 10 5.1 注入工具 .................................................................. ................................................... 11 5.2 php+Mysql 注入的误区 .................................................................. ........................... 11 5.3 简单的例子 .................................................................. ............................................... 12 5.4 语句构造 .................................................................. ................................................... 14 5.5 高级应用 .................................................................. ................................................... 22 5.6 实........................................................... 26 5.7 注入的防范 .................................................................. ............................................... 29 5.8 我看暴库漏洞原理及规律1 ................................................................... ................... 29 5.9 我看暴库漏洞原理及规律2 ................................................................... ................... 32 跨站脚本攻击 .................................................................. ....................................................... 34 6.1 跨站脚本工具 .................................................................. ........................................... 34 6.2 什么是XSS攻击 .................................................................. ..................................... 35 6.3 如何寻找XSS漏洞 .................................................................. ................................. 35 6.4 寻找跨站漏洞 .................................................................. ........................................... 36 6.5 如何利用 .................................................................. ................................................... 36 6.6 XSS与其它技术的结合 .................................................................. .......................... 37 XPath注入 .................................................................. ............................................................ 38 7.1 XPath注入介........................................ 38 7.2 XPath注入工具 .................................................................. . (41)67声明:文章来源大多是网上收集而来,版权归其原作者所有。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、准备工作 1.去官网下载 mybatis3.1 网址:/ 2.打开 eclipse,新建 java 项目,我建的是 mybatis,把下载的文件解压,打开文件夹找到 mybatis-3.1.0.jar 文件,把这个 jar 文件引入你的项目中 3.引入数据库驱动 jar,我的是 mysql 数据库的驱动 mysql-connector-java-5.0.4-bin.jar
}
public double getComm() { return comm;
}
public void setComm(double comm) { m = comm;
}
public int getEmpno() { return empno;
}
public void setEmpno(int empno) { this.empno = empno;
二、配置文件 1.在 src 源目录下,新建 sqlMapConfig.xml 文件,复制以下内容到 xml 文件中 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN" "/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url"
} }
EmpEntity 类 package com.rogrand.entity;
import java.util.Date;
/** * * @author scofield.hello */ public class EmpEntity {
private int empno;//员工编码
private String ename;//员工名称
private String dname;//部门名称
private String location;//部门所在地
//提供无参的构造方法和有参的构造方法,getter和setter方法 public DeptEntity() { }
public DeptEntity(int deptno, String dname, String location) {
private String job;//职位
private int mgr;//上级编号
private Date hiredate;//入职时间
private double sale;//工资
private double comm;//奖金
public EmpEntity() { }
public EmpEntity(int empno, String ename, String job, int mgr, Date hiredate, double sale, double comm) {
`comm` double(7,0) default NULL, `deptno` int(10) PRIMARY KEY (`empno`) )
DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `deptno` int(10) NOT NULL auto_increment, `dname` varchar(20) NOT NULL, `location` varchar(30) default '', PRIMARY KEY (`deptno`) ) 现在,我们向这两张表里插入数据: INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', null, '20'); INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30'); INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30'); INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', null, '20'); INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30'); INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', null, '30'); INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981 -06-09', '2450', null, '10'); INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-07-15', '3000', null, '20'); INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000', null, '10'); INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500', '0', '30'); INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-07-13', '1100', null, '20'); INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', null, '30'); INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', null, '20'); INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', null, '10');
value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;chara cterEncoding=UTF-8"/>
<property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> </mappers> </configuration> 有过框架学习经验的人肯定可以看出来,dataSource元素内,是用来配置数据源 的,你需要改的地方是driver、url、username、password。 2.建数据库表,我使用的是EMP(员工)表和DEPT(部门)表,建表语句如下: DROP TABLE IF EXISTS `emp`; CREATE TABLE `emp` ( `empno` int(10) NOT NULL auto_increment, `ename` varchar(30) NOT NULL, `job` varchar(15) NOT NULL, `mgr` int(4) default NULL, `hiredate` date NOT NULL, `sale` double(7,0) NOT NULL,
相关文档
最新文档