Mybatis基本增删改查
核心配置文件
mybatis-config.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="jdbc.properties"/>
<!--指定什么阶段:开发、测试、生产-->
<environments default="development">
<environment id="development">
<!--transactionManager事务管理器-->
<transactionManager type="JDBC"/>
<!--dataSource数据源-->
<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>
<mappers>
<mapper resource="hsy/cool/dao/UsersMapper.xml"/>
<mapper resource="hsy/cool/dao/AccessLogsMapper.xml"/>
<mapper resource="hsy/cool/dao/NewsMapper.xml"/>
<mapper resource="hsy/cool/dao/ReplysMapper.xml"/>
<mapper resource="hsy/cool/dao/ShortReplysMapper.xml"/>
</mappers>
</configuration>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3308/news?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root
log4j.properties
log4j.rootLogger = DEBUG,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
#myApp.root param from web.xml
log4j.appender.FILE.File=log4j.log
log4j.logger.org.apache.ibatis=TRACE
log4j.logger.com.dao=TRACE
Bean类
package hsy.cool.bean;
import java.util.Date;
public class Users {
private int id;
private String nickname;
private String realname;
private String pwd;
private String phone;
private String email;
private String address;
private Date createTime;
private int type;
private String realid;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getRealid() {
return realid;
}
public void setRealid(String realid) {
this.realid = realid;
}
}
Dao层
package hsy.cool.dao;
import hsy.cool.bean.Users;
import java.util.List;
public interface UsersMapper {
Users findById(int id);
Users findByName(String name); //按照name去查,暂时不实现。
List<Users>findAll();
void add(Users user);
void update(Users user);
void delete(int id);
}
Mapper.xml
按照id查找
<?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">
<!--!DOCTYPE configuration SYSTEM "mybatis-3-config.dtd" -->
<mapper namespace="hsy.cool.dao.UsersMapper">
<!--按照id查找-->
<select id="findById" resultType="hsy.cool.bean.Users" parameterType="int">
select
id,
nickname,
realname,
pwd,
phone,
email,
address,
create_time createTime,
type,
realid
from n_users where id=#{id}
</select>
</mapper>
@Test
public void findById(){
SqlSession session=factory.openSession();
Users user=session.selectOne("hsy.cool.dao.UsersMapper.findById",2);
session.close();
//断言 assert 语言级别的断言 相当与方法
//Assert. junit包下的 junit提供的类 取代了assert
Assert.assertNotNull(user);
//测试名字
Assert.assertEquals("匿名",user.getNickname());
//测试密码
Assert.assertEquals("123",user.getPwd());
//日期类型转换
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
String srt=df.format(user.getCreateTime());
Assert.assertEquals("2020-03-21",srt);
}
查找所有用户
Mapper.xml
<!--查找所有-->
<select id="findAll" resultType="hsy.cool.bean.Users">
select
id,
nickname,
realname,
pwd,
phone,
email,
address,
create_time createTime,
type,
realid
from n_users
order by id
</select>
细节:注意 order by
测试方法
public void findAll(){
SqlSession session=factory.openSession();
List<Users> list=session.selectList("hsy.cool.dao.UsersMapper.findAll");
session.close();
Assert.assertNotNull(list);
Assert.assertEquals(4,list.size());
Assert.assertEquals("匿名啊啊啊",list.get(0).getNickname());
}
添加一个用户
Mapper.xml
<!--添加一个用户-->
<insert id="add" parameterType="hsy.cool.bean.Users">
insert into n_users(nickname,realname,pwd,phone,email,address,create_time,type,realid)
value
(#{nickname},#{realname},#{pwd},#{phone},#{email},#{address},#{createTime},#{type},#{realid})
</insert>
细节:注意id不能修改不能插入。数据库自动生成
测试方法
@Test
public void add(){
Users user=new Users();
user.setNickname("小牛");
user.setRealname("牛总");
user.setPhone("18888888");
user.setEmail("[email protected]");
user.setAddress("中国");
user.setCreateTime(new Date());
SqlSession session=factory.openSession();
session.insert("hsy.cool.dao.UsersMapper.add",user);
session.commit(); /*事务在这里不会自动提交,因此需要手动提交*/
Users userDb=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
session.close();
Assert.assertNotNull(userDb);
Assert.assertEquals("小牛",userDb.getNickname());
}
细节:注意手动提交事务
修改用户
Mapper.xml
<!--修改用户-->
<update id="update" parameterType="hsy.cool.bean.Users">
update n_users set
nickname=#{nickname},
realname=#{realname},
pwd=#{pwd},
phone=#{phone},
email=#{email},
address=#{address},
create_time=#{createTime},
type=#{type},
realid=#{realid}
where id=#{id}
</update>
细节:#{xxxx}表达式取到的是 首字母大写,前加get,后加()的方法,如#{haosy}取到的实际是getHaosy()这个方法的值。
测试方法
@Test
public void update(){
SqlSession session=factory.openSession();
Users userDb=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
userDb.setNickname("牛牛");
//crete_time 2020-04-02 14:41:34 ==>2020-04-02
//拿到的是当前时间 年月日时分秒毫秒2020-04-02 14:41:34 45
Calendar cl=Calendar.getInstance();
cl.set(Calendar.YEAR,1999);//年
cl.set(Calendar.MARCH,3); //月份是从0开始的 0-11==》1到12月
cl.set(Calendar.DAY_OF_MONTH,4);//日是从1开始的
cl.set(Calendar.HOUR_OF_DAY,14); //24小时
cl.set(Calendar.MINUTE,41);
cl.set(Calendar.SECOND,34);
cl.set(Calendar.MILLISECOND,0);
Date date=cl.getTime();
userDb.setCreateTime(date);
session.update("hsy.cool.dao.UsersMapper.update",userDb);
session.commit(); /*事务在这里不会自动提交,因此需要手动提交*/
Users user=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
Assert.assertNotNull(user);
Assert.assertEquals(date,user.getCreateTime());
Assert.assertEquals("牛牛",user.getNickname());
}
细节:
Calendar cl=Calendar.getInstance(); 这种日期类是java官方推荐的日期类,
日期类型转换SimpleDateFormat df=new SimpleDateFormat(“yyyy-MM-dd”); 这种日期类多用在web端,大家自己考虑使用。
删除用户
测试方法
@Test
public void delete(){
//主从表 父子表 主键所在的表是主表/父表,反之为从表/子表
//delete from n_users where id=1
//1.添加数据的时候,先加主表数据,再加从表数据。
//2.删除数据的时候,先删除从表数据,再删除主表数据。
SqlSession session=factory.openSession();
session.delete("hsy.cool.dao.AccessLogsMapper.delete",99);
session.delete("hsy.cool.dao.NewsMapper.delete",99);
session.delete("hsy.cool.dao.ReplysMapper.delete",99);
session.delete("hsy.cool.dao.ShortReplysMapper.delete",99);
session.delete("hsy.cool.dao.UsersMapper.delete",12);
session.commit();
//校验一下
Users users=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
Assert.assertNull(users);
}
可以看到需要补充一下代码内容,补充一下
Bean类
public class AccessLogs {
private int id;
private String ip;
private Date intime;
private int news_id;
private int users_id;
//settter/getter...
}
public class News {
private int id;
private String title;
private String content;
private int users_id;
private int category_id;
private Date pubtime;
private String keywords;
private int state;
private int check_users_id;
private Date check_time;
private int is_elite;
//settter/getter...
}
public class Replys {
private int id;
private int news_id;
private String content;
private int users_id;
private int replys_id;
private Date create_time;
//settter/getter...
}
public class ShortReplys {
private int id;
private int news_id;
private int type;
private Date create_time;
private int users_id;
//settter/getter...
}
注意:为了给大家讲课名字起的不规范,大家自己注意。
Dao层
public interface AccessLogsMapper {
void delete(int id);
}
public interface NewsMapper {
void delete(int id);
}
public interface ReplysMapper {
void delete(int id);
}
public interface ShortReplysMapper {
void delete(int id);
}
XXX.xml
<mapper namespace="hsy.cool.dao.AccessLogsMapper">
<!--删除-->
<delete id="delete" parameterType="int">
delete from n_access_logs where id=#{id}
</delete>
</mapper>
<mapper namespace="hsy.cool.dao.NewsMapper">
<!--删除-->
<delete id="delete" parameterType="int">
delete from n_news where id=#{id}
</delete>
</mapper>
<mapper namespace="hsy.cool.dao.ReplysMapper">
<!--删除-->
<delete id="delete" parameterType="int">
delete from n_replys where id=#{id}
</delete>
</mapper>
<mapper namespace="hsy.cool.dao.ShortReplysMapper">
<!--删除-->
<delete id="delete" parameterType="int">
delete from n_short_replys where id=#{id}
</delete>
</mapper>
<!--删除-->
<delete id="delete" parameterType="int">
delete from n_users where id=#{id}
</delete>
细节:
//主从表 父子表 主键所在的表是主表/父表,反之为从表/子表
//delete from n_users where id=1
//1.添加数据的时候,先加主表数据,再加从表数据。
//2.删除数据的时候,先删除从表数据,再删除主表数据。
完整测试类
package hsy.cool.dao;
import hsy.cool.bean.Users;
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.junit.Assert;
import org.junit.Test;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class UsersMapperTest {
static final String CONFIG_FILE="mybatis-config.xml";
//只要程序存在,工厂就在,所以定义成static
static SqlSessionFactory factory;
static {
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
try {
InputStream inputStream= Resources.getResourceAsStream(CONFIG_FILE);
factory=builder.build(inputStream);
}catch (Exception e){
e.printStackTrace();
}
}
@Test
public void findById(){
SqlSession session=factory.openSession();
Users user=session.selectOne("hsy.cool.dao.UsersMapper.findById",2);
session.close();
//断言 assert 语言级别的断言 相当与方法
//Assert. junit包下的 junit提供的类 取代了assert
Assert.assertNotNull(user);
//测试名字
Assert.assertEquals("匿名",user.getNickname());
//测试密码
Assert.assertEquals("123",user.getPwd());
//日期类型转换
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
String srt=df.format(user.getCreateTime());
Assert.assertEquals("2020-03-21",srt);
}
@Test
public void findAll(){
SqlSession session=factory.openSession();
List<Users> list=session.selectList("hsy.cool.dao.UsersMapper.findAll");
session.close();
Assert.assertNotNull(list);
Assert.assertEquals(4,list.size());
Assert.assertEquals("匿名啊啊啊",list.get(0).getNickname());
}
@Test
public void add(){
Users user=new Users();
user.setNickname("小牛");
user.setRealname("牛总");
user.setPhone("18888888");
user.setEmail("[email protected]");
user.setAddress("中国");
user.setCreateTime(new Date());
SqlSession session=factory.openSession();
session.insert("hsy.cool.dao.UsersMapper.add",user);
session.commit(); /*事务在这里不会自动提交,因此需要手动提交*/
Users userDb=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
session.close();
Assert.assertNotNull(userDb);
Assert.assertEquals("小牛",userDb.getNickname());
}
@Test
public void update(){
SqlSession session=factory.openSession();
Users userDb=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
userDb.setNickname("牛牛");
//crete_time 2020-04-02 14:41:34 ==>2020-04-02
//拿到的是当前时间 年月日时分秒毫秒2020-04-02 14:41:34 45
Calendar cl=Calendar.getInstance();
cl.set(Calendar.YEAR,1999);//年
cl.set(Calendar.MARCH,3); //月份是从0开始的 0-11==》1到12月
cl.set(Calendar.DAY_OF_MONTH,4);//日是从1开始的
cl.set(Calendar.HOUR_OF_DAY,14); //24小时
cl.set(Calendar.MINUTE,41);
cl.set(Calendar.SECOND,34);
cl.set(Calendar.MILLISECOND,0);
Date date=cl.getTime();
userDb.setCreateTime(date);
session.update("hsy.cool.dao.UsersMapper.update",userDb);
session.commit(); /*事务在这里不会自动提交,因此需要手动提交*/
Users user=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
Assert.assertNotNull(user);
Assert.assertEquals(date,user.getCreateTime());
Assert.assertEquals("牛牛",user.getNickname());
}
@Test
public void delete(){
//主从表 父子表 主键所在的表是主表/父表,反之为从表/子表
//delete from n_users where id=1
//1.添加数据的时候,先加主表数据,再加从表数据。
//2.删除数据的时候,先删除从表数据,再删除主表数据。
SqlSession session=factory.openSession();
session.delete("hsy.cool.dao.AccessLogsMapper.delete",99);
session.delete("hsy.cool.dao.NewsMapper.delete",99);
session.delete("hsy.cool.dao.ReplysMapper.delete",99);
session.delete("hsy.cool.dao.ShortReplysMapper.delete",99);
session.delete("hsy.cool.dao.UsersMapper.delete",12);
session.commit();
//校验一下
Users users=session.selectOne("hsy.cool.dao.UsersMapper.findById",12);
Assert.assertNull(users);
}
}