0
点赞
收藏
分享

微信扫一扫

【MyBatis】MyBatis的CRUD操作



文章目录

  • ​​基础配置​​
  • ​​1.pom.xml依赖配置​​
  • ​​2.log4j.properties日志配置​​
  • ​​3.SqlMapConfig.xml主配置文件​​
  • ​​4.IUserDao.xml映射配置文件​​
  • ​​5.User映射类​​
  • ​​6.IUserDao持久层接口​​
  • ​​一、实现用户新增​​
  • ​​1.修改IUserDao.xml​​
  • ​​2.IUserDao持久层​​
  • ​​3.测试类​​
  • ​​二、实现用户删除​​
  • ​​1.修改IUserDao.xml​​
  • ​​2.IUserDao持久层​​
  • ​​3.测试类​​
  • ​​三、实现用户修改​​
  • ​​1.修改IUserDao.xml​​
  • ​​2.IUserDao持久层​​
  • ​​3.测试类​​
  • ​​四、实现用户查询​​
  • ​​1.修改IUserDao.xml​​
  • ​​2.IUserDao持久层​​
  • ​​3.测试类​​

基础配置

項目結構:

【MyBatis】MyBatis的CRUD操作_xml

1.pom.xml依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>MyBatisCRUD</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<dependencies>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>

</dependencies>
</project>

2.log4j.properties日志配置

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=G:\\Projects\\Log\\mybatis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

3.SqlMapConfig.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="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--事务配置-->
<transactionManager type="JDBC"/>
<!-- 配置连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

<!-- 配置映射文件的位置 -->
<mappers>
<mapper resource="com/zyx/core/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>

4.IUserDao.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="com.zyx.core.dao.IUserDao" >
<!--具体的CRUD操作-->
</mapper>

5.User映射类

【MyBatis】MyBatis的CRUD操作_xml_02

package com.zyx.core.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Date getBirthday() {
return birthday;
}

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
'}';
}
}

6.IUserDao持久层接口

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;
/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 具体的数据库操作方法
* @return
*/
。。。。。。。。;
。。。。。。。。;
。。。。。。。。;
。。。。。。。。;
}

​​返回顶部​​

一、实现用户新增

1.修改IUserDao.xml

1.添加操作的sql语句:insert into 表名(……) values (?,?,?,?..);

2.在mybatis中,不同于jdbc支出在于插入数据的值处理,之前jdbc都是使用 ==?==去匹配参数中对应的值;而在mybatis中,参数就是我们封装的实体类的属性,所以首先我们通过参数parameterType指定参数所属的类型(也就是User类,表明使用的是User类中的参数),然后在标签中填写语句的时候,使用 #{…} 来匹配参数属性值。

<?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="com.zyx.core.dao.IUserDao" >
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.zyx.core.domain.User">
insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>

2.IUserDao持久层

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 添加保存用户方法
* @param user
*/
void saveUser(User user);
}

3.测试类

  • 在测试类中我们封装init()、destroy()方法,分别用于初始化操作、释放资源操作,主要就是读取配置文件、获取sqlSession对象、创建代理对象,方便测试时直接使用。
  • 注意按照通常的形式,我们在junit测试中都需要去调用init()、destroy() 方法,依然麻烦,既然学过注释,我们可以使用@Before、@After两个注释分别标注init()、destroy() 方法,在进行测试的时候就会按照init()、测试方法、destroy()的顺序执行~

package com.zyx.core.test;

import com.zyx.core.dao.IUserDao;
import com.zyx.core.domain.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;

public class MyBatisTest {

InputStream in = null;
SqlSession sqlSession;
IUserDao iUserDao;

/**
* 初始化方法
*/
@Before // 用于在测试方法执行之前执行
public void init() {
try {
// 1.读取主配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.获取工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 3.获取sqlSession对象
sqlSession = sqlSessionFactory.openSession();
// 4.创建代理对象
iUserDao = sqlSession.getMapper(IUserDao.class);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 释放资源
*/
@After // 用于在测试方法指定之后执行
public void destroy() {
try {
// 释放资源
sqlSession.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}

@Test
public void test_saveUser() {
try {
//this.init();
// 1.执行查询所有方法
String str = "2018-03-09 12:45:00";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
User user = new User();
user.setId(49);
user.setUsername("Tom");
user.setAddress("南京");
user.setSex("男");
user.setBirthday(simpleDateFormat.parse(str));
iUserDao.saveUser(user);
//this.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}
}

【MyBatis】MyBatis的CRUD操作_apache_03

注意此时测试的时候虽然没有报错,但是并不表示成功将数据插入到了数据库中。原因在于中间的两行:

2021-04-26 17:27:07,036 377    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@58134517]
。。。。。。
2021-04-26 17:27:07,087 428 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Rolling back JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@58134517]

这里设置了默认的自动提交为false,所以事务回滚的时候直接回滚掉了,并没有真正指定该操作!!!我们需要手动在测试中进行事务提交:sqlSession.commit()

【MyBatis】MyBatis的CRUD操作_xml_04

虽然默认设置的依然是false,但是我们手动添加了事务提交,所以最终进行了结果的提交,刷新数据库可以看到添加的新数据~当然也可以将事务的提交放到公共方法destroy()中去,保证每一次操作都会有事务的提交。

​​返回顶部​​

二、实现用户删除

1.修改IUserDao.xml

1.删除操作的sql语句:delete from user where 字段xxx=?;

2.注意在删除的时候,这里使用的是id号删除。所以参数类型不再是User类,此时需要使用到包装类指明参数的类型。并且在参数类型为包装类的时候,标签中sql语句中的参数值名称没有特别要求,理论上随便写,但是为了方便理解,建议与接口层的参数名保持一致。

<?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="com.zyx.core.dao.IUserDao" >
<!-- 删除用户信息 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id};
</delete>
</mapper>

2.IUserDao持久层

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 删除用户信息
* @param id
*/
void deleteUser(Integer id);
}

3.测试类

@Test
public void test_deleteUser() {
try {
// 删除用户
iUserDao.deleteUser(41);
} catch (Exception e) {
e.printStackTrace();
}
}

【MyBatis】MyBatis的CRUD操作_apache_05

​​返回顶部​​

三、实现用户修改

1.修改IUserDao.xml

1.修改操作的sql语句:update 表名 set 字段1=?,字段2=?…. where 字段x=?;

<?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="com.zyx.core.dao.IUserDao" >
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.zyx.core.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
</update>
</mapper>

2.IUserDao持久层

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 更新用户信息
* @param user
*/
void updateUser(User user);
}

3.测试类

@Test
public void test_updateUser() {
try {
// 1.执行查询所有方法
String str = "2018-03-09 12:45:00";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
User user = new User();
user.setId(49);
user.setUsername("Jack"); // 修改名字
user.setAddress("南京");
user.setSex("男");
user.setBirthday(simpleDateFormat.parse(str));
iUserDao.updateUser(user);
} catch (Exception e) {
e.printStackTrace();
}
}

【MyBatis】MyBatis的CRUD操作_CRUD_06

​​返回顶部​​

四、实现用户查询

1.修改IUserDao.xml

1.查询所有操作的sql语句:select * from 表名;

2.不像其他操作,查询所有并没有参数而言。尽管如此我们在配置的时候也需要指明查询结果封装的对象类型,我们每查询一条记录都将其封装到对象中存储,所以这里要指明封装的对象的类型。

<?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="com.zyx.core.dao.IUserDao" >
<!-- 查询所有 resultType 指明结果的封装的类型 -->
<select id="findAll" resultType="com.zyx.core.domain.User">
select * from user;
</select>
</mapper>

2.IUserDao持久层

package com.zyx.core.dao;

import com.zyx.core.domain.User;
import java.util.List;

/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 查询所有用户信息
* @return
*/
List<User> findAll();
}

3.测试类

@Test
public void test_findAll() {
try {
//this.init();
// 1.执行查询所有方法
List<User> list = iUserDao.findAll();
for (User u : list) {
System.out.println(u);
}
//this.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}

【MyBatis】MyBatis的CRUD操作_CRUD_07

​​返回顶部​​


举报

相关推荐

0 条评论