Mybatis
环境
- JDK1.8
- Mysql5.7
- maven3.6
- IDEA
- maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
持久化
1. 持久化就是讲程序的数据在持久状态和瞬时状态转化的过程
2. 内存:断电即失
3. 数据库(jdbc),io文件持久化。
4. 生活例子:冷藏,罐头。
第一个Mybatis程序
搭建数据库
创建项目
- 创建maven项目
- 删除src目录
- 导入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
编写Mybatis核心配置文件
<?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=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--注册接口的实现mapper.xml文件,基于注解后不用mapper.xml了,要注册接口-->
<!-- <mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>-->
</configuration>
Mybatis工具类
package com.xia.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.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybatis第一步,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//有了SqlSessionFactory,就可以从中获得SqlSession的实例
//SqlSession 完全包含了面向数据库执行SQL 命令所需的所有方法
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
2.编写代码
- 编写实体类
package com.xia.dao;
public class User {
private int id;
private String name;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
dao层接口
package com.xia.dao;
import java.util.List;
public interface UserDao {
List<User> getUserList();
}
接口实现类由原来的UserDaoImpl转换为一个Mapper配置文件
<?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">
<!--namespace绑定接口-->
<mapper namespace="com.xia.dao.UserDao">
<!--查询语句,id对应方法名,resultMap为返回结果-->
<!--id绑定接口方法-->
<select id="getUserList" resultMap="com.xia.dao.User">
select * from mybatis.user;
</select>
</mapper>
- 测试
package com.xia.dao;
import com.xia.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.testng.annotations.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void Test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
}
万能Map
假设实体类或数据库中的表字段过多,我们应当考虑使用Map!
编写接口
//万能Map
User addUser2(Map<String,Object> map);
编写对应的mapper中的sql语句
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd) values(#{ids},#{names},#{passwd});
</insert>
测试
@Test
public void addUser2Test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
//通过反射使UserMapper.xml得到mapper对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("ids",5);
map.put("namse","小强");
map.put("passwd","123456");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
核心配置文件
- mybatis-config.xml
Mybatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息 - configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
使用注解开发
- 注解在接口上实现
public interface UserMapper {
@Select("select * from mybatis.user")
List<User> getUsers();
}
- 需要再核心配置文件中绑定接口
<mappers>
<mapper class="com.xia.dao.UserMapper"/>
</mappers>
- 测试
@Test
public void getUsersTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user.getId() + user.getName() + user.getPassword());
}
sqlSession.close();
}
- 编写接口,增加注解
public interface UserMapper {
@Select("select * from mybatis.user")
List<User> getUsers();
//方法存在多个参数,所有参数前面必须加上@param注解
@Select("select * from mybatis.user where id =#{ids}")
User getUserByiD(@Param("ids") int id);
@Insert("insert into mybatis.user (id,name,pwd)values(#{id},#{name},#{password})")
int addUser(@Param("id")int id,@Param("name")String name,@Param("password")String pwd);
@Update("update user set name = #{name} where id = #{id}")
int update(@Param("id")int id,@Param("name")String name);
}