代码地址https://www.lanzouw.com/ihOmnwdtbrc
请先看项目目录结构,然后再写代码。target是编译后的输出目录,只需要保证src目录目录一致就行。
1、创建数据库mybatis和表User,并插入数据
DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE User(
id int(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL,
age int(3),
PRIMARY KEY (id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
USE mybatis;
INSERT INTO User(name, age)
VALUES
("张三", 12),
("李四", 14),
("王华", 10),
("lucy", 20),
("mary", 22);
2、创建maven工程,创建实体类User
- 导入lombok、mysql驱动、mybatis、junit四个jar包。使用lombok注解可以帮我们自动实现setter和getter、toString功能,让代码看起来更简洁,更容易修改。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
- 创建实体类User,其中注解@Data会帮我们自动生成类的setter、getter、toString方法
package com.changqing.pojo;
import lombok.Data;
//实体类,对应数据表User
@Data
public class User {
private int id;
private String name;
private int age;
public User(){
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public User(String name, int age){
this.name=name;
this.age=age;
}
}
3、定义UserDao接口和UserMapper.xml映射文件
- 定义UserDao接口,定义我们所需要的数据库操作方法,增删改查等等
package com.changqing.dao;
import com.changqing.pojo.Student;
import com.changqing.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserDao {
//获取所有数据
public List<User> getUserList();
//根据id查询数据
public Map<String, String> selectById(int id);
//增加数据
public void addUser(User user);
//通过map来增加数据
public void addUser2(Map<String, Object>map);
//通过map来修改数据
public void updateUser(Map<String, Object>map);
//删除数据
public void deleteUser(int id);
//批量删除数据>id
public void deleteBatch(int id);
//模糊查询
public List<User> selectNameLike(String value);
//分页查询
public List<User> getLimitUser(Map<String, Object> map);
//使用注解不使用参数来获取Users, 不需要在xml写sql语句,但是适用范围很小
@Select("select * from user")
public List<User> getUsers();
//测试注解,使用参数, 多个参数必须加上@Param, 仅有一个参数,可以加@Param也可以不加,但是规范写法都应该加上
@Select("select * from user where id=#{id} and name=#{name}")
User getUser(@Param("id") int id, @Param("name") String name);
}
- 定义UserMapper.xml映射文件。这个文件的作用相当于UserDao接口的实现类作用。在JDBC中,我们需要定义接口然后实现接口,这里的UserMapper.xml文件相当于JDBC中的实现类。其中namespace对应UserDao的全限定名,即com.changqing.dao.UserDao。id对应UserDao中的方法名,ParameterType是方法参数类型,resultType对应返回的类型,这里就是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">
<!--这里的namesapce的值位UserDao,即将这个UserMapper配置文件绑定到UserDao接口上,相当于这个xml文件实现UserDao接口, 其中的id对应UserDao中的方法名-->
<mapper namespace="com.changqing.dao.UserDao">
<select id="getUserList" resultType="com.changqing.pojo.User">
select * from User
</select>
<select id="selectById" parameterType="int" resultType="hashmap">
select * from User where id=#{id}
</select>
<insert id="addUser" parameterType="com.changqing.pojo.User">
insert into User(name, age) values(#{name}, #{age})
</insert>
<insert id="addUser2" parameterType="map">
insert into User(id, name, age) values (#{userid}, #{username}, #{userage})
</insert>
<update id="updateUser" parameterType="map">
update User set name=#{username}, age=#{userage} where id=#{userid}
</update>
<delete id="deleteUser" parameterType="int">
delete from User where id=#{id}
</delete>
<delete id="deleteBatch" parameterType="int">
delete from User where id>#{id}
</delete>
<!--因为在myatis中建立别名 typeAliases,所以可以直接使用类名-->
<select id="selectNameLike" parameterType="String" resultType="User">
select * from User where name like concat('%',#{0},'%')
</select>
<!-- 分页查询-->
<select id="getLimitUser" parameterType="map" resultType="com.changqing.pojo.User">
select * from User limit #{startIndex}, #{pageSize}
</select>
</mapper>
4、定义Mybatis-config.xml主配置文件
- 这里的<properties reouse="jdbc.properties">是导入外部的数据源的xml,目的是将数据源信息和主配置文件解耦。Mybatis-config.xml使用<property name="***" value="***">来引入具体的配置参数。好处是如果以后需要修改数据源信息,只用在jdbc.propertis文件中修改,不需要修改Mybatis-config.xml文件。
- <typeAliases>可以使用别名,会自动导入所有com.changqing.pojo包下的所有类,并直接使用类名作为别名,这样的好处使得UserMapper文件的resultType值可以直接使用非全限定名,不需要使用全限定名 。
- <mappers>标签用于将UserMapper.xml注册到Mybatis中,后续的代码才能使用UserDao接口。
<?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核心配置文件-->
<configuration>
<!--引用jdbc.properties文件,可以在下面直接应用jdbc.properties的值-->
<properties resource="jdbc.properties"/>
<typeAliases>
<package name="com.changqing.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 不使用jdbc.properties配置文件,直接在mybatis配置文件里填入参数-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="199604"/>
<!-- 使用jdbc.properties配置文件-->
<!-- <property name="driver" value="${driver}"/>-->
<!-- <property name="url" value="${url}"/>-->
<!-- <property name="username" value="${username}"/>-->
<!-- <property name="password" value="${password}"/>-->
</dataSource>
</environment>
</environments>
<mappers>
<!--将UserMapper注册到mybatis中,-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
(可选)5、编写jdbc的配置文件jdbc.properties
这样的好处是将jdbc和mybatis配置文件解耦,修改jdbc连接信息只需要修改jdbc.properties文件即可。如果使用这个文件,请将上面的被注释的<property>取消注释。
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username=root
password=199604
6、创建工具类MybatisUtils来返回SqlSession
package com.changqing.utils;
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 java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch (Exception e){
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
7、编写测试类进行测试
package test;
import com.changqing.dao.UserDao;
import com.changqing.pojo.Student;
import com.changqing.pojo.User;
import com.changqing.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.AfterClass;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestUser {
private static final SqlSession sqlSession = MybatisUtils.getSqlSession();
private static final UserDao userDao = sqlSession.getMapper(UserDao.class);
//查找全部数据
@Test
public void testUser(){
List<User> userList = userDao.getUserList();
for(User user: userList){
System.out.println(user);
}
}
//按id查找
@Test
public void test2(){
Map<String, String> user = userDao.selectById(1);
System.out.println(user);
}
//添加数据,使用对象来传入参数
@Test
public void addUser(){
User user = new User("张明",23);
userDao.addUser(user);
sqlSession.commit();
}
//添加数据,使用map传入多个参数
@Test
public void addUser2(){
Map<String, Object> map = new HashMap<>();
map.put("userid", 12);
map.put("username", "李明");
map.put("userage", 25);
userDao.addUser2(map);
sqlSession.commit();
}
//更新数据
@Test
public void updateUser(){
Map<String, Object> map = new HashMap<>();
map.put("userid", 7);
map.put("username", "nancy");
map.put("userage", 34);
userDao.updateUser(map);
sqlSession.commit();
}
//删除指定id的数据
@Test
public void deleteUser(){
userDao.deleteUser(18);
sqlSession.commit();
}
@Test
//批量删除数据,删除>id的数据
public void deleteBatch(){
userDao.deleteBatch(5);
sqlSession.commit();
}
//根据姓名进行模糊查询
@Test
public void selectNameLike(){
List<User> userList = userDao.selectNameLike("张");
for(User user: userList){
System.out.println(user);
}
}
//测试分页查询
@Test
public void getLimitUser(){
Map<String, Object> map = new HashMap<>();
map.put("startIndex", 2); ///索引是从0开始计算的, 会从索引为startIndex的数据开始返回,返回pageSize个数据, 即会从第startIndex+1数开始返回
map.put("pageSize", 2);
List<User> userList = userMapper.getLimitUser(map);
for(User user: userList){
System.out.println(user);
}
}
//测试mybatis注解功能,只能实现简单功能,而且必须保证数据库的列名和实体类User的属性名一致才可以用,局限性比较大
@Test
public void testAnnotation(){
List<User> userList = userMapper.getUsers();
for(User user: userList){
System.out.println(user);
}
}
//测试注解,使用参数
@Test
public void testAnnotationWithArgs(){
User user = userMapper.getUser(1, "张三");
System.out.println(user);
}
//在上面每个方法执行后,都会默认执行这个方法来关闭sqlSession
@AfterClass
public static void closeSql(){
//查询
System.out.println(".......................................");
List<User> userList = userDao.getUserList();
for(User user: userList){
System.out.println(user);
}
sqlSession.close();
}
}