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; /* ...
随机推荐
- Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou
android无法静态显示ui效果. Missing styles. Is the correct theme chosen for this layout? Use the Theme combo ...
- web中的安全编码
个人记录 一.Web安全验证 输入验证 防范跨站脚本XSS攻击 防止SQL注入 图片验证码 二.输入验证 经典的安全法则:永远不要相信用户提交的数据 验证内容: 用户名,密码等格式 验证长度防止数据库 ...
- redis 安装 命令
安装: http://redis.io/download 在线操作命令:http://try.redis.io/ 命令查询:https://redis.readthedocs.org/en/lates ...
- Docker网络一览
转自:http://dockone.io/article/1143 [编者的话]本文是Nuage Networks公司Filip Verloy的一篇博文,简介了一下Docker网络情况,单主机的四种模 ...
- PHP 在Win下的安装
1:安装集成环境,Wamp或者Appserv.可以快速搭建测试环境. 2:分别下载安装 下载 PHP 从此处下载免费的 PHP:http://www.php.net/downloads.php 下载 ...
- java 如何查看jdk版本&位数
java 如何查看jdk版本&位数 CreateTime--2018年4月22日18:20:18 Author:Marydon 方式一:通过dos命令实现 win+R-->cmd-- ...
- imp与impdp比较
impdp和expdp是oracle 10g及以上版本才带的命令,目的是替换imp和exp命令,但为了向后兼容,故后面命令在高版本中依然可以使用. 但imp和exp在处理跨版本的导入导出时很麻烦,而i ...
- 打开Activity时,不自动显示(弹出)虚拟键盘
打开Activity时,不自动显示(弹出)虚拟键盘 在AndroidManifest.xml文件中<activity>标签中添加属性 android:windowSoftInputMode ...
- jquery中的replaceWith()和html()的区别
区别在于,html()会替换指定元素内部的HTML,而replaceWith()会替换元素本身及其内部的HTML. //目标div <div id="myid" /> ...
- How to forcefully delete a daemonset or a pod in kubernetes cluster
I have setup a kubernetes cluster which is working fine. I created deployment with type as daemonset ...