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 ...
随机推荐
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-3
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 创建.查询.更新.删除 这章主要讲解使用EF完成 增删改查的功能. 自定义"详情信息"页面 我们通过基架生成的代 ...
- 关于百度地图js api的getCurrentPosition定位不准确的解决方法
很久之前帮大叔解决了一个gps坐标转换为百度地图坐标的问题.今天大叔又给我讲百度地图定位不准.我查了一下api,用了官方给出的这样一组函数. //创建查询对象 var geolocation = ne ...
- 通讯录--(iOS9独有的方法)
导入库文件 #import <ContactsUI/ContactsUI.h> #pragma mark iOS9 新出的点击通讯录的获取信息的办法 #pragma mark - 先弹 ...
- Android:百度地图 + 百度导航
地图SDK 开发指南:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction 导航SDK开发指南:http://lb ...
- Cannot use ImageField because Pillow is not installed.
现象描述: 使用 ImageField ,创建数据库表时,提示如下: Cannot use ImageField because Pillow is not installed. HINT: Get ...
- C++数据
const :常量 ~x == -++x == -(x+1) 二进制数,1变为0,0变为1 ^ 相同为0,不同为1 & ...
- Linux环境Perl链接MS Sql Server数据库
1.下载相关软件 unixODBC.freetds和DBD-ODBC ①.Linux系统的ODBC unixODBC-2.3.4.tar.gz ( http://www.unixodbc.org) ② ...
- Android-自定义控件之时针-霞辉
注释已经比较详细了,废话就不多说了.贴代码了 时针分针秒钟都做上去了,采用的方法也很简单,仔细看一会就能看懂 自定义View类 package com.xh.mytime; import java.u ...
- 任务调度之集群(基于Quartz.net)
上一篇我们完成了任务调度的持久化,传送门:任务调度之持久化(基于Quartz.net) 这篇我们来完成Quartz.net的一个比较优秀的功能,即集群:集群可以提高任务调度服务的容灾性, 当一个节点宕 ...
- 常用PHP函数整理
is_upload_file() 判断文件是不是通过HTTP POST 方式上传来的in_array() 判断变量在不在数组范围内move_uploaded_file() 将上传的临时名移到指定文件夹 ...