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的更多相关文章

  1. MyBatis 注解使用动态SQL

    使用MyBatis很长时间了,一直使用的是XML配置的 SQL,刚好在上一个项目中尝试使用注解方式开发,主要是由于XML配置过于繁琐,注解可以直接写在Mapper函数上,更加的方便一些. 在注解上不能 ...

  2. MyBatis注解及动态Sql

    一.注解实现MyBatis配置 java注解是在jdk1.5版本之后开始加入的,不得不说注解对于我们开发人员来说是个很方便的东西,实现起来也非常的简单,下边我们说一下在MyBatis中使用注解来替换M ...

  3. mybatis注解开发-动态SQL

    实体类以及表结构 在mybatis-config.xml中注册mapper接口 -------------------------- 动态查询@SelectProvider EmployeeMappe ...

  4. Mybatis之注解实现动态sql

    通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...

  5. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  6. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  7. mybatis第二天——动态SQL与关联查询

    大纲摘要: 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If b) Where c) Foreach d) Sql片段 3.关联查询 a) 一对一关联 b) 一 ...

  8. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  9. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

随机推荐

  1. 项目架构开发:数据访问层之UnitOfWork

    接上文 项目架构开发:数据访问层之IQuery 本章我们继续IUnitOfWork的开发,从之前的IRepository接口中就可以看出,我们并没有处理单元事务, 数据CUD每次都是立即执行的,这样有 ...

  2. CSS中@import与link的具体区别

    我们知道在网页中引用外部CSS有两种方式:@import和link 我们也经常听到有人说要使用link来引入CSS更好,但是你知道为什么吗? 继续往下看 link:link就是把外部CSS与网页连接起 ...

  3. 辗转相除法求H.C.F小结

    辗转相除法 大纲: 问题 原理 反思 1.     问题 一个试题,请完成以下填空 下列程序是利用辗转相除法求H.C.F(最大公约数) include <stdio.h> int main ...

  4. debian/ubuntu部署java应用小结

    近期改的Java应用即将部署,为了强强联合,需要把Java应用部署到linux,我们选择了debian系列.小结一下部署的大致过程,如下: Ubuntu已经默认安装了OpenJDK,但还是比较倾向官方 ...

  5. Java面试05|MySQL及InnoDB引擎

    1.InnoDB引擎索引 InnoDB支持的索引有以下几种: (1)哈希索引 (2)全文索引 (1)B+树索引 又可以分为聚集索引与辅助索引 索引的创建可以在CREATE TABLE语句中进行,也可以 ...

  6. .进程&线程(&java.lang.Thread)详解

    一.进程与线程 进程 我们在进行操作电脑的时候,通常会打开浏览器,通讯工具等应用程序,这个时候CPU通过作业调度在内存中就会分配一些空间让它们处于宏观上的运行状态(处于可以被CPU执行的状态),而这部 ...

  7. Selenium2 WebDriver环境搭建

    1.下载Selenium Client Servers包 在Selenium官网上可以下载到最新的开源的包http://seleniumhq.org/download/,根据编写测试脚本所使用的语言下 ...

  8. ICC_lab总结——ICC_lab3:布局

    PS:字丑,禁止转载. 做到了ICC workshop的第三个实验,理论与实践相结合,于是,先放一张总结图,这张总结图来自前面的博客,放在这里用来体现理论和实践的联系: 这个就是布局的理论部分,在IC ...

  9. Ubuntu部署Jupyter

    前言 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特 ...

  10. 对于自定义标签类中JspBody类的invoke方法的理解

    下面是javaeeAPI中对于invoke()方法的介绍: 其中的参数out是一个Writer类的对象,如果写null,就是将标签体内容写到了与此jsp相关联的JspWriter对象,也就是下面的w: ...