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; /* ...
随机推荐
- Java从零开始学三十八(JAVA IO- 重定向IO)
一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重 ...
- Shell解释器(学习笔记四)
一.Shell解释器 shell解释器,用户和操作系统内核之间的桥梁 shell介于操作系统内核与用户之间,负责接收用户输入的操作指令(命令),并运行和解释,将需要执行的操作传递给操作系统内核并执行 ...
- POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见 先把全部线段存下来 并按x ...
- Android Gson解析json详解
目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...
- win7,8,10取得|取消管理员权限
取得: Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\runas]@=”管理员取得所有权”“NoWorkingDirec ...
- 转:基于 linux 平台的 libpcap 源代码分析
libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础.Libpcap 可以在绝大多数类 unix 平台下工作,本文分析了 libpcap 在 linu ...
- http1.1 协议响应方面参数
HTTP1.1 提供了一个必须的Host字段,而且建立好一次连接之后可以重复使用.提高用户的上网体验. 响应信息 HTTP/1.1 200 OK ...
- 【LeetCode】47. Permutations II
Permutations II Given a collection of numbers that might contain duplicates, return all possible uni ...
- 【LeetCode】150. Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...
- 使用Wireshark mac下抓取分析iphone数据包 --IOS端
mac系统版本:mac 10.10 Yosemite xcode版本:6.3.1 在追踪bug或者分析借鉴其他公司的app通讯思路时,抓包这件事是非常有必要的.下面说说Wireshark怎么截获iph ...