Day02 Mybatis 学习(连接Mysql实现增删改查,支持模糊查询)
今天的任务是通过mybatis对Mysql数据的增删改查,以及模糊查询
首先附上项目的结构图
一、pom.xml文件
这个文件目前基本都是固定的,copy过来,自动导入依赖,如果不是自动导入,请看第一篇,
这里导入的有mybatis,mysql,log4j(日志),junit的依赖
<?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>com.lnw</groupId>
<artifactId>day02_eesy_01mybatisCRUD_Test</artifactId>
<version>1.0-SNAPSHOT</version>
<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>8.0.19</version>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependency>
</dependencies>
</project>
二、实体类User
这里的属性名采用的都是和数据库的字段名保持一致。如果想要采用自己的命名规范,下一篇会有解释
自己生产get set 以及toString 方法
package com.lnw.domain;
import java.util.Date;
public class User {
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 +
'}';
}
}
三、dao层的接口IUserDao
接口里主要是实现增删改查的抽象方法
package com.lnw.dao;
import com.lnw.domain.User;
import java.util.List;
public interface IUserDao {
List<User> findAll();
//保存
void saveUser(User user);
//更新
void updateUser(User user);
//删除(根据id)
void deleteUser(Integer userId);
//根据id查去用户id
User findById(Integer userId);
//模糊查询
List<User> findByName(String username);
//查询总用户数
int findTotal();
}
四、实现resources下dao层的IUserDao.xml
这里要注意,所有操作的id名都要与第三步的抽象方法名保持一致
这边涉及到resultType和parameterType:
1.resultType是sql语句查询结果集的封装类型,也就是说把sql查询的结果封装在bean里返回回去,是存数据用的。
2. paramType是从传过来的Bean中取数据放进例如insert语句的values中当实参用,是取数据用的。
<?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.lnw.dao.IUserDao">
<!--查询所有-->
<select id="findAll" resultType="com.lnw.domain.User">
select * from user;
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="com.lnw.domain.User">
insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.lnw.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<!--根据id删除-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{uid}
</delete>
<!--根据id查去用户信息-->
<select id="findById" parameterType="int" resultType="com.lnw.domain.User">
select * from user where id=#{uid}
</select>
<!--根据名称模糊查询-->
<select id="findByName" parameterType="string" resultType="com.lnw.domain.User">
select * from user where username like #{name}
</select>
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
</mapper>
五、测试类MybatisTest
大体可以分为6个步骤
1.读取配置文件
2.创建SqlSessionFactory工厂
3.使用工厂生产SqlSession对象
4.使用SqlSession创建Dao接口的代理对象
5.使用代理对象执行对象
6.关闭资源
因为前面的初始化代码和释放资源大面积相似,所以把他们放到两个方法里面
junit的两个注解:
@Before – 表示在任意使用@Test注解标注的public void方法执行之前执行
@After – 表示在任意使用@Test注解标注的public void方法执行之后执行
很好理解,Before 初始化操作要先执行,关闭资源要后执行。
package com.lnw.test;
import com.lnw.dao.IUserDao;
import com.lnw.domain.User;
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.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
private InputStream in;
private SqlSession session;
private IUserDao userDao;
@Before
public void init() throws Exception{//执行初始化操作
//1.读取配置文件
in = Test.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
session = factory.openSession(true);
//4.使用SqlSession创建Dao接口的代理对象
userDao = session.getMapper(IUserDao.class);
}
@After
public void destory() throws IOException {
//6.释放资源
session.close();
in.close();
}
//入门案例
//查询所有
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
}
//保存用户
@Test
public void testSave(){
User user = new User();
user.setUsername("saveuser");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("北京市朝阳区");
//5.使用代理对象执行对象
userDao.saveUser(user);
}
//更新用户
@Test
public void testUpdate(){
User user = new User();
user.setId(50);
user.setUsername("uuppuser");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("北京市朝阳区");
//5.使用代理对象执行对象
userDao.updateUser(user);
}
//根据学号删除学生
@Test
public void testDelete(){
userDao.deleteUser(50);
}
//根据学号查询一个
@Test
public void testFindOne(){
User user = userDao.findById(52);
System.out.println(user);
}
//测试模糊查询
@Test
public void testFindByName(){
List<User> users = userDao.findByName("%王%");
for (User user:users){
System.out.println(user);
}
}
//测试查询总记录条数
@Test
public void testTotal(){
int count = userDao.findTotal();
System.out.println(count);
}
}
执行结果演示:
1、查询全部:
数据库:
2、存储数据
数据库:
3、修改数据
数据库:
4、删除信息
数据库:
5、模糊查询(所有姓王的)
6、最后的一个查询信息总条数