MyBatis注解配置动态SQL
MySQL创建表
DROP TABLE IF EXISTS `tb_employee`;
CREATE TABLE `tb_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`loginname` varchar(18) DEFAULT NULL,
`PASSWORD` varchar(18) DEFAULT NULL,
`NAME` varchar(18) DEFAULT NULL,
`SEX` char(2) DEFAULT NULL,
`AGE` int(11) DEFAULT NULL,
`phone` varchar(21) DEFAULT NULL,
`sal` double DEFAULT NULL,
`state` varchar(18) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
INSERT INTO `tb_employee` VALUES ('1', 'jack', '123456', '杰克', '男', '45', '15315153531', '13252', 'ACTIVE');
INSERT INTO `tb_employee` VALUES ('2', 'rose', '123456', '露丝', '女', '23', '1510223426', '33261', 'ACTIVE');
INSERT INTO `tb_employee` VALUES ('3', 'tom', '123456', '汤姆', '男', '36', '156556486', '8541', 'ACTIVE');
INSERT INTO `tb_employee` VALUES ('4', 'alice', '123456', '爱丽丝', '女', '18', '1565563486', '4631', 'ACTIVE');
MyBatis连接MySQL部分
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=mysql
mybatis-config.xml
<!-- XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>
<properties resource="db.properties"/>
<!-- 指定 MyBatis 所用日志的具体实现 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
<!-- 要使延迟加载生效必须配置下面两个属性 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<environments default="mysql">
<!-- 环境配置,即连接的数据库。 -->
<environment id="mysql">
<!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
<transactionManager type="JDBC"/>
<!-- dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mappers告诉了MyBatis去哪里找持久化类的映射文件 -->
<mappers>
<mapper class="org.fkit.mapper.EmployeeMapper"/>
</mappers>
</configuration>
log4j.properties
log4j.rootLogger=ERROR, stdout
log4j.logger.org.fkit.mapper.EmployeeMapper=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
实现映射类
public class Employee implements Serializable {
private Integer id; // 主键id
private String loginname; // 登录名
private String password; // 密码
private String name; // 真实姓名
private String sex; // 性别
private Integer age; // 年龄
private String phone; // 电话
private Double sal; // 薪水
private String state; // 状态
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public String toString() {
return "Employee [id=" + id + ", loginname=" + loginname
+ ", password=" + password + ", name=" + name + ", sex=" + sex
+ ", age=" + age + ", phone=" + phone + ", sal=" + sal
+ ", state=" + state + "]";
}
}

编写连接数据库的xml文件,和log4j.properties
实现这些类和接口
获取SqlSessionFactory和SQLSession
public class FKSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory=null;
static{
try {
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
实现方法接口
public interface EmployeeMapper {
@SelectProvider(type=EmployeeDynaSqlProvider.class,method="selectWhitParam")
List<Employee> selectWhitParam(Map<String, Object> params);
@InsertProvider(type=EmployeeDynaSqlProvider.class,method="insertEmployee")
@Options(useGeneratedKeys=true,keyProperty="id")
int insertEmployee(Employee emp);
@SelectProvider(type=EmployeeDynaSqlProvider.class,method="selectWhitById")
Employee selectWhitById(Map<String, Object> params);
@UpdateProvider(type=EmployeeDynaSqlProvider.class,method="updateEmployee")
void updateEmployee(Employee emp);
@DeleteProvider(type=EmployeeDynaSqlProvider.class,method="deleteEMployee")
void deleteEMployee(Map<String, Object> params);
}
实现动态SQL类
public class EmployeeDynaSqlProvider {
/**
* 查询数据
* @param param 查询条件
* @return sql
*/
public String selectWhitParam(final Map<String, Object> param){
return new SQL(){
{
SELECT ("*");
FROM ("tb_employee");
if (param.get("id")!=null) {
WHERE ("id=#{id}");
}
if (param.get("loginname")!=null) {
WHERE ("loginname=#{loginname}");
}
if (param.get("password")!=null) {
WHERE ("PASSWORD=#{password}");
}
if (param.get("name")!=null) {
WHERE ("name=#{name}");
}
if (param.get("sex")!=null) {
WHERE ("sex=#{sex}");
}
if (param.get("age")!=null) {
WHERE ("age=#{age}");
}
if (param.get("sal")!=null) {
WHERE ("sal=#{sal}");
}
if (param.get("state")!=null) {
WHERE ("state=#{state}");
}
if (param.get("id")!=null) {
WHERE ("id=#{id}");
}
}
}.toString();
}
/**
* 插入数据
* @param emp 员工对象
* @return sql
*/
public String insertEmployee(final Employee emp){
return new SQL(){
{
INSERT_INTO("tb_employee");
if (emp.getLoginname()!=null) {
VALUES("loginname","#{loginname}");
}
if (emp.getPassword()!=null) {
VALUES("PASSWORD","#{password}");
}
if (emp.getName()!=null) {
VALUES("name","#{name}");
}
if (emp.getSex()!=null) {
VALUES("sex","#{sex}");
}
if (emp.getAge()!=null) {
VALUES("age","#{age}");
}
if (emp.getSal()!=null) {
VALUES("sal","#{sal}");
}
if (emp.getState()!=null) {
VALUES("state","#{state}");
}
if (emp.getPhone()!=null) {
VALUES("phone","#{phone}");
}
}
}.toString();
}
/**
* 查询员工
* @param param 传入参数
* @return SQL
*/
public String selectWhitById(final Map<String, Object> param){
return new SQL(){
{
SELECT ("*");
FROM ("tb_employee");
if (param.get("id")!=null) {
WHERE ("id=#{id}");
}
if (param.get("loginname")!=null) {
WHERE ("loginname=#{loginname}");
}
if (param.get("password")!=null) {
WHERE ("PASSWORD=#{password}");
}
if (param.get("name")!=null) {
WHERE ("name=#{name}");
}
if (param.get("sex")!=null) {
WHERE ("sex=#{sex}");
}
if (param.get("age")!=null) {
WHERE ("age=#{age}");
}
if (param.get("sal")!=null) {
WHERE ("sal=#{sal}");
}
if (param.get("state")!=null) {
WHERE ("state=#{state}");
}
if (param.get("id")!=null) {
WHERE ("id=#{id}");
}
}
}.toString();
}
/**
* 修改信息
* @param emp 员工对象
* @return SQL
*/
public String updateEmployee(final Employee emp){
return new SQL(){
{
UPDATE("tb_employee");
if (emp.getLoginname()!=null) {
SET ("loginname = #{loginname}");
}
if (emp.getPassword()!=null) {
SET ("password = #{password}");
}
if (emp.getName()!=null) {
SET ("name = #{name}");
}
if (emp.getSex()!=null) {
SET ("sex = #{sex}");
}
if (emp.getAge()!=null) {
SET ("age = #{age}");
}
if (emp.getPhone()!=null) {
SET ("phone = #{phone}");
}
if (emp.getSal()!=null) {
SET ("sal = #{sal}");
}
if (emp.getState()!=null) {
SET ("state = #{state}");
}
WHERE("id=#{id}");
}
}.toString();
}
/**
* 删除数据
* @param param 传入参数
* @return sql
*/
public String deleteEMployee(final Map<String, Object> param){
return new SQL(){
{
DELETE_FROM("tb_employee");
if (param.get("id")!=null) {
WHERE("id = #{id}");
}
if (param.get("loginname")!=null) {
WHERE("loginname = #{loginname}");
}
if (param.get("password")!=null) {
WHERE("password = #{password}");
}
if (param.get("name")!=null) {
WHERE("name = #{name}");
}
if (param.get("id")!=null) {
WHERE("id = #{id}");
}
if (param.get("sex")!=null) {
WHERE("sex = #{sex}");
}
if (param.get("age")!=null) {
WHERE("age = #{age}");
}
if (param.get("phone")!=null) {
WHERE("phone = #{phone}");
}
if (param.get("sal")!=null) {
WHERE("sal = #{sal}");
}
if (param.get("state")!=null) {
WHERE("state = #{state}");
}
}
}.toString();
}
}
测试类
public class DynamicSQLTest {
public static void main(String[] args) throws Exception {
SqlSession session=FKSqlSessionFactory.getSqlSession();
DynamicSQLTest dy=new DynamicSQLTest();
EmployeeMapper emp=session.getMapper(EmployeeMapper.class);
//执行查询
//dy.selectWhitParamTest(emp);
//执行插入
//dy.insertEmployee(emp);
//执行修改
//dy.updateEmployee(emp);
//执行删除
dy.deleteEMployee(emp);
//提交,关闭
session.commit();
session.close();
}
public void selectWhitParamTest(EmployeeMapper emp){
//使用MAP装载参数
Map<String,Object> param=new HashMap<String, Object>();
param.put("loginname", "jack");
param.put("password","123456");
List<Employee> list=emp.selectWhitParam(param);
System.out.println(list);
}
/**
* 插入数据
* @param empmapper
*/
public void insertEmployee(EmployeeMapper empmapper){
Employee emp=new Employee();
emp.setLoginname("angle");
emp.setPassword("123456");
emp.setSex("女");
emp.setAge(24);
emp.setPhone("1534689512");
emp.setSal(1000.2);
//emp.setState("ACTIVE");
empmapper.insertEmployee(emp);
System.out.println("插入成功,返回id:"+emp.getId());
}
public void updateEmployee(EmployeeMapper empMapper){
Map<String, Object> param=new HashMap<String, Object>();
param.put("id", 5);
Employee emp=empMapper.selectWhitById(param);
emp.setLoginname("angelBaby");
emp.setName("丽丽");
emp.setState("ACTIVE");
emp.setPhone("15102645895");
empMapper.updateEmployee(emp);
}
public void deleteEMployee(EmployeeMapper empMapper){
Map<String, Object> param=new HashMap<String, Object>();
param.put("loginname","angelBaby");
param.put("password", "123456");
empMapper.deleteEMployee(param);
}
}
MyBatis注解配置动态SQL的更多相关文章
- MyBatis 注解使用动态SQL
使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能 ...
- MyBatis注解及动态Sql
一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换M ...
- mybatis注解开发-动态SQL
实体类以及表结构 在mybatis-config.xml中注册mapper接口 -------------------------- 动态查询@SelectProvider EmployeeMappe ...
- Mybatis之注解实现动态sql
通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- mybatis中的动态SQL
在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...
- mybatis第二天——动态SQL与关联查询
大纲摘要: 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If b) Where c) Foreach d) Sql片段 3.关联查询 a) 一对一关联 b) 一 ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
随机推荐
- C#的数据类型、数据类型的转化
一.c#有15个预定义类型,其中13个是值类型,两个是引用类型(string 和 object)这里主要说明整型.浮点型.布尔型以及引用型 1.整型数据 2.浮点型 浮点型从精度有低到高有float. ...
- 【Harmony】概述
原文来自本人的微信公众号文章 系统工程实验室 引言 基于模型的系统工程(简称MBSE,英文全称Model based System Engineering )的实践至少需要三个维度的支撑 ...
- JS入门(二)
关于运算符: js中判断运算符跟数学的运算符基本差不多,就是大于>,小于<,大于等于>=,小于等于<=,等于==,不等于!=,全等于===:可以看出来,跟我们印象中的判断运算符 ...
- python服务器环境搭建(1)——本地服务器准备
去年十月底到新公司上班,由于公司旧系统存在各种问题同时不便于扩展,而公司领导对17年寄予很大的期望,用户量.收入要上一个新台阶,我经过全面评估后,决定全部用python重构过,开发一个基于微服务架构的 ...
- wemall app商城源码中基于JAVA的Android异步加载图片管理器代码
wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...
- JSP +++SERVIET总复习
一. JSP基础概念 软件架构 B/S架构:Browser/Server,浏览器-服务器 最大的优点就是:一次部署,处处访问. C/S架构:Client/Server,客户端-服务器 功能.事件丰富, ...
- 长连接 Socket.IO
概念 说到长连接,对应的就是短连接了.下面先说明一下长连接和短连接的区别: 短连接与长连接 通俗来讲,浏览器和服务器每进行一次通信,就建立一次连接,任务结束就中断连接,即短连接.相反地,假如通信结束( ...
- ViewPager详解
一.ViewPager简介 ViewPager 如其名所述,是负责翻页的一个 View.准确说是一个 ViewGrop,包含多个 View 页,在手指横向滑动屏幕时,其负责对 View 进行切换.为了 ...
- java aes encrypt
本次使用aes 对称加密算法. 选用aes的原因是,可以还原加密串. 程序如下: public static String encode(String content){ KeyGenerator k ...
- Burpsuite暴力破解
神器:burpsuite 闲话不多说,直接开搞 1.打开文件BurpLoader.jar,进入Proxy--Options,启用代理 2.打开浏览器(IE),进入Internet选项-连接-局域网设置 ...