之前学习mybatis后自己动手做了笔记,分享出来给大家学习参考
第一部分:创建Mybatis程序以及对其的一些基本使用
下一篇会讲到mybatis的一些配置和其他功能
1.1 创建第一个Mybatis程序
1.1.1 创建一个maven工程
1.1.2 导入Mybatis和数据库驱动包和单元测试的依赖
<dependencies>
<!-- 导入Mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 导入数据库驱动包的依赖,连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!-- 导入单元测试的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
1.1.3 创建Mybatis的工具类获取SqlSession对象
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 (IOException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
1.1.4 编写mybatis-config.xml主配置文件
需要注意数据库中url的写法,mysql8.0以上需要添加时区
?serverTimezone=GMT
mapper标签下的resource属性需用‘ / ’而不是‘ . ’
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="aA15815249122"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/wlt/mapper/Mapper.xml"/>
</mappers>
</configuration>
1.1.5 编写mapper层中的Mapper.xml配置文件
Mapper.xml文件可以放在resources路径下,但目录结构需保持一致
默认放在java路径的mapper包,但需要pom.xml文件中添加:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
否则会报错: Could not find resource com/wlt/mapper/Mapper.xml
原因:maven的约定大于配置,可能会遇到所写的配置文件无法导出或者生效
解决方法:在pom.xml文件手动添加过滤,将src/main/java中的xml或properties文件能够导出。
namespace中的包名要和Mapper接口中的包名一致
id:对应的namespace中的方法名
resultType:对应返回值的类型,需要传入全限定类名
<?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.wlt.mapper.UserMapper">
<select id="findAllUser" resultType="com.wlt.domain.User">
select * from user;
</select>
</mapper>
1.1.6 创建数据库表中对应的实体类User
类型名需与数据库对应表的字段名保持一致
private int id;
private String username;
private Date birthday;
private char sex;
private String address;
//省略构造方法和重写方法以及set和get方法
1.1.7 mapper层中编写UserMapper的接口
public interface UserMapper {
/**
* 查询所有人
* @return
*/
List<User> findAllUser();
}
1.1.8 进行测试,在测试包下编写对应的测试类
public class UserTest {
@Test
public void MyUserTest(){
//调用MapperUtils的方法获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> allUser = mapper.findAllUser();
for (User user : allUser) {
System.out.println(user);
}
sqlSession.close();
}
}
1.2 使用Mybatis进行CRUD操作
后续的操作核心只需要编写mapper接口的方法和对应xml文件的sql语句
1.2.1 查询操作示例
mapper接口的方法
/**
* 通过id查询某个人
* @param id
* @return
*/
User findUserById(int id);
mapper.xml文件中的sql语句
parameterType:传入参数的类型,即方法中参数的类型
<select id="findUserById" resultType="com.wlt.domain.User" parameterType="int">
select * from user where id=#{id};
</select>
1.2.2 插入操作示例
增删改操作需要提交事务,测试方法中需要new User,不然程序识别不出
/**
* 插入一个用户信息
* @param user
*/
void insertUser(User user);
<insert id="insertUser" parameterType="com.wlt.domain.User">
insert into user (id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address});
</insert>
/**
* 测试插入一个用户的方法
*/
@Test
public void insertUserTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.insertUser(new User(1,"小吴","2018-05-11 15:20:03","男","广东潮州"));
//提交事务
sqlSession.commit();
sqlSession.close();
}
1.2.3 删除操作示例
/**
* 通过id删除用户
* @param id
*/
void deleteUserById(int id);
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id};
</delete>
/**
* 根据id删除某个用户
*/
@Test
public void deleteUserByIdTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUserById(1);
sqlSession.commit();
sqlSession.close();
}
1.2.4 修改操作示例
new User中需要有相应的构造函数,否则识别不出
public User(String username,String address,int id) {
this.id = id;
this.username = username;
this.address = address;
}
/**
* 通过id修改某个用户的信息
* @param user
*/
void updateUserById(User user);
<update id="updateUserById" parameterType="com.wlt.domain.User">
update user set username=#{username},address=#{address} where id=#{id};
</update>
/**
* 根据id修改某个用户信息
*/
@Test
public void updateUserByIdTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUserById(new User("阿贵","广东深圳",46));
sqlSession.commit();
sqlSession.close();
}
1.2.5 解决无视实体类构造函数直接传参的问题
用Map集合传参,不使用实体类,这样实体类中不需要去创建对应的构造函数了,Map集合传参适用于数据库中字段较多的数据,当然也可以在实体类中创建对应的构造函数出来,因人而异
示例
<update id="updateUserByMap" parameterType="com.wlt.domain.User">
update user set address=#{address} where id=#{id};
</update>
/**
* 通过map集合传递参数,修改用户信息
* @param map
*/
void updateUserByMap(Map<String,Object> map);
/**
* 通过Map集合传递参数,重新进行修改操作的测试
*/
@Test
public void updateUserByMap(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<String, Object>();
map.put("address","广东佛山");
map.put("id",41);
mapper.updateUserByMap(map);
sqlSession.commit();
sqlSession.close();
}
1.2.6 模糊查询操作示例
使用通配符%%,一般有两种方式:
1. 在xml文件中的sql语句中写:%#{value}%
2. 在测试方法中的方法传参为:"%value%",可见如下代码
/**
* 进行模糊查询的操作
* @param obj
* @return
*/
List<User> findUserLike(Object obj);
<select id="findUserLike" resultType="com.wlt.domain.User" parameterType="object">
select * from user where username like "%"#{obj}"%";
</select>
/**
* 进行模糊查询的测试
*/
@Test
public void FindUserLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//第一种方式
List<User> users = mapper.findUserLike("小");
//第二种方式
List<User> users = mapper.findUserLike("%小%");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}