**********************************************************************************************
一:mybatis概念
1:简介
MyBatis本是apache的一个开源项目iBatis,2010年改名为 MyBatis,
MyBatis 是一个基于Java的持久层框架。(操作数据库)
2:优点
1:半自动化的ORM实现(实体类和SQL语句之间建立映射关系)
2:SQL代码从程序代码中彻底分离,可重用
3:与JDBC相比,减少了50%以上的代码量
4:小巧灵活、简单易学,是最简单的持久化框架
5:提供XML标签,支持编写动态SQL
6:提供映射标签,支持对象与数据库的ORM字段映射
3:MyBatis缺点
1:SQL语句编写工作量大,对开发人员有一定sql技术要求
2:数据库移植性差(不同数据库,sql语句语法有所不同)
*******************************************mybatis环境搭建开始******************************************

1:导入mybatis的jar包
mybatis-3.2.2.jar
mysql-connector-java-5.1.25-bin.jar

2:创建mybatis的核心配置文件(mybatis-config.xml)
<configuration>
<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/y2t189?useUnicode=true&amp;characterEncoding=utf-8" /> 数据库的url
<property name="username" value="root" /> 用户名
<property name="password" value="zhangjiugui" /> 密码
</dataSource>
</environment>
</environments>
<!--
dao层的mapper映射文件(xml)
-->
<mappers>
<mapper resource="com/accp/y2t189/dao/UserMapper.xml" />
</mappers>
</configuration>

3: 实体类

4:数据访问的接口(dao)

public List<User> findUsers();

5:接口与sql语句的映射 UserMapper.xml

命名空间必须是响应接口的全路径
<mapper namespace="com.accp.y2t189.dao.UserMapper">

id必须和接口中的方法名一致
resultType返回值类型(返回集合的话,指定集合元素的类型)
<select id="findUsers" resultType="com.accp.y2t189.entity.User">
SELECT * FROM users
</select>

</mapper>

6:mybatis的工具类

获得SqlSession
①:读取配置文件,创建session工厂
②:在session工厂里,获得session会话
关闭session
判断session实例是否创建,不为null,就关闭session

/**
* mybatis的工具类
* 获得session
*/
public class MybatisUtil {

public static SqlSessionFactory sf; //session工厂

//获得session工厂
static {
try {
Reader is= Resources.getResourceAsReader("mybatis-config.xml");
sf= new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
e.printStackTrace();
}
}

//获得session
public static SqlSession getSession(){
return sf.openSession();
}

//关闭session
public static void closeSession(SqlSession session){
if(session !=null){
session.close();
}
}
}

7: 数据操作
//获得session
session=MybatisUtil.getSession();
//获得接口实例
List<User> listUser=session.getMapper(UserMapper.class).findUsers();
//关闭session

*******************************************mybatis环境搭建结束******************************************
*******************************************增删改开始***************************************************

/**
* 查询所有数据
* @return
*/
public List<User> findAll();
******************
<select id="findAll" resultType="entity.User">
SELECT * FROM users
</select>

**************************************************

/**
* 根据编号查询对象
* @param 用户表的主键
* @return 一个对象user
*/
public User findById(Integer userId);
******************
<select id="findById" parameterType="Integer" resultType="entity.User">
select * from users where id=#{userId}
</select>

**************************************************

/**
* 增加用户信息
* @param 一个对象数据
* @return 数据库的影响行数
*/
public Integer add(User user);
******************
<insert id="add" parameterType="entity.User">
INSERT INTO users VALUES(NULL,#{userName},#{password},#{realName})
</insert>

**************************************************

/**
* 根据编号删除对象
* @param 用户表的主键
* @return 数据库的影响行数
*/
public Integer delete(Integer id);
******************
<delete id="delete" parameterType="Integer">
delete from users where id=#{id}
</delete>

**************************************************

/**
* 修改用户信息
* @param 一个对象数据
* @return 数据库的影响行数
*/
public Integer update(User user);
******************
<!-- 根据属性的主键修改其他的属性值-->
<update id="update" parameterType="entity.User">
update users set userName=#{userName} ,password=#{password},realName=#{realName}
where id=#{id}
</update>

**************************************************

/**
* 连表查询用户信息
* 在从表的实体类中添加级联查询主表中的属性
* SELECT u.*,rolename 在用户表中添加角色表的属性-角色名称
*/
public List<User> findUserAndRole();
******************
<select id="findUserAndRole" resultType="entity.User">
SELECT u.*,rolename FROM users u INNER JOIN role r
ON u.`roleid`=r.`roleid`
</select>
**************************************************

模糊查询

//根据角色名称,模糊查询角色列表
public List<Role> findRoleByRoleName(String rolename);

<!--
<select id="findRoleByRoleName" resultMap="roleMapping">
SELECT * FROM role
where roleName like concat('%',#{rolename},'%')
</select>
-->
<select id="findRoleByRoleName" resultMap="roleMapping">
SELECT * FROM role
where roleName like "%"#{rolename}"%"
</select>
*******************************************增删改查结束***************************************************
*******************************************分页查询开始***************************************************
/**
* 多参传入的方法:
* 1:多个不同类型的参数入参时,映射文件中可以不指定参数类型,
* 接口中的方法使用注解,将注解指定的名字,传入映射文件相应属性中
* 2:也可以把多个参数封装成对象,以对象类型入参
* 分页查询
* @param from 从第几条开始查...
* @param pagesize 每页显示的记录数
* @return 当前页对象的集合
*/
public List<User> fenye(@Param("from")Integer from,@Param("pagesize")Integer pagesize);
******************
<select id="fenye" resultType="entity.User">
SELECT * FROM users u
INNER JOIN role r ON u.`roleid`=r.`roleid`
LIMIT #{from} ,#{pagesize}
</select>
*****************************
/**
* 查询总记录数
*/
public Integer count();
******************
<select id="count" resultType="Integer">
SELECT count(*) FROM users
</select>

*****************************
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
res.setContentType("text/html;charset=utf-8");

SqlSession session=MybatisUtil.getSession(); //获得mybatis的session对象
try {
Integer pagesize=3; //每页显示的记录数
Integer page=null; //当前页
String pageQian=req.getParameter("page");
if(pageQian !=null){
page=Integer.parseInt(pageQian);
}else{
page=1; //默认看第一页
}
/*
* 数据库查询总页数
*/
Integer count=session.getMapper(UserMapper.class).count();
int totalyeshu=0; //总页数
if(count%pagesize==0){
totalyeshu=count/pagesize;
}else{
totalyeshu=(count/pagesize)+1;
}
/*
* 数据库查询当前页的数据
*/
List<User> userList=session.getMapper(UserMapper.class).fenye((page-1)*pagesize, pagesize);
/*
* 将数传给前台
*/
req.setAttribute("USERLIST", userList); //集合数据
req.setAttribute("PAGE", page); //当前页
req.setAttribute("COUNT", totalyeshu); //总页数
} catch (Exception e) {
e.printStackTrace();
}finally{
MybatisUtil.closeSession(session);
}
req.getRequestDispatcher("indexFenye.jsp").forward(req, res); //转发至主页
}
*****************************
<div>
<h3 algin="right">
&lt;
<span style="font-size:12px;">共${COUNT }页 &nbsp;/&nbsp;第${PAGE}页 &nbsp;</span>
<c:if test="${PAGE>1 }">
<a href="fenye?page=1">首页</a>&nbsp;
<a href="fenye?page=${PAGE-1}">上页</a>&nbsp;
</c:if>
<c:forEach begin="1" end="${COUNT }" var="i">
<a href="fenye?page=${i}" >${i}</a>
</c:forEach>
<c:if test="${PAGE<COUNT }">
<a href="fenye?page=${PAGE+1}">下页</a>&nbsp;
<a href="fenye?page=${COUNT}">尾页</a>&nbsp;
</c:if>

<span style="font-size:12px;">GO</span>&nbsp;
<select id="goTo" onchange="goPage(this.value)" >
<c:forEach begin="1" end="${COUNT }" var="i" >
<option value="${i }" ${i==PAGE?"selected='selected'":"" } >${i }</option>
</c:forEach>
</select>
&nbsp;<span style="font-size:12px;">页</span>
&gt;
</h3>
<script>
function goPage(page){
window.location.href="fenye?page="+page;
}
</script>
</div>

*******************************************分页查询结束***************************************************

*******************************************配置文件开始***************************************************
打印测试的日志信息

1:导入jar包 log4j-1.2.17.jar

2:在src下编写配置文件
log4j.properties

3:log4j.properties内容如下:

## debug 级别
log4j.rootLogger=DEBUG,Console

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t] [%c] [%p] - %m%n
log4j.logger.com.mybatis=DEBUG

##输出sql 语句
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG</strong>

4:配置
mybatis-config.xml

<configuration>

<settings>
<setting name="logImpl" value="LOG4J" />
</settings>

<environments default="development">
</environments>
</configuration>

**************************************************
别名的创建

<settings>
</settings>

<!--类型别名 :可以在Mapper.xml映射中使用别名代替全路径名-->
<typeAliases>
<!--type:类型的全路径 alias:替代类型的别名 -->
<typeAlias alias="User" type="cn.zx.pojo.User"/>
<!--自动扫描此包下的所有javabean,自动生成一个默认别名,就是类名 -->
<!--<package name="cn.smbms.pojo"/>-->
</typeAliases>

<environments default="development">
</environments>

**************************************************
数据库的数据源参数与核心配置文件分离

1:创建src下database.properties文件

2:在database.properties下面写:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/y2t189?useUnicode=true&amp;characterEncoding=utf-8
user=root
password=zhangjiugui

3:在 mybatis-config.xml下面配置

<configuration>

<!-- 引入 database.properties 文件-->
<properties resource="database.properties"/>

<settings>
</settings>

4:将 mybatis-config.xml文件中的参数,改为 ${database.properties配置文件中相应的key}
<property name="driver" value="${driver}"/>

**************************************************
类中的字段与数据库中的属性命名不匹配

一:类中的字段与数据库中的属性命名必须一致,那么框架才会自动为我们做数据库中sql语句查询出的列与类中的属性映射

二:类中的字段与数据库中的属性命名不匹配

<!--resultMap解决映射问题 type:映射类型 id:唯一标识 -->
<resultMap type="entity.Role" id="roleMapping">
<!--主键用id标签 property:实体类中的id属性 column:数据库中id属性对应的主键列-->
<id property="id" column="roleid"></id>
<!--非主键列 property:实体类中的相应属性 column:数据库中相应属性对应的数据库的列-->
<result property="name" column="roleName"/>
</resultMap>

<!--映入自定义的映射,使用resultMap属性 -->
<select id="findRole" resultMap="roleMapping">
SELECT * FROM role
</select>

*******************************************配置文件结束***************************************************

*******************************************动态查询开始***************************************************
if动态查询
/**
* 一:动态查询
*/
public List<User> findUsers(@Param("userName")String userName,@Param("roleName")String roleName);
******************
<select id="findUsers" resultType="entity.User">
SELECT u.*,rolename FROM users u INNER JOIN role r
ON u.`roleid`=r.`roleid` where 1=1
<if test="userName !='' and userName !=null">
and userName=#{userName}
</if>
<if test="roleName !='' and roleName !=null">
and roleName=#{roleName}
</if>
</select>

**************************************************
if+where组合配置

public List<User> find(User user);

<!--
if+where:在包含语句前添加一个where 并 智能判断where、and、or关键字是否添加,
无需考虑因此产生的语法错误
-->
<select id="find" parameterType="entity.User" resultType="entity.User">
SELECT * FROM smbms_user u,smbms_role r
<where>
<if test="address!='' and address!=null">and address like CONCAT('%',#{address},'%')</if>
<if test="roleName!='' and roleName!=null">and roleName like CONCAT('%',#{roleName},'%')</if>
</where>
order by userRole desc
</select>

**************************************************
<!--
foreach (在实现 mybatis in 语句查询时特别有用)
你可以传递一个List实例或者数组作为参数对象传给MyBatis
配置文件中的parameterType是可以不配置的
参数:
1:collection:传进来的参数类型
List集合写成:”list”
数组写成:”array”,
其他复杂类型写成:包含结果集List集合,在整个map集合中的键
2:item:临时变量(每一个迭代元素的别名)
3:open:该语句以什么开始
4:close:该语句以什么结束
5:separator:多个迭代元素以什么分隔(符)
-->

sql语句in关键字的用法

//根据部门条件,获取用户表数据列表-foreach_list
public List<User> getUserByDepId_foreach_list(List<String> roleIdList);

<!-- foreach(循环List<String>参数) - 作为where中in的条件 -->
<select id="getUserByDepId_foreach_list" resultType="cn.zx.pojo.User">
select * from smbms_user where userRole in
<foreach collection="list" item="roleIds" open="(" separator="," close=")">
#{roleIds}
</foreach>
</select>

测试类
List<String> list=new ArrayList<String>();
list.add("教员");
list.add("经理");

*******************************************动态查询结束***************************************************
*******************************************配置一对多双向映射开始*****************************************

CREATE TABLE `smbms_role` (
`id` int(10) NOT NULL PRIMARY KEY COMMENT '主键ID',
`roleName` varchar(15) NOT NULL COMMENT '角色名称'
) COMMENT= '角色表'

CREATE TABLE `smbms_user` (
`id` bigint(20) PRIMARY KEY NOT NULL COMMENT '主键ID',
`userName` varchar(15) NOT NULL COMMENT '用户名称',
`userPassword` varchar(15) NOT NULL COMMENT '用户密码',
`address` varchar(30) NULL COMMENT '地址',
`userRole` int(10) NULL COMMENT '角色id'
) COMMENT= '用户表'

**************************************************
复杂映射的环境的使用场合:
1:在得到所有用户信息的同时又要得到每位用户的角色信息(一对一,在多方添加一个一方的实体属性)association
在得到所有角色信息的同时又要得到每个角色下的所有用户信息列表(一对多,在一方添加一个多方的集合属性)collection

用户:多方 角色:一方

resultMap的复杂应用
1:resultMap属性
①id:resultMap的唯一标识
②type:(映射结果的类型)Java实体类

2:resultMap子元素
①id:映射对应主键id,设置此项可提高MyBatis性能

②result:映射非主键id
property属性:映射数据库列的实体对象的属性
column属性:数据库列名或者别名

③association: 映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
复杂的类型关联,一对一内部嵌套 映射一个嵌套JavaBean属性
A: association属性:
property属性:映射数据库列的实体对象的属性名
javaType属性:完整Java类名或者别名
resultMap属性:引用外部resultMap
B: association子元素
id:映射association属性的javaType类的主键
result:映射association属性的javaType类的简单属性
property属性:映射数据库列的实体对象的属性
column属性:数据库列名或者别名

④collection: 映射到JavaBean的某个“复杂类型”属性,比如集合
复杂类型集合,一对多,内部嵌套,映射一个嵌套结果集到一个列表
A:collection:属性
property:映射数据库列的实体对象的属性
ofType:完整Java类名或者别名(集合所包括的类型)
resultMap:引用外部resultMap

注意:如果映射中出现不同字段,的名字一样,需要指定别名区分。
**************************************************
/**
* 根据用户编号获取此用户下的用户信息,及每个用户的角色信息(association)
*/
public List<User> findRoleByUserId(Integer id);

<!—
根据用户编号获取此用户下的用户信息,及每个用户的角色信息
1:在用户表中添加 private Role role; 属性 及 getset方法
2:<resultMap>:必须将要查的字段,全部映射,不然查不到数据...
(除非将mybatis全局配置文件中设置自动映射级别为FULL)
3:association:映射单个属性(多对一的关系)
4:如果映射中出现不同字段,的名字一样,需要指定别名区分。(以下标红字体部分)
-->
<resultMap type="entity.User" id="userInRole">
<id property="id" column="id"/>
<result property="userName" column="userName"/>
<result property="userPassword" column="userPassword"/>
<result property="address" column="address"/>
<result property="userRole" column="userRole"/>
<association property="role" javaType="entity.Role">
<id property="id" column="r_id"/>
<result property="roleName" column="roleName"/>
</association>
</resultMap>
<select id="findRoleByUserId" parameterType="Integer" resultMap="userInRole">
SELECT u.*,r.`id` AS r_id ,r.roleName FROM smbms_user u , smbms_role r
WHERE u.`userRole`=r.id AND u.`id`=#{id}
</select>

public void findRoleByUserId(){
session=MybatisUtil.getSqlSession();
List<User> list=session.getMapper(InfoMapper.class).findRoleByUserId(1);
for(User user :list){
System.out.println(user.getId()+"\t"+user.getUserName());
System.out.println("\t\t"+user.getRole().getId()+"\t"
+user.getRole().getRoleName());
}
}
**************************************************
/**
* 获取指定角色编号下的用户列表(collection)
*/
public List<Role> findUserByRoleId(Integer id);

<!—
获取指定角色编号下的用户列表
在角色表中添加属性:private List<User> userList; 及getset方法
获取指定角色的用户列表(collection) 映射一对多关系的关系
-->
<resultMap type="entity.Role" id="roleInUser">
<id property="id" column="r_id"/>
<result property="roleName" column="roleName"/>
<collection property="userList" ofType="entity.User" resultMap="userInRole" />
</resultMap>
<select id="findUserByRoleId" parameterType="Integer" resultMap="roleInUser">
SELECT u.*,r.`id` AS r_id ,r.roleName FROM smbms_user u , smbms_role r
WHERE u.`userRole`=r.id AND r.id=#{id}
</select>

public void findUserByRoleId(){
session=MybatisUtil.getSqlSession();
List<Role> list=session.getMapper(InfoMapper.class).findUserByRoleId(1);
for(Role role :list){
System.out.println(role.getId()+"\t"+role.getRoleName());
for(User user :role.getUserList()){
System.out.println("\t\t"+user.getUserName()+"\t"+user.getUserPassword());
}
}
}
**************************************************
<!—
基于映射复用的写法

<resultMap type="entity.User" id=" userInRole ">
<id property="id" column="id"/>
<result property="userName" column="userName"/>
<result property="userPassword" column="userPassword"/>
<result property="address" column="address"/>
<association property="role" javaType="cn.zx.pojo.Role" resultMap="roleResult"/>
</resultMap>

<resultMap type="cn.zx.pojo.Role" id="roleResult">
<id property="id" column="r_id"/>
<result property="roleName" column="roleName"/>
</resultMap>
-->
*******************************************配置一对多双向映射结束***********************************
*******************************************配置文件补充开始*****************************************
<configuration>
<settings>
<!--
实体类的属性,与数据库中的列,映射设置
设置resultMap的自动映射级别为:
NONE :禁止自动匹配 <resultMap>中必须将所有需要的实体类的属性,与数据库中的列,全部映射上
PARTIAL(默认) 自动匹配所有属性(含有association,collection的<resultMap>除外)
FULL :自动匹配所有
-->
<setting name="autoMappingBehavior" value="PARTIAL" />
</settings>

</configuration>

**************************************************
public static SqlSession createSqlSession(){
//true 关闭事务控制 默认为true 在增删改的时候有一定危险(无需手动提交或回滚事务)
//false 开启事务控制 提交sqlSession.commit(); 回滚sqlSession.rollback();
return factory.openSession(false);
}
*******************************************配置文件补充结束*****************************************
*******************************************动态查询拓展*********************************************
<!--
choose (when:分支条件 ,otherwize:以上条件都不满足执行此)
注意:此种查询结果为:只满足一种条件就执行查询
-->
<select id="getUserList_choose" resultType="User">
select * from smbms_user where 1=1
<choose>
<when test="userName != null and userName != ''">
and userName = #{userName}
</when>
<when test="userRole != null">
and userRole= #{userRole}
</when>
<otherwise>
and id=#{id}
</otherwise>
</choose>
</select>
*******************************************

//修改
public int updateUser(User user);

<!--
if/set(判断参数) 用于更新操作,在包含语句前添加一个set 并
他将自动智能判断每个if条件后是否添加",")
-->
<update id="updateUser" parameterType="entity.User">
update smbms_user
<set>
<if test="userName!='' and userName!=null">userName=#{userName},</if>
<if test="address!='' and address!=null">address =#{address},</if>
<if test="roleName!='' and roleName!=null">roleName =#{roleName},</if>
<if test="userPassword!='' and userPassword!=null">
userPassword =#{userPassword},
</if>
<if test="userRole!='' and userRole!=null">userRole =#{userRole},</if>
</set>
where id=#{id}
</update>

<!—
对整个trim包含的内容智能自动判断是否加上 prefix前缀,或者 suffix后缀
prefixOverrides:自动判断子语句if前面的条件语句是否添加或不添加其值
suffixOverrides:自动判断子语句if后边的条件语句是否添加或不添加其值
-->
<update id="updateUser" parameterType="entity.User">
update smbms_user
<trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
<if test="userName!='' and userName!=null">userName=#{userName},</if>
<if test="address!='' and address!=null">address =#{address},</if>
<if test="roleName!='' and roleName!=null">roleName =#{roleName},</if>
<if test="userPassword!='' and userPassword!=null">
userPassword =#{userPassword},
</if>
<if test="userRole!='' and userRole!=null">userRole =#{userRole},</if>
</trim>
</update>
*******************************************

<!--
foreach (在实现 mybatis in 语句查询时特别有用)
你可以传递一个List实例或者数组作为参数对象传给MyBatis
配置文件中的parameterType是可以不配置的
参数:
1:collection:传进来的参数类型
List集合写成:”list”
数组写成:”array”,
其他复杂类型写成:包含结果集List集合,在整个map集合中的键
2:item:临时变量(每一个迭代元素的别名)
3:open:该语句以什么开始
4:close:该语句以什么结束
5:separator:多个迭代元素以什么分隔(符)
-->
//根据部门条件,获取用户表数据列表-foreach_array
public List<User> getUserByDepId_foreach_array(String[] arrys);

<!-- foreach(循环array参数) - 作为where中in的条件 -->
<select id="getUserByDepId_foreach_array" resultType="cn.zx.pojo.User">
select * from smbms_user where userRole in
<foreach collection="array" item="roleId" open="(" separator="," close=")">
#{roleId}
</foreach>
</select>

String[] depIds = {"1","2"};
sqlSession = MyBatisUtil.createSqlSession();
List<User> userList = new ArrayList<User>();
userList = sqlSession.getMapper(SqlQrendMap.class).getUserByDepId_foreach_array(depIds);

***************************
//根据部门条件,获取用户表数据列表-foreach_list
public List<User> getUserByDepId_foreach_list(List<String> roleIdList);

<!-- foreach(循环List<String>参数) - 作为where中in的条件 -->
<select id="getUserByDepId_foreach_list" resultType="cn.zx.pojo.User">
select * from smbms_user where userRole in
<foreach collection="list" item="roleIds" open="(" separator="," close=")">
#{roleIds}
</foreach>
</select>

List<String> depIdList = new ArrayList<String>();
depIdList.add("1");
depIdList.add("2");
depIdList.add("4");
sqlSession = MyBatisUtil.createSqlSession();
List<User> userList = new ArrayList<User>();
userList = sqlSession.getMapper(SqlQrendMap.class).getUserByDepId_foreach_list(depIdList);
***************************
//根据用户角色列表和性别(多参数),获取该角色列表下并指定性别的用户列表信息-foreach_map -->
public List<User> getUserByConditionMap_foreach_map(Map<String,Object> map);
<select id="getUserByConditionMap_foreach_map" resultType="cn.zx.pojo.User">
select * from smbms_user where userName = #{userName} and userRole in
<foreach collection="roleIds" item="roleMap" open="(" separator="," close=")">
#{roleMap}
</foreach>
</select>
List<Integer> roleList = new ArrayList<Integer>();
roleList.add(1);
roleList.add(3);
Map<String, Object> conditionMap = new HashMap<String,Object>();
conditionMap.put("userName", "admin");
conditionMap.put("roleIds",roleList);
List<User> userList = new ArrayList<User>();
userList = sqlSession.getMapper(SqlQrendMap.class).getUserByConditionMap_foreach_map(conditionMap);

*******************************************动态查询拓展*****************************************

mybatis学习的终极宝典的更多相关文章

  1. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

  2. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...

  3. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  4. (原创)mybatis学习二,spring和mybatis的融合

    mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...

  5. (原创)mybatis学习一,夯实基础

    一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...

  6. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...

  7. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  8. 【Todo】Mybatis学习-偏理论

    之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html  <SSM(SpringMVC+Spring+Myba ...

  9. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

随机推荐

  1. QT知识整理

    1.connect函数的SIGNAL可以是按键.定时器.其他对象的信号.如果是其他对象的信号,对象必须要在当前类中实例化. 2.Qt数据类型转换 1)int转QStringint a=10;QStri ...

  2. 嵊州D3T3 light

    嵊州D3T3 light 光恰似水 兄弟俩曾经 k 次受到过父母的物质激励. 一开始,兄弟俩的能力值为 1,最后,兄弟俩的能力值是 1 + (2 ^k−1)/ n . 当兄弟俩受到价值为 mi 的物质 ...

  3. python基础认识(一)

    这些日子以来,新闻铺天盖地的都是人工智能,那么借着这股潮流,python也随之火起来了,现在的python不仅仅可以进行人工智能领域的开发.还可以进行web.爬虫等领域的运用.因此,我认为作为一个紧跟 ...

  4. c++学习书籍推荐《Beyond the C++ Standard Library》下载

    百度云及其他网盘下载地址:点我 作者简介 Björn Karlsson works as a Senior Software Engineer at ReadSoft, where he spends ...

  5. python 3.7 新特性 - popitem

    百度上大多文章说 popitem  随机删除字典的一个键值对 python 3.7 官方文档已经说了,popitem 删除字典最后一个添加进去的键值对

  6. android网络编程-socket基础

    转载http://www.eoeandroid.com/thread-61727-1-1.html 一.Socket通讯机制1. TCP连接: 面向连接的可靠传输协议,具有数据确认和数据重传机制,保证 ...

  7. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  8. 【NOIP2015】扫雷游戏-C++

    描述 扫雷游戏是一款十分经典的单机小游戏.在 n 行 m 列的雷区中有一些格子含有地雷 (称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时, 该格将会出现一个数字--提示周围 ...

  9. 安卓开发之详解getChildFragmentManager和getsupportFragmentManager和getFragmentManager详解

    安卓开发之详解getChildFragmentManager和getsupportFragmentManager和getFragmentManager详解 getFragmentManager()所得 ...

  10. TensorFlow笔记-线程和队列

    线程和队列 在使用TensorFlow进行异步计算时,队列是一种强大的机制. 为了感受一下队列,让我们来看一个简单的例子.我们先创建一个“先入先出”的队列(FIFOQueue),并将其内部所有元素初始 ...