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; /* ...
随机推荐
- leetcode笔记:Sqrt(x)
一. 题目描写叙述 Implement int sqrt(int x). Compute and return the square root of x. 二. 题目分析 该题要求实现求根公式,该题还 ...
- hbase-0.94安装方法具体解释
先决条件: 1)java环境,须要安装java1.6以上版本号 2)hadoop环境.因为HBase架构是基于其它文件存储系统的,因此在分布式模式下安装Hadoop是必须的,可是,假设 ...
- 基于Mongodb进行分布式数据存储
http://blog.csdn.net/daizhj/article/details/5868360 注:本文是研究Mongodb分布式数据存储的副产品,通过本文的相关步骤可以将一个大表中的数据分布 ...
- Angular CLI的安装及使用
安装命令行 npm install -g @angular/cli 检查命令行 ng v 使用这个命令可以检查 angular cli是否安装成功.我检查的时候发现没有安装成功,提示我使用的node. ...
- iOS app集成支付宝支付流程及后台php订单签名处理
iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付 ...
- 商业价值:苹果iTV,再一次改变世界?
苹果(Apple)公司打算进军智能电视领域,这在行业里已经不是秘密,有关苹果智能电视的消息也是不绝于耳,结合苹果产品线的命名规则,苹果智能 电视基本上就是iTV.就目前而言,Android智能系统已经 ...
- Hibernate(十二)Criteria查询
一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ...
- Mount 挂载错误mount:block device /dev/sr0 is write – protected , mounting read-only
Mount 挂载错误mount:block device /dev/sr0 is write – protected , mounting read-only 安装虚拟机出现以下提示: mount:b ...
- spring task:annotation-driven 定时任务
1.配置文件加上<task:annotation-driven/> 2.要运行的方法前加上 @Scheduled(cron="0 00 12 1 * ?") //每月 ...
- java 类名.class、object.getClass()和Class.forName()的区别 精析
1.介绍 getClass()介绍 java是面向对象语言,即万物皆对象,所有的对象都直接或间接继承自Object类: Object类中有getClass()方法,通过这个方法就可以获得一个实 ...