Mybatis 使用步骤
- 导包
- 创建 Mybatis-config.xml 配置文件
- 编写 MybatisUtils
- 创建 实体类
- 创建 Mapper 接口
- 创建 Mapper接口映射文件
- 测试
使用步骤详解
导包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
Mybatis-config
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kuang/dao/userMapper.xml"/>
</mappers>
</configuration>
Mybatis-util
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.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建 SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
User 实体类
// 有参构造
@AllArgsConstructor
// 无参构造
@NoArgsConstructor
public class User {
private int id; //id
private String name; //姓名
private String pwd; //密码
//set/get
//toString()
}
Mapper 接口类
import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectUser();
}
映射文件
- 需要跟Mapper接口的文件名相对应
- namespace 十分重要,不能写错!
- 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
<?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 -->
<mapper namespace="com.kuang.dao.UserMapper">
<select id="selectUser" resultType="com.kuang.pojo.User">
select * from user
</select>
</mapper>
使用
public class MyTest {
@Test
public void selectUser() {
SqlSession session = MybatisUtils.getSession();
//方法一:
//List<User> users = session.selectList("com.kuang.mapper.UserMapper.selectUser");
//方法二:
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
for (User user: users){
System.out.println(user);
}
// 注意关闭 session
session.close();
}
}
Maven静态资源过滤问题
<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>
CRUD-Mybatis操作方法
Select 方法
参数
- id
- 命名空间唯一的标识符
- 接口中的方法名与映射文件中的SQL语句ID相对应
- parameterType
- 传入参数的类型
- resultType
- 返回参数的类型,一般对应实体类
需求练习:根据id查询用户
UserMapper
public interface UserMapper(){
public User selectUserById(int id);
}
UserMapper.xml
<select id = "selectUserById" resultType = "com.xiaocheng.pojo.User">
select * from users where id = #{id}
</select>
MyTest
@Test
public void Test1(){
SqlSession sqlSession = MybatisUtils.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close;
}
需求练习:根据密码和名字来查询用户
方法1:
直接在方法中传递参数
User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
在接口方法的参数前加 @Param 属性Sql 语句编写的时候,直接取 @Param 中设置的值即可,不需要单独设置参数类型。
方法2:
使用万能的Map
User selectUserByNP2(Map<String,Object> map);
编写Sql的时候,需要传递参数类型,参数类型为map
<select id = "selectUserByNP2" parameterType = "map" resultType = "com.kuang.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
使用时,key的取值为Sql取值即可,没有顺序要求
Map<String,Object> map = new HashMap<String,Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = map.selectUserByNP2(map);
总结:
如果参数过多,使用HashMap。如果参数很少,直接使用@Param直接传递参数即可
Insert
需求:给数据库添加一个用户
步骤:
- 在UserMapper 接口中添加对应的方法
int addUser(User user);
- 在UserMapper.xml 中添加映射语句
<insert id = "addUser" parameterType = "com.kuang.pojo.User">
insert into user (id,name,pwd) values(#{id},#{name},#{pwd})
</insert>
- 测试
@Test
public void testAddUser(){
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(4,"李四","zxcvbn");
int i = mapper.addUser(user);
System.out,println(i);
// 重点,提交事务,不写的话,不会提交到数据库
session.commit();
session.close();
}
注意点:增、删、改操作需要提交事务!
Update
- 编写接口方法
int updateUser(User user);
- 编写对应的配置文件SQL
<update id = "updateUser" parameterType = "com.kuang.pojo.User">
update user set name=#{name},pwd#{pwd} where id = #{id}
</update>
- 测试
@Test
public void testUpdateUser(){
SqlSeesion sqlsession = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.updateUser(User user);
System.out.println(i);
//提交事务,重点!不写的话不会提交到数据库
session.commit();
session.close();
}
Delete
- 编写接口方法
int delectUser(int id);
- 编写对应的映射文件
<delete id = "deleteUser" paramterType = "int">
delete from user where id = #{id}
</delete>
- 测试
@Test
public void testDeleteUser(){
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
int i = mapper.deleteUser(4);
System.out.println(i);
session.commit();
session.close();
}
总结
- 所有的增删改查都需要提交事务,session.commit()
- 为了规范操作,在Sql配置文件上,我们尽量写上 Paramter 和 resultType
- 接口上所有的普通参数,尽量都写上@Param参数
- 根据业务需求,可以考虑使用Map传递参数
模糊查询
方法1:
string wildcardname = "%xmi%";
list<name> names = mapper.selectLike(wildcardname);
<select id = "selectLike">
select * from foo where bar like #{value}
</select>
方法2:
string wildcardname = "smi";
list<name> names = mapper.selectLike(wildcardname);
<select id = "selectLike">
select * from foo where bar like "%"#{value}"%"
</select>