本文只用于个人复习mybatis使用:
1 简单理解Mybatis
先看一下官方的定义:
- Mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
(也就是说,我们写代码时只需要关注sql语句和它的返回结果就行,其他的什么数据库连接,prepareStatement(sql)、executeUpdate()统统不用管) - 遵循ORM(Object Relational Mapping)对象关系映射。简单地说,就是把数据库表和实体类及实体类的属性对应起来,让我们可以通过操作实体类来操作数据库表。
(可以理解为我在java中定义了实体类,数据库也有这个实体类对应的表,我就可以直接通过实体类来多表进行增删查改操作)
2 Mybatis配置
2.1 添加Mybatis依赖
在pom.xml找到 <dependencies> </dependencies>标签,在里面加入下面的子标签:
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
<scope>runtime</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId> <!-- 提供assertEquals等断言方法、@Test等测试注解 -->
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId> <!-- 提供@ParameterizedTest、@ValueSource、@CsvSource等 -->
<artifactId>junit-jupiter-params</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
2.2 在resources文件下创建一个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">
<!-- mybatis主配置文件 -->
<configuration>
<!-- 全局变量 -->
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<!-- 配置环境 -->
<environments default="mysql_config">
<!-- 配置mysql环境 -->
<environment id="mysql_config">
<!-- 配置事务类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置 -->
<mappers>
<mapper resource="com/cimo/DAO/IUserDao.xml"></mapper>
</mappers>
</configuration>
3 将User数据导入数据库
-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_mybatis CHARACTER SET utf8;
-- 创建数据表
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','女','北京');
4 创建java实体类:User.class
User.class
package com.cimo.Entity;
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) {
this.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 + '\'' +
'}';
}
}
5 编写IUserDao定义CRUD操作,以及使用if、where、foreach标签
package com.cimo.DAO;
import com.cimo.Entity.*;
import com.cimo.Entity.queryVo;
import java.util.List;
import java.util.Queue;
/***
*
* @author 谭海山
*/
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
/**
* 保存用户
* @param user
*/
void saveUser(User user);
/**
* 更新用户
*/
void updataUser(User user);
/**
* 根据ID删除用户
*/
void delUser(Integer userId);
/**
* 根据ID查询
*/
User findByid(Integer userid);
/**
*根据模糊查询用户定义信息
*/
List<User> findByName(String username);
/**
* 查询总用户数
*/
int findTotal();
/**
* 根据queryVo中的条件查询用户
* @return
*/
List<User> findUserByVo(queryVo vo);
/**
* 根据传入参数查询 使用if标签
* @param user 查询的条件,可能是用户名,可能是地址,可能都有,可能都没有
* @return
*/
List<User> findUserByCondition_if(User user);
/**
* 根据传入参数查询 使用where标签
* @param user
* @return
*/
List<User> findUserByCondition_where(User user);
/**
* 根据queryVo中提供的id集合,查询用户信息
* @param vo
* @return
*/
List<User> findUserInIds(queryVo vo);
}
6 编写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.cimo.DAO.IUserDao">
<!-- 查询所有 -->
<select id="findAll" resultType="com.cimo.Entity.User">
select * from user ;
</select>
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.cimo.Entity.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday) value (#{username},#{address},#{sex},#{birthday});
</insert>
<!-- 更新用户 -->
<update id="updataUser" parameterType="com.cimo.Entity.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!-- 删除用户 -->
<delete id="delUser" parameterType="Integer">
delete from user where id = #{id};
</delete>
<!-- 根据id查询用户信息 -->
<select id="findByid" parameterType="integer" resultType="com.cimo.Entity.User">
select * from user where id=#{id};
</select>
<!-- 根据username模糊查询 -->
<select id="findByName" parameterType="String" resultType="com.cimo.Entity.User">
select * from user where username like #{name}
</select>
<!-- 查询总用户数 -->
<select id="findTotal" resultType="int">
select count(id) from user
</select>
<!-- OGNL : 根据queryVo的条件查询用户 -->
<select id="findUserByVo" parameterType="com.cimo.Entity.queryVo" resultType="com.cimo.Entity.User">
select * from user where username like #{user.username}
</select>
<!-- 根据条件查询 if -->
<select id="findUserByCondition_if" parameterType="com.cimo.Entity.User" resultType="com.cimo.Entity.User">
select * from user where 1=1
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
<!-- 根据条件查询 where -->
<select id="findUserByCondition_where" parameterType="com.cimo.Entity.User" resultType="com.cimo.Entity.User">
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
<!-- 根据queryVo中的Id集合实现查询用户列表 -->
<select id="findUserInIds" parameterType="com.cimo.Entity.queryVo" resultType="com.cimo.Entity.User">
select * from user
<where>
<if test="ids != null and ids.size()>0">
<!-- 遍历ids集合,将遍历中的每一个元素填充到括号中,并且用,号分割,从而达到id in (1,2,3,...)的效果 -->
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
</mapper>
7 编写mybatisTest.class测试类(使用Junit测试)
import com.cimo.DAO.IUserDao;
import com.cimo.Entity.*;
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.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author cimo
*
* 测试mybatis的crud操作
*/
public class mybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before //用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("mybatis_config.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象、true自动提交事务
sqlSession = factory.openSession(true);
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After //用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
//sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
}
@Test
public void testSaveUser(){
User user = new User();
user.setUsername("殷伟伟2");
user.setAddress("广西南宁市");
user.setSex("男");
user.setBirthday(new Date());
System.out.println("保存操作之前:");
System.out.println(user);
//保存
userDao.saveUser(user);
System.out.println("保存操作之后:");
System.out.println(user);
}
@Test
public void testUpdata(){
User user = new User();
user.setId(50);
user.setUsername("殷飞龙");
user.setAddress("南宁");
user.setSex("女");
user.setBirthday(new Date());
//修改
userDao.updataUser(user);
}
@Test
public void testDel(){
//删除
userDao.delUser(45);
}
@Test
public void testfindByid(){
//通过id查找
User user = userDao.findByid(50);
System.out.println(user);
}
@Test
public void testfindByName(){
//通过username查找
List<User> user = userDao.findByName("%王%");
for ( User u : user){
System.out.println(u);
}
}
@Test
public void testfindTotal(){
//查询总用户数
System.out.println(userDao.findTotal());
}
/**
* 测试使用queryVo做为查询条件
*/
@Test
public void testfindByVo(){
queryVo vo = new queryVo();
User user = new User();
user.setUsername("%王%");
vo.setUser(user);
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
/**
* 测试使用条件查询if
*/
@Test
public void testfindUserByCondition_if(){
User user = new User();
user.setUsername("老王");
user.setSex("女");
List<User> users = userDao.findUserByCondition_if(user);
for(User u : users){
System.out.println(u);
}
}
/**
* 测试使用条件查询 where
*/
@Test
public void testfindUserByCondition_where(){
User user = new User();
user.setUsername("老王");
user.setSex("女");
List<User> users = userDao.findUserByCondition_where(user);
for(User u : users){
System.out.println(u);
}
}
/**
*测试foreach标签的使用
*/
@Test
public void testfindUserInIds(){
queryVo queryVo = new queryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(42);
list.add(46);
queryVo.setIds(list);
List<User> users = userDao.findUserInIds(queryVo);
for(User u : users){
System.out.println(u);
}
}
}
8 思路终结:
- 在pom.xml中引入依赖
- 创建mybatis_config.xml配置文件
- 创建数据库
- 编写User实体类,尽量与数据库中的字段名保持一致(不一致可以用resultMap映射)
- 编写IUserDao接口
- 编写IUserDao.xml配置文件,注意namespace、resultType都应该为全限定类名
- 在mybatis_config中指定mapper映射文件
- 编写测试类
- 其他:不喜欢用注解方式,这样感觉还是把sql语句写在java文件里了。
学习视频:
Mybatis教程IDEA版-4天-2018黑马SSM
学习资料:
Mybatis教程-实战看这一篇就够了