mybatis 一二事(2) - 动态代理
db.properties 单独提取出来的数据库配置,方便以后维护管理
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
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" /> <!--
全局配置参数
比如 二级缓存 延迟加载...等
此全局参数会影响mybatis运行的性能,要谨慎配置
-->
<!-- <settings> -->
<!-- <setting name="" value=""/> -->
<!-- </settings> --> <!-- 定义别名 -->
<typeAliases>
<!-- 单个别名定义
type:pojo的路径
alias:别名的名称
-->
<!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
<!-- 批量别名定义
name:指定包名,将包下边的所有pojo定义别名 ,别名为类名(首字母大写或小写都行)
-->
<package name="com.mybatis.bean"/>
</typeAliases> <!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<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> <!-- 配置mapper映射文件 -->
<mappers>
<!-- resource方式
在UserMapper.xml,定义namespace为mapper接口的地址,映射文件通过namespace找到对应的mapper接口文件
-->
<!-- <mapper resource="sqlmap/UserMapper.xml" /> -->
<!-- class方式
class:指定 mapper接口的地址
遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同
-->
<!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> --> <!--
批量mapper扫描
遵循规则:将mapper.xml和mapper.java文件放在一个目录 且文件名相同
主要以这样的方式为主来加载mapper
-->
<package name="com.mybatis.mapper"/> </mappers>
</configuration>
UserMapper.java
package com.mybatis.mapper; import java.util.List;
import java.util.Map; import com.mybatis.bean.QueryVo;
import com.mybatis.bean.User; public interface UserMapper { public User findUserById(int id) throws Exception; public List<User> findUserList(String name) throws Exception; public Integer insertUser(User user) throws Exception; public void deleteUser(int id) throws Exception; public void updateUser(User user) throws Exception; public List<User> findUserByBean(User user) throws Exception; public List<User> findUserByMap(Map<String, Object> map) throws Exception; public List<User> findUserByCustom(QueryVo queryVo) throws Exception; // public Map findUserMapByCustom(QueryVo queryVo) throws Exception; public void updateUserSet(User user) throws Exception; }
UserMapper.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.mybatis.mapper.UserMapper" > <!--
sql 片段,可以供其他的sql一起使用
建议以单表抽取查询条件
-->
<sql id="query_for_user">
<if test=" user != null ">
<if test=" user.name != null and user.name != '' ">
and name like '%${user.name}%'
</if>
<if test=" user.sex != null and user.sex != '' ">
and sex = #{user.sex}
</if>
</if> <if test="ids != null">
<foreach collection="ids" separator="or" item="item" open="and (" close=")">
id = #{item}
</foreach>
</if>
</sql> <select id="findUserById" parameterType="int" resultType="com.mybatis.bean.User">
SELECT * FROM USER WHERE id = #{id}
</select> <!--
#{} 表示占位符,#{}可以使用value或者其他字符,可以防止sql注入,使用时无需考虑参数的类型
${} 表示sql拼接,把原始的内容不加修饰的放入sql中,${}只能使用value,不可以防止sql注入,必须考虑参数的类型
一般在没有特殊情况下使用#{}为主
有些情况必须使用${},比如
动态拼接表名:select * from ${tablename}, 如果使用了#{}则会在传入的表名上加单引号 ''
动态拼接排序字段:select * from user order by ${username} 举个栗子:
查询日期的区别:
select * from user where birthday >= #{date}
select * from user where birthday >= to_date('${date}', 'yyyy-MM-dd')
--> <select id="findUserList" parameterType="java.lang.String" resultType="com.mybatis.bean.User" >
select * from user where name like '%${value}%'
</select> <insert id="insertUser" parameterType="com.mybatis.bean.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(name,age,sex) values(#{name},#{age},#{sex})
</insert> <delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete> <update id="updateUser" parameterType="com.mybatis.bean.User">
update user set name=#{name},age=#{age},sex=#{sex} where id=#{id}
</update> <select id="findUserByBean" parameterType="User" resultType="User">
select * from user where name like '%${name}%' and sex = #{sex}
</select> <select id="findUserByMap" parameterType="hashmap" resultType="User">
select * from user where name like '%${name}%' and age >= #{age}
</select> <!--
parameterMap 已经过期不建议使用, 官方已经废除
resultMap 不建议使用,太复杂
-->
<select id="findUserByCustom" parameterType="QueryVo" resultType="User">
select * from user <!--
where标签自动将 where后的第一个and去掉,比where 1=1 and 要好很多
where name like '%${user.name}%' and sex = #{user.sex}
-->
<!-- <where> -->
<!-- <if test=" user != null "> -->
<!-- <if test=" user.name != null and user.name != '' "> -->
<!-- and name like '%${user.name}%' -->
<!-- </if> -->
<!-- <if test=" user.sex != null and user.sex != '' "> -->
<!-- and sex = #{user.sex} -->
<!-- </if> -->
<!-- </if> -->
<!-- </where> --> <where>
<include refid="query_for_user"></include>
</where> </select> <!--
不建议使用map作为返回值,因为在代码中需要对key进行硬编码
-->
<!-- <select id="findUserMapByCustom" parameterType="QueryVo" resultType="hashmap"> -->
<!-- select * from user where name like '%${user.name}%' and sex >= #{user.sex} -->
<!-- </select> --> <update id="updateUserSet" parameterType="User">
update user
<set>
<if test="name != null and name != '' ">
name = #{name},
</if>
<if test="age != null and age != '' and age != 0 ">
age = #{age},
</if>
<if test="sex != null and sex != '' ">
sex = #{sex},
</if>
</set>
where id = #{id};
</update> </mapper>
QueryVo.java
package com.mybatis.bean; import java.util.List; /**
* 查询的封装类
*
* @author leechenxiang
* @date 2016年3月5日
*
*/
public class QueryVo { private User user; private UserCustom uc; private List<Integer> ids; public UserCustom getUc() {
return uc;
} public void setUc(UserCustom uc) {
this.uc = uc;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public List<Integer> getIds() {
return ids;
} public void setIds(List<Integer> ids) {
this.ids = ids;
} }
User.java
package com.mybatis.bean;
public class User {
private int id;
private String name;
private int age;
private String sex;
public User() {
super();
}
public User(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
+ sex + "]";
}
}
UserCustom.java
package com.mybatis.bean; /**
* 扩展User的自定义类
* 扩展对象以'XxxxCustom'的格式命名
*
* @author leechenxiang
* @date 2016年3月5日
*
*/
public class UserCustom extends User { private String youngOrOld; public String getYoungOrOld() {
return youngOrOld;
} public void setYoungOrOld(String youngOrOld) {
this.youngOrOld = youngOrOld;
} }
最后附上github地址:https://github.com/leechenxiang/mybatis002-dynamic-proxy
mybatis 一二事(2) - 动态代理的更多相关文章
- mybatis 基础1(动态代理)
我目前使用的是mybatis 3.3.0版本. 可使用 1.xml文本, 2.dao类, 3.sqlSession.getMapper(Class<T> type), 生成sql类, 原理 ...
- MyBatis 源码分析——动态代理
MyBatis框架是如何去执行SQL语句?相信不只是你们,笔者也想要知道是如何进行的.相信有上一章的引导大家都知道SqlSession接口的作用.当然默认情况下还是使用DefaultSqlSessio ...
- Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)
1.原始方法开发Dao Dao接口 package cn.sm1234.dao; import java.util.List; import cn.sm1234.domain.Customer; pu ...
- mybatis 一二事(1) - 简单介绍
mybatis呢是一个orm数据库框架,非常适合新人学,门槛相对较低 本人呢曾经是先做的hibernate,后接触的mybatis,接触mabatis前我比较抵触,为啥呢, 当时喜欢hibernate ...
- Spring与MyBatis整合上_Mapper动态代理方式
将MyBatis与Spring进行整合,主要解决的问题就是将SqlSessionFactory对象交由Spring来管理..所以该整合,只需将SQLSessionFactory的对象生成器S ...
- MyBatis底层实现原理: 动态代理的运用
转载:https://mp.weixin.qq.com/s/_6nyhaWX15mh3mkj8Lb0Zw Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口 ...
- nginx 一二事(3) - 反向代理以及负载均衡
先来说说正向代理 就是普通的代理,记得高中年代偷跑去网吧是要办卡的 题外话: 就是这货...相信很多80同龄人都有吧... 回到正题,那正向代理就不让你直接访问网络,而需要登录一下网吧的某个系统 ...
- mybatis 一二事(3) - 多表关联查询
db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/order jdbc.user ...
- mybatis快速入门(八)-spring-mybatis动态代理整合
将上一节的代码改造下就好了,不过这一章会加一个basedaomapper.废话不多说直接上代码了. 创建一个BaseDaoMapper.java package cn.my.sm.mapper; /* ...
随机推荐
- ionic3打包失败的解决办法
使用命令行: $ ionic cordova build android --release 打包android的时候,提示生成失败,原因是没有找到gradle,我的电脑因为安装了Android St ...
- php之快速入门学习-11(数组排序)
PHP 数组排序 数组中的元素可以按字母或数字顺序进行降序或升序排列. PHP - 数组排序函数 在本章中,我们将一一介绍下列 PHP 数组排序函数: sort() - 对数组进行升序排列 rsort ...
- vue 笔记一
vue: 读音: v-u-e view vue到底是什么? 一个mvvm框架(库).和angular类似 比较容易上手.小巧 mvc: mvp mvvm mv* mvx 官网:http://cn.vu ...
- inode备忘
文件名 -> inode -> device block 转自:http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一 ...
- mysql-cluster 7.3.5-linux 安装
[集群环境] 管理节点 10.0.0.19 数据节点 10.0.0.12 10.0.0.17 sql节点 10.0.0.18 10.0.0 ...
- 【FAI】七日年化收益与万份收益的理解
七日年化收益:其实指的一年的收益(应该忽略”七日”),这里的七日指的是取最近七日年化的结果 万份收益:每万元每天的收益 可以使用下图来清晰识别: 例子: 10000元按照5%的七日年化收益计算的话: ...
- 一个简单的knockout.js 和easyui的绑定
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...
- linux 2>&1的用法
linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2.STDIN就是标准输入,默认从键盘读取信息:STDOUT是标准输出,默认将输出结果输出至终端,也就 ...
- FFmpeg基础库编程开发学习笔记——视频常见格式
声明一下:这些关于ffmpeg的文章仅仅是用于记录我的学习历程和以便于以后查阅,文章中的一些文字可能是直接摘自于其它文章.书籍或者文献,学习ffmpeg相关知识是为了使用在Android上,我也才是刚 ...
- 用Canvas为网页加入动态背景
近期刚刚接到为微信公众帐号"玩转三里屯"制作首页的任务. 考虑到页面仅仅在手机中浏览.并且手机对canvas的支持又很好,所以打算使用canvas做点不一样的动画. 首先来看下效果 ...