文章目录
- 基础配置
- 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.测试类
基础配置
項目結構:
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映射类
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();
}
}
}
注意此时测试的时候虽然没有报错,但是并不表示成功将数据插入到了数据库中。原因在于中间的两行:
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()
虽然默认设置的依然是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();
}
}
返回顶部
三、实现用户修改
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();
}
}
返回顶部
四、实现用户查询
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();
}
}
返回顶部