SqlMapConfig.xml

<?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="db.properties" >
<!-- 在properties内部用property定义属性 -->
<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
<property name="jdbc.username" value="root123" />
<property name="jdbc.password" value="root123" />
</properties> <!-- 别名定义 -->
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.test.mybatis.pojo.User" />
<!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感),头字母大小写都可以 -->
<package name="com.test.mybatis.pojo"/>
<package name="其他包"/>
</typeAliases> <!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<!-- <property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://39.105.94.154:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="tom" />
<property name="password" value="tom" /> --> <property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/User.xml"/>
<mapper resource="mapper/UserMapper.xml"/> <!-- mapper的其它配置方式 -->
<!--
方式1 :使用mapper接口类路径
<mapper class="com.test.mybatis.mapper.UserMapper"/>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
--> <!-- 方式2:注册指定包下的所有mapper接口
<package name="com.test.mybatis.mapper"/>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
-->
</mappers>
</configuration>

mapper.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"> <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
<!-- 根据id查询用户 -->
<select id="queryUserById" parameterType="Integer" resultType="com.test.mybatis.pojo.User">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的? -->
select * from user where id = #{id}
</select> <!-- 实现根据用户名模糊查询用户 -->
<!-- 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
<!-- resultType的配置和返回一个结果的配置一样 -->
<select id="queryUserByUsername1" parameterType="String" resultType="com.test.mybatis.pojo.User">
select * from user where username like #{username}
</select> <!-- 如果传入的参数是简单数据类型,${}里面必须写value -->
<select id="queryUserByUsername2" parameterType="String" resultType="com.test.mybatis.pojo.User">
select * from user where username like '%${value}%'
</select> <!-- 添加用户 -->
<!--
#{username}可以看成是getUsername方法,从User中取出。
-->
<insert id="insertUser" parameterType="com.test.mybatis.pojo.User">
<!-- selectKey 标签实现主键返回 -->
<!-- keyColumn:主键对应的表中的哪一列 -->
<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
<!-- order:设置在执行insert语句前执行查询id的sql,还是在执行insert语句之后执行查询id的sql -->
<!-- resultType:设置返回的id的类型 -->
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="Integer">
select last_insert_id()
</selectKey>
insert into user
(username,birthday,sex,address) values
(#{username},#{birthday},#{sex},#{address})
</insert> <!-- 修改用户 -->
<update id="updateUser" parameterType="com.test.mybatis.pojo.User">
update user
set
username=#{username},birthday=#{birthday}
where
id=#{id}
</update> <!-- 删除用户 -->
<delete id="deleteUserById" parameterType="Integer">
delete from user where
id=#{id}
</delete>
</mapper>

数据库database.properties

这个主要是给properties标签使用的

<properties resource="database.properties" ></properties>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://39.105.94.154:3306/mybatis?characterEncoding=utf-8
jdbc.username=tom
jdbc.password=tom

Mapper动态代理方式的映射文件

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

<?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">
<!-- namespace:命名空间,用于隔离sql -->
<!-- 还有一个很重要的作用,使用动态代理开发DAO,1. namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.test.mybatis.mpper.IUserMpper">
<!-- 根据用户id查询用户 -->
<!-- 2. id必须和Mapper接口方法名一致 -->
<!-- 3. parameterType必须和接口方法参数类型一致 -->
<!-- 4. resultType必须和接口方法返回值类型一致 -->
<select id="queryUserById" parameterType="Integer" resultType="user">
select * from user where id = #{id}
</select>
<!-- 根据用户名查询用户 -->
<select id="queryUserByUsername" parameterType="String" resultType="com.test.mybatis.pojo.User">
select * from user where username like '%${value}%'
</select>
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.test.mybatis.pojo.User">
insert into user
(username,birthday,sex,address)
values
(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>

UserMapper.xml

其中包含了if where sql  foreach  include 标签的使用,还有输出结果使用resultMap="",一对多查询配置

<?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">
<!-- namespace:命名空间,用于隔离sql -->
<!-- 还有一个很重要的作用,使用动态代理开发DAO,1. namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.test.mybatis.mapper.UserMapper">
<!-- 根据用户id查询用户 -->
<!-- 2. id必须和Mapper接口方法名一致 -->
<!-- 3. parameterType必须和接口方法参数类型一致 -->
<!-- 4. resultType必须和接口方法返回值类型一致 -->
<select id="queryUserById" parameterType="Integer" resultType="user">
select * from user where id = #{id}
</select>
<!-- 根据用户名查询用户 -->
<select id="queryUserByUsername" parameterType="String" resultType="com.test.mybatis.pojo.User">
select * from user where username like '%${value}%'
</select>
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.test.mybatis.pojo.User">
insert into user
(username,birthday,sex,address)
values
(#{username},#{birthday},#{sex},#{address})
</insert> <!-- 根据用户名模糊查询用户信息 -->
<select id="queryUserByQueryVo" parameterType="com.test.mybatis.vo.QueryVo"
resultType="user">
select * from user
where
username
like
'%${user.username}%'
</select> <!-- 查询用户表数据条数 -->
<select id="countUser" resultType="Integer">
select count(*)
from user
</select> <!-- 根据性别和名字查询用户 where 可以去掉第一个前And-->
<select id="queryUserBySexAndUsername" parameterType="user" resultType="user">
<!-- select *
from user -->
<include refid="userAllFiledSelectStart"></include>
<where>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
<if test="username != null and username != ''">
and username LIKE
'%${username}%'
</if>
</where>
</select> <sql id="userAllFiledSelectStart">
select * from user
</sql> <!-- 根据多个id查询用户信息 多个ID如 (1,2,3)
public abstract List<User> queryUserByIdsFromArray(Integer[] ids);
-->
<select id="queryUserByIdsFromArray" parameterType="Integer" resultType="User">
<include refid="userAllFiledSelectStart"></include>
<where>
id in
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</where>
</select> <!--
根据多个id查询用户信息 多个ID如 (1,2,3)
public abstract List<User> queryUserByIdsFromCollection(List<Integer> ids);
-->
<select id="queryUserByIdsFromCollection" parameterType="Integer" resultType="User">
<include refid="userAllFiledSelectStart"></include>
<where>
<!-- foreach标签,进行遍历 -->
<!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
<!-- open:在前面添加的sql片段 -->
<!-- close:在结尾处添加的sql片段 -->
<!-- separator:指定遍历的元素之间使用的分隔符 -->
<foreach collection="list" item="id" separator="," open="id in (" close=")">
#{id}
</foreach>
</where>
</select> <!--
根据多个id查询用户信息 多个ID如 (1,2,3)
public abstract List<User> queryUserByIdsFromQueryVo(QueryVo vo);
-->
<select id="queryUserByIdsFromQueryVo" parameterType="com.test.mybatis.vo.QueryVo" resultType="User">
<include refid="userAllFiledSelectStart"></include>
<where>
<foreach collection="idsList" item="id" separator="," open="id in (" close=")">
#{id}
</foreach>
</where>
</select> <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
<!-- id:设置ResultMap的id -->
<resultMap type="User" id="userResultMap">
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property="id" column="id"/> <!-- 定义普通属性 -->
<result property="username" column="username"/>
<result property="sex" column="sex"/>
<result property="birthday" column="birthday"/>
<result property="address" column="address"/> <!-- 配置一对多的关系
collection :配置一对多属性
property:User里面的orders属性名
javaType:属性类型
ofType:属性中的泛型的类型
private Set<Orders> orders;
-->
<collection property="ordersList" javaType="java.util.List" ofType="Orders">
<!-- 配置主键,表示oid是关联Order的唯一标识 -->
<id property="id" column="oid"/> <!-- 定义普通属性 -->
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
</collection>
</resultMap> <!-- 查询所有用户信息及用户关联的订单信息 -->
<select id="queryAllUserInfoAssociationOrdersInfo" resultMap="userResultMap">
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime,
o.note
FROM
`user` u
LEFT JOIN `orders` o ON u.id = o.user_id
</select>
</mapper>

OrderMapper.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">
<!-- namespace:命名空间,用于隔离sql -->
<!-- 还有一个很重要的作用,使用动态代理开发DAO,1. namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.test.mybatis.mapper.OrderMapper"> <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
<!-- id:设置ResultMap的id -->
<resultMap type="Orders" id="orderResultMap">
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<!--
<id property="id" column="id"/>
--> <!-- 定义普通属性 -->
<result property="userId" column="user_id"/>
<!-- <result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/> -->
</resultMap> <!-- 查询所有的订单数据 -->
<select id="queryAllOrders" resultMap="orderResultMap">
select * from orders
</select> <!--
方式一:使用resultType封装一个对应的类OrdersToUser
询所有订单信息,关联查询下单用户信息
-->
<select id="queryAllOrdersAssociationUser1" resultType="OrdersToUser">
select
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
from orders o
left join user u on o.user_id = u.id;
</select> <resultMap type="Orders" id="ordersMap">
<id property="id" column="id"></id>
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/> <!-- association :配置一对一属性 -->
<!-- property:order里面的User属性名 -->
<!-- javaType:属性类型 -->
<association property="user" javaType="com.test.mybatis.pojo.User">
<!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
<id property="id" column="user_id" />
<result property="username" column="username"/>
<result property="address" column="address"/>
</association>
</resultMap> <!--
方式二:使用resultMap,订单实体内部包含了用户属性
//关联user,表达一对一的关系
private User user;
询所有订单信息,关联查询下单用户信息
-->
<!-- 一对一关联,查询订单,订单内部包含用户属性 -->
<select id="queryAllOrdersAssociationUser2" resultMap="ordersMap">
select
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
from orders o
left join user u on o.user_id = u.id;
</select>
</mapper>

MyBatis整合Spring--applicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 1加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" /> <!-- 2配置连接池 -->
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean> <!--3 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置mybatis核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource" />
</bean> <!-- 原始开发方式中,配置dao到spring中 -->
<bean name="userDao" class="com.mybatis.spring.dao.impl.UserDaoImpl">
<!-- 注入SqlSessionFatory -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> <!-- Mapper代理的方式开发方式一,配置Mapper代理对象 -->
<bean name="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 配置mapper接口 -->
<property name="mapperInterface" value="com.mybatis.spring.mapper.IUserMapper"></property>
<!-- 配置sqlSessionFactory -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> <!-- Mapper代理的方式开发方式二,扫描包方式配置代理
每个mapper代理对象的id就是类名,首字母小写。
om.mybatis.spring.mapper下面就算还有子包,也会扫描到的。
-->
<!--
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mybatis.spring.mapper"></property>
</bean>
-->
</beans>

最新文章

  1. Java动态代理
  2. 第3章 Linux常用命令(4)_帮助、用户管理和解压缩命令
  3. 【转】PHP 位运算应用口诀
  4. java mybatis 中sql 模糊查询
  5. laravel运行url404错误
  6. jquery的$.与$.fn的区别
  7. 在Mac中如何显示和隐藏文件
  8. 【转贴】Linux系统NGINX负载均衡404错误处理方法
  9. 10分钟学会基于ASP.NET的 JQuery实例 (转)
  10. 【转】简单理解socket
  11. MapReduce编程系列 — 3:数据去重
  12. java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序
  13. 【HDOJ】2065 &quot;红色病毒&quot;问题
  14. java的异常处理简介
  15. Stack and queue.
  16. 页面的拼装配置Appache SSI
  17. function $(id){ return document.getElementById(id); }导致所有的js不能用解决办法。。。。
  18. FMS+NGINX打造高带宽利用率的流媒体(音频+视频)环境
  19. ionic ios项目真机运行-不用开发者账号
  20. ArrayList和LinkedList源码

热门文章

  1. 深入理解java虚拟机(七)类加载的时机
  2. 洛谷P4178 Tree (点分治)
  3. android多lib库工程的自动批量构建--编写ant脚本
  4. DLL用def定义文件来导出重载函数(转)
  5. [CentOS]使用yum命令报出Error: Cannot retrieve repository metadata (repomd.xml) for repository的解决方法
  6. PHP开发实用-阿里短信服务(Short Message Service)
  7. Iframe 高度自适应 example (跨子域实现)
  8. 【python】@property装饰器
  9. C# usb设备的自动退出
  10. C语言C++编程学习:排序原理分析