Mybatis的crud操作
介绍:
在下面展示的内容中会依次介绍:
1. crud操作在Mapper文件中的配置。
2. 对Mapper配置文件中的增删改查操作的测试。
3. 展示Log4j配置。
4. 展示mybatis.cfg.xml配置。
5. 展示pojo。
6. 展示项目结构。
1. AddminsMapper.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="test">
<select id="findlist" resultType="com.bjsxt.sxl.entity.AdminTest">
select * from a_admins
</select>
<!-- 单条记录查询,条件查询,占位符用#{}表示,其中括号里的名字随便起 -->
<select id="findone" resultType="com.bjsxt.sxl.entity.AdminTest">
select * from a_admins where id=#{id};
</select>
<!-- 单条记录查询,多条件查询,需要加paremeterType
此处括号中的名不能随便起,要和map中key键名相对应
-->
<select id="findOneMap" parameterType="map" resultType="com.bjsxt.sxl.entity.AdminTest">
select * from a_admins where id=#{id} and roleId=#{roleId};
</select>
<!-- 插入一条记录, -->
<insert id="save" parameterType="com.bjsxt.sxl.entity.AdminTest">
insert into a_admins(roleId, email, password, status, createTime, updateTime)
values(#{roleId}, #{email}, #{password}, #{status}, #{createTime}, #{updateTime});
</insert>
<!-- 插入一条记录,同时返回主键ID,方式一
parameterType:参数的类型,pojo
useGeneratedKeys:告诉Mybatis是否返回主键
keyColumn:告诉Mybatis主键的列名
keyProperty:告诉Mybatis主键放到POJO的哪个属性中
-->
<insert id="save1" parameterType="com.bjsxt.sxl.entity.AdminTest" useGeneratedKeys="true"
keyColumn="id" keyProperty="id">
insert into a_admins(roleId, email, password, status, createTime, updateTime)
values(#{roleId}, #{email}, #{password}, #{status}, #{createTime}, #{updateTime});
</insert>
<!-- 插入一条记录,同时返回主键ID,方式二
parameterType:参数的类型,pojo
-->
<insert id="save2" parameterType="com.bjsxt.sxl.entity.AdminTest" >
insert into a_admins(roleId, email, password, status, createTime, updateTime)
values(#{roleId}, #{email}, #{password}, #{status}, #{createTime}, #{updateTime});
<!--
selectKey:获取添加的sql语句执行之后获取的主键
keyColumn:告诉Mybatis主键的列名
keyProperty:告诉Mybatis主键放到POJO的哪个属性中
order:告诉 Mybatis SelectKey里面的sql语句在Insert语句执行之前还是之后;
当order的值是BEFORE时在有序列的数据库中使用,此时是先获取Id在执行sql语句。
resultType:告诉Mybatis id是什么类型
注意:order="AFTER"中的after必须大写
-->
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
<!-- 获取Mysql新插入的sql记录的最新ID,必须和插入语句一块使用 ,此处有两种方式-->
<!-- 方式一 -->
<!--select last_insert_id();-->
<!-- 方式二 -->
select @@identity;
</selectKey>
</insert>
<!-- 更新一条记录
parameterType:pojo类型
-->
<update id="update" parameterType="com.bjsxt.sxl.entity.AdminTest" >
update a_admins
set `roleId`=#{roleId}, `email`=#{email}, `password`=#{password},
`status`=#{status}, `createTime`=#{createTime}, `updateTime`=#{updateTime}
WHERE `id`=#{id} LIMIT 1
</update>
<!-- 删除一条记录,按照id删除
parameterType: sql语句的条件,类型为:int:
此处parameterType的值为删除时的条件值的类型,比如按照ID删除,Id的类型为int,所以
此处值为int 。
#{值:随便写}
-->
<delete id="delete" parameterType="int">
delete from a_admins where id=#{aaasd};
</delete>
</mapper>
2.MainTest02.java
package com.bjsxt.sxl.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.bjsxt.sxl.entity.AdminTest;
public class MainTest02
{
private Logger logger = LogManager.getLogger();
private SqlSessionFactory sessionFactory;
@Before
public void init()
{
try
{
//1.加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.cfg.xml");
//2.sessionFactory==driverManager
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e)
{
this.logger.error("mybatis初始化报错",e);
}
}
/**
* 单条记录查询,参数2:表示的是sql语句需要的条件
*/
@Test
public void test1()
{
//3. session ====connection
SqlSession session = this.sessionFactory.openSession();
//4.单条记录查询
AdminTest admins =session.selectOne("test.findone",2);
this.logger.info("id:{},email:{},createTime:{}",
admins.getId(),admins.getEmail(),admins.getCreateTime().toLocaleString());
session.close();
}
/**
* 单条记录查询,多条件查询,map中传条件值
* 注意:进行空验证
* selectOne中的参数2:表示的是sql语句需要的条件
*/
@Test
public void test2()
{
SqlSession session = this.sessionFactory.openSession();
Map<String,Object> map = new HashMap<String,Object>();
map.put("id", 1);
map.put("roleId",2);
AdminTest admins = session.selectOne("test.findOneMap", map);
if(admins !=null){
this.logger.info("id:{},email:{},createTime:{}",
admins.getId(),admins.getEmail(),admins.getCreateTime().toLocaleString());
}
else{
this.logger.info("-----不存在此记录-------");
}
session.close();
}
/**
* 插入一条记录
* 在insert中第一个参数表示sql语句
* 第二个参数表示条件parameterType,即插入的对象类型
*/
@Test
public void test3()
{
SqlSession session = this.sessionFactory.openSession();
try
{
AdminTest admins = new AdminTest();
admins.setEmail("22");
admins.setPassword("22");
admins.setCreateTime(new Date());
admins.setUpdateTime(new Date());
session.insert("test.save", admins);
session.commit();
} catch (Exception e)
{
this.logger.error("添加失败",e);
session.rollback();
}finally
{
session.close();
}
}
/**
* 插入一条记录,返回主键ID方式一
* 在insert中第一个参数表示sql语句,
* 第二个参数表示条件parameterType,即插入的对象类型
* 需求:此处要求在插入记录的同时返回主键ID值
*/
@Test
public void test4()
{
SqlSession session = this.sessionFactory.openSession();
try
{
AdminTest admins = new AdminTest();
admins.setEmail("33");
admins.setPassword("33");
admins.setCreateTime(new Date());
admins.setUpdateTime(new Date());
//插入记录,返回主键ID
session.insert("test.save1", admins);
this.logger.info("主键ID:{}",admins.getId());
session.commit();
} catch (Exception e)
{
this.logger.error("添加失败",e);
session.rollback();
}finally
{
session.close();
}
}
/**
* 插入一条记录,返回主键ID,方式二
* 在insert中第一个参数表示sql语句,
* 第二个参数表示条件parameterType,即插入的对象类型
* 需求:此处要求在插入记录的同时返回主键ID值
*/
@Test
public void test5()
{
SqlSession session = this.sessionFactory.openSession();
try
{
AdminTest admins = new AdminTest();
admins.setEmail("33");
admins.setPassword("33");
admins.setCreateTime(new Date());
admins.setUpdateTime(new Date());
//插入记录,返回主键ID
session.insert("test.save2", admins);
this.logger.info("主键ID:{}",admins.getId());
session.commit();
} catch (Exception e)
{
this.logger.error("添加失败",e);
session.rollback();
}finally
{
session.close();
}
}
/**
* 更新记录操作
*/
@Test
public void test6()
{
SqlSession session = this.sessionFactory.openSession();
try
{
/*AdminTest admins = new AdminTest();
admins.setId(1);
admins.setEmail("33");
admins.setPassword("33");
admins.setCreateTime(new Date());
admins.setUpdateTime(new Date());*/
/* 先根据id查询出来
* 更新指定的属性即可
* */
AdminTest admins = session.selectOne("test.findone",2);
admins.setEmail("88888888");
/*
* 参数1:表示的是sql语句
* 参数2:条件parameterType
* 返回值:含义:此sql语句执行以后对数据库影响的条数
* */
int res = session.update("test.update", admins);
this.logger.info("主键ID:{}",admins.getId());
/* 事务提交 可以不用提交,在更新操作中事务会自动提交*/
session.commit();
} catch (Exception e)
{
this.logger.error("添加失败",e);
session.rollback();
}finally
{
session.close();
}
}
/**
* 删除操作
*/
@Test
public void test7()
{
SqlSession session = this.sessionFactory.openSession();
try
{
/*
* 参数1:表示的是sql语句
* 参数2:条件
* 返回值:含义:此sql语句执行以后对数据库影响的条数
* */
int res = session.delete("test.delete", 1);
this.logger.info("更新的结果:{}",res);
session.commit();
} catch (Exception e)
{
this.logger.error("添加失败",e);
session.rollback();
}finally
{
session.close();
}
}
@After
public void close()
{
this.logger.info("--------关闭--------");
}
}
3. Log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
<!-- 系统打印日志
name:名字,唯一噢
fileName:文件的路径,默认放到classpath中
filePattern:文件名的规则
%d{yyyy-MM-dd}:日期
i:如果当天的文件超出了最大值(大小),重新改名,从1开始,依次1
与SizeBasedTriggeringPolicy相响应,表示每1m一个文件
-->
<RollingRandomAccessFile name="System" fileName="logs/system.log" filePattern="logs/system_%d{yyyy-MM-dd}_%i.log">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!--
每一个文件的大小
-->
<SizeBasedTriggeringPolicy size="1M" />
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!-- 级别优先级:
trace:最低的,
debug:一般打印一些提示信息:给开发人员看的
info:提示信息:一般是给运维看的
warn:警告一下
error:代码报异常,把异常信息记录下来
-->
<Root level="debug">
<AppenderRef ref="STDOUT"/>
<!-- 引入日志记录文件的标签配置名称 -->
<AppenderRef ref="System"/>
</Root>
</Loggers>
</Configuration>
4. mybatis.cfg.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>
<environments default="myDefault">
<environment id="myDefault">
<!-- 数据库中的事务管理器 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 连接池:里边内容包括驱动、url、用户名、密码 -->
<dataSource type="POOLED">
<!-- 驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- url -->
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<!-- 用户名 -->
<property name="username" value="root"/>
<!-- 密码 -->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/bjsxt/sxl/entity/AddminsMapper.xml"/>
</mappers>
</configuration>
5. pojo实体
MianTest.java
package com.bjsxt.sxl.entity;
import java.util.Date;
public class AdminTest
{
private int id;
private int roleId;
private String email;
private String password;
private byte status;
private Date createTime;
private Date updateTime;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public int getRoleId()
{
return roleId;
}
public void setRoleId(int roleId)
{
this.roleId = roleId;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public byte getStatus()
{
return status;
}
public void setStatus(byte status)
{
this.status = status;
}
public Date getCreateTime()
{
return createTime;
}
public void setCreateTime(Date createTime)
{
this.createTime = createTime;
}
public Date getUpdateTime()
{
return updateTime;
}
public void setUpdateTime(Date updateTime)
{
this.updateTime = updateTime;
}
}
6. 项目结构