最近在跟着B站传智的课程学习SSM,先学的是MyBatis,写一篇博客记录一下如何利用MyBatis实现简单的增删查改。
主要是记录一下实现过程、实现思路、注意事项、避坑。
本教程使用XML配置进行实现
一、软件环境
Java 、 IDEA 、mysql57
SQL准备:
使用mysql创建一个用户信息表,包含用户名称、生日、性别、地址、id。并插入一定的数据
SQL语句如下
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');
二、环境配置
1.首先打开IDEA并创建工程,这里不选择任何maven工程,直接创建
点击finish即可创建好
这里会报错,提示一些插件没有装好
根据红色的箭头所指的点一下就好了
2. 在项目中的pom.xml输入以下内容,对项目用到的依赖进行配置
<packaging>jar</packaging>表示打包方式为jar
依赖包括mybatis、mysql、log4j、junit这些。mybatis为数据库框架、mysql为数据库、log4j是日志系统、junit是测试模块。
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
在Java下创建package,命名为com.scu.domain
在该目录下创建我们的实体类User.class 让这个实体类实现序列化接口 implements serializable
实体类中的每个属性的类型和名称与数据库表中的一一对应
再选中各个属性,右键自动生成getter and setter方法 以及包含所有属性的to String方法
package com.scu.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer id;
private String username;
private Date Birthday;
private String sex;
private String address;
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 Date getBirthday() {
return Birthday;
}
public void setBirthday(Date birthday) {
Birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", Birthday=" + Birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
再在刚刚生成的scu包下面创建package 叫做dao
再在com.scu.dao下创建interface,名为IUserDao(自定义命名即可)
package com.scu.dao;
import java.util.List;
import com.itheima.domain.User;
/*
* 用户的持久层接口
*
* */
public interface IUserDao {
/*
* 查询所有操作
*
* */
List<User> findAll();
public void saveUser(User user);
public void updateUser(User user);
public void deleteUser(int userid);
}
在IUserDao.class接口中写入各个函数的方法体。
List<User> findAll(); //定义的查询所有的函数,返回类型为User型的List
public void saveUser(User user); //定义的新增记录的函数,传入参数类型为User对象
public void updateUser(User user);//定义的修改记录的函数,传入参数类型为User对象
public void deleteUser(int userid);//定义的删除记录的函数,传入参数为数值(id号)
在resource下面创建目录和配置文件
先创建Mybatis的配置文件 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">
<!--mybatis主配置-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源、连接池-->
<dataSource type="POOLED">
<!--配置数据库的四个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置-->
<mappers>
<mapper resource="com/scu/dao/IUserDao.xml"/>
</mappers>
</configuration>
由于resource下没有package,只有directory,因此必须一级一级创建即可创建成三级,否则只能创建一级
也在resource下创建com.scu.dao目录,在下面创建IUserDao.xml对sql语句进行配置(也可不要这部分,用注解)
在语句中配置出其操作语句的id,需要传入参数的指定parametertype,例如insert和update语句需要指定查询条件的参数
对于需要对于查询结果将进行返回的标签语句,指定其返回类型resulttype,例如select语句
<?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.scu.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.scu.domain.User">
select * from user
</select>
<insert id="saveUser" parameterType="com.scu.domain.User">
insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday})
</insert>
<update id="updateUser" parameterType="com.scu.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{id}
</delete>
</mapper>
配置好以后关键的部分就配置好了,很多部分mybatis替我们完成
接下来就是在test下面编写测试类去测试了
我们在test下的java文件夹中创建com.scu.test三级目录,再在包下面创建MyBatisTest.java
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.util.Date;
import java.util.List;
public class MybatisTest {
/*
* 入门案例
*
* */
InputStream in=null;
IUserDao userDao=null;
SqlSession session=null;
@Before
public void init() throws Exception
{
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3.使用工厂生产sqlsession对象
session=factory.openSession();
//4.使用sql session创建Dao接口的代理对象
userDao=session.getMapper(IUserDao.class);
}
@After
public void finish() throws Exception
{
session.commit();
//6.释放资源
session.close();
in.close();
}
@Test
public void TestsaveUser() throws Exception
{
User user=new User();
user.setUsername("MyBatis_saveUser");
user.setAddress("Shanghai");
user.setSex("女");
user.setBirthday(new Date());
userDao.saveUser(user);
}
@Test
public void testFindAll() throws Exception {
//5.使用代理对象执行方法
List<User> users=userDao.findAll();
for(User user:users)
{
System.out.println(user);
}
}
@Test
public void testUpdateUser() throws Exception{
User user=new User();
user.setId(49);
user.setUsername("MyBatis_testUpdateUser");
user.setAddress("Shanghai");
user.setSex("女");
user.setBirthday(new Date());
userDao.updateUser(user);
}
@Test
public void testDelete() throws Exception{
userDao.deleteUser(48);
}
}
然后需要执行什么操作,就调用对应的方法即可执行语句,我们调用testfindall函数
即可出现以下,查询成功!