Mybatis简单介绍
- 什么是Mybatis?
- Mybatis是一款优秀的持久层框架;
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Mybatis入门
- 首先,如果使用Maven来构建项目,要想使用Mybatis,则需要将下面的dependency代码置于pom.xml中,我这里使用的是目前Mybatis的比较稳定的版本3.5.1;
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
- 我这里先有一个数据库,需要的话,可以用,当然,要导入数据库:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
- 创建一个工具类,构建SQLSessionFactory对象;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
//mybatis的工具类,重复的代码的提纯
public class MyBatisUtils {
//类变量不需要设置默认值;
private static SqlSessionFactory sqlSessionFactory;
static {
//在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。
InputStream inputStream = null;
try {
String resource = "mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//设置SqlSessionFactory公共的方法
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
- database.properties :存放关于连接数据库的内容。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
- 创建一个配置文件,mybatis-config.xml,XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器。
<?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>
<!--配置文件修改-->
<properties resource="database.properties"/>
<!--配置别名-->
<typeAliases>
<!--
将com.baidu.pojo.User简化成User,配置指定类的别名
-->
<typeAlias type="com.baidu.pojo.User" alias="User"></typeAlias>
<!--为包指定别名,上下两行是一样的作用-->
<package name="com.baidu.pojo"/>
</typeAliases>
<!--配置环境,这里可以有多套环境 default代表默认的是那一套-->
<environments default="development">
<!--配置一套环境 id .环境的名字-->
<environment id="development">
<!--transactionManager:事务管理,type:jdbc-->
<transactionManager type="JDBC"/>
<!--dataSource 数据源-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<!--xml中不允许&符号直接出现,我们需要使用 & 代替-->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
- 创建实体类User
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = 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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
- 创建dao层,获取所有user的列表
import com.baidu.pojo.User;
import java.util.List;
public interface UserMapper {
//获取全部的用户
List<User> selectUser();
}
- 创建一个UserMapper的映射文件UserMapping.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对应Mapper接口的类-->
<mapper namespace="com.baidu.dao.UserMapper">
<!--select标签的id对应映射接口的方法名字 resultType:返回结果的类型 中间就编写sql语句-->
<select id="selectUser" resultType="com.baidu.pojo.User">
select * from user
</select>
</mapper>
- 关联映射文件在刚才创建的文件mybatis-config.xml中,放在这个位置。
<!--关联映射文件-->
<mappers>
<mapper resource="com/baidu/dao/userMapping.xml"/>
</mappers>
- 创建test测试文件
import com.baidu.pojo.User;
import com.baidu.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void selectUser(){
//1.拿到sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
//2.通过sqlSessionFactory对象openSession()创建一个sqlSession。
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.通过sqlSession获得mapper对象 , 参数为映射文件对应的接口类的class对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//4.通过mapper对象来执行操作;
List<User> users = mapper.selectUser();
//获得结果集
for (User user : users) {
System.out.println(user);
}
}
}
- 出来了数据了,就证明成功了!
Mybatis的增删改查(CRUD)
- 首先配置你的dao层代码
import com.baidu.pojo.User;
import java.util.List;
public interface UserMapper {
//获取全部的用户
List<User> selectUser();
User getUserById(int id);
int insertUser(User user);
int removeUserById(int id);
int updateUser(User user);
}
- 配置映射文件UserMapping.xml
<select id="getUserById" resultType="com.baidu.pojo.User">
select * from user where id = #{id}
</select>
<!--
parameterType:参数类型,基本数据类型可以不写
-->
<!--这里的com.baidu.pojo.User可以换成User,因为上面的配置文件用 <typeAliases> 将com.baidu.pojo.User可以替换成User-->
<insert id="insertUser" parameterType="com.baidu.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<delete id="removeUserById">
delete from user where id = #{id}
</delete>
<update id="updateUser" parameterType="com.baidu.pojo.User">
update user set name = #{name},pwd = #{pwd} where id = #{id}
</update>
Mybatis处理字段名和属性不一致
属性:实体类
字段:数据库
比如说,你在数据库中的字段名是pwd,而你在实体类中写的是password,则在查询的时候,就会出现如下情况:
- 解决方法一:将实体类中的setPassword方法,设置成和数据库字段名一样(不推荐使用,代码不美观)
- 解决方法二:mysql数据库查询时,起别名。(不推荐使用,字段多的情况下,比较乱)
- 解决方法三: