文章目录
- 一、使用IDEA2020.2搭建环境
- 1.新建一个工程
- 2.创建一个工程mybatis01
- 3.在pom中导入jar包(mybatis,mysql,junit,log4j)
- 二、连接数据库
- 1.先在数据库中创建一个用来测试的表
- 2.在IDEA中连接数据库
- 三、创建项目
- 1.项目的主要文件主要为如下六个文件
- 2.首先是对应刚才在数据库中创建的表编写一个 *User实体类*
- 3.编写 *mybatis核心配置文件*
- 3.1介绍核心配置文件中的两个优化部分
- 4.编写 *映射文件*
- 5.*mybatis工具类* 的编写
- 6.*UserDao接口* 的编写
- 7.*测试类* 的编写
- 四、在测试过程中遇到的一些问题
- 注(学习来源):
一、使用IDEA2020.2搭建环境
1.新建一个工程
2.创建一个工程mybatis01
3.在pom中导入jar包(mybatis,mysql,junit,log4j)
二、连接数据库
1.先在数据库中创建一个用来测试的表
2.在IDEA中连接数据库
三、创建项目
1.项目的主要文件主要为如下六个文件
2.首先是对应刚才在数据库中创建的表编写一个 User实体类
~~代码如下:
package com.mybatis.Dao.pojo;
public class User {
private int id;
private String last_name;
private String Gender;
private String email;
public User() {
}
public User(int id, String last_name, String gender, String email) {
this.id = id;
this.last_name = last_name;
Gender = gender;
this.email = email;
}
public int getId(int i) {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public String getGender() {
return Gender;
}
public void setGender(String gender) {
this.Gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", last_name='" + last_name + '\'' +
", gender='" + Gender + '\'' +
", email='" + email + '\'' +
'}';
}
}
3.编写 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>
<!--通过properties标签加载外部properties文件-->
<properties resource="JDBC.properties"></properties>
<!--自定义别名-->
<typeAliases>
<typeAlias type="com.mybatis.Dao.pojo.User" alias="user"></typeAlias>
</typeAliases>
<!--数据源环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${JDBC.driver}"/>
<property name="url" value="${JDBC.url}"/>
<property name="username" value="${JDBC.username}"/>
<property name="password" value="${JDBC.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="Mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.1介绍核心配置文件中的两个优化部分
第一部分:properties标签
在resources目录下建一个JDBC.propertes文件
这是JDBC.propertes文件中的内容
代码如下:
JDBC.driver=com.mysql.cj.jdbc.Driver
JDBC.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8
JDBC.username=root
JDBC.password=123456
第二部分:自定义别名typeAliases标签
就是将 我这里"com.mybatis.Dao.pojo.User"这个名字取了一个别名为"user"
方便后面映射文件中resultType等调用
4.编写 映射文件
4.1映射文件的位置–在resources下的Mapper下创建的
代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--查询操作-->
<mapper namespace="com.mybatis.Dao.UserDao">
<select id="getUserList" resultType="user">
select * from mybatis.user
</select>
<!--插入操作-->
<insert id="insert" parameterType="user">
insert into user values(#{id},#{last_name},#{gender},#{email})
</insert>
<!--修改操作-->
<update id="update" parameterType="user">
update user
<set>last_name=#{last_name},gender=#{gender},email=#{email} where id=#{id}</set>
</update>
<!--删除操作-->
<delete id="delete" parameterType="int">
delete from user where id = #{id}
</delete>
<!--根据id查询一条记录-->
<select id="selectOne" resultType="user" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
</mapper>
5.mybatis工具类 的编写
代码如下:
package com.mybatis.Dao.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 {
//sqlSessionFactory 获取 sqlSession
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用 mybatis 第一步:获取 sqlSessionFactory 对象
String resource = "sqlMapperconfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}
6.UserDao接口 的编写
位置如下:
代码如下:代码中附加注释
package com.mybatis.Dao;
import com.mybatis.Dao.pojo.User;
import java.util.List;
// 这里面的代码是一个接口,对应映射文件的namespace+id值
public interface UserDao { //UserDao对应的类路径是映射文件中的namespace
List<User> getUserList();
int insert (User user);//insert对应的是映射文件中的id值
int update(User user);//update对应的是映射文件中的id值
int delete(int id);
User selectOne(int id);
}
7.测试类 的编写
位置如下:
代码如下:
package com.mybatis.Dao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.mybatis.Dao.pojo.User;
import com.mybatis.Dao.utils.MybatisUtils;
import java.util.List;
public class UserDaoTest {
@Test
//查询操作
public void test01(){
//第一步:获取 sqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//将 MybatisUtils工具类封装成一个获取openSession()的方法(这个方法通过 MybatisUtils.getSqlSession()进行调用)
//使用 getMapper 执行 sql 语句
UserDao userdao = sqlSession.getMapper(UserDao.class);
List<User> userList = userdao.getUserList();
for(User user:userList){
System.out.println(user);
}
//关闭 sqlSession
sqlSession.close();
}
@Test
//插入操作
public void test02(){
//第一步:获取 sqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//使用 getMapper 执行 sql 语句
UserDao userdao = sqlSession.getMapper(UserDao.class);
User user = new User(3,"aa","1","wewewe");
int count = userdao.insert(user);
sqlSession.commit();
//关闭 sqlSession
sqlSession.close();
}
@Test
//更新操作
public void test03(){
//第一步:获取 sqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//使用 getMapper 执行 sql 语句
UserDao userdao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setId(3);
user.setLast_name("cc");
user.setGender("0");
user.setEmail("xxxxxx");
int count = userdao.update(user);
System.out.println(count);
//sqlSession.commit();
//关闭 sqlSession
sqlSession.close();
}
@Test
//删除操作
public void test04(){
//第一步:获取 sqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//使用 getMapper 执行 sql 语句
UserDao userdao = sqlSession.getMapper(UserDao.class);
User user = new User();
int count = userdao.delete(2);
System.out.println(count);
//sqlSession.commit();
//关闭 sqlSession
sqlSession.close();
}
@Test
//根据id查询一条记录
public void test05(){
//第一步:获取 sqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//使用 getMapper 执行 sql 语句
UserDao userdao = sqlSession.getMapper(UserDao.class);
User user = userdao.selectOne(2);
System.out.println(user);
//关闭 sqlSession
sqlSession.close();
}
}
核心语句:
mybatis自动代理实现了接口的实现
四、在测试过程中遇到的一些问题
版本问题:数据库8.0之后的版本配置参数是这样的
《映射文件》中的namespace和id值与《UserDao接口》中的对应问题
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象Mapper接口开发需要遵循以下规范:
1、 映射文件(UserMapper.xml)中的namespace与mapper接口(我命名为了UserDao)的类路径相同。
2、 UserDao接口方法名和映射文件中定义的每个statement的id相同
3、 UserDao接口方法的输入参数类型和映射文件中定义的每个sql 的parameterType的类型相同
4、 UserDao接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
映射文件中的sql语句不要加分号";"
SqlSessionFactory有两个常用方法创建SqlSession实例:我这里设置为自动提交了
openSession():会默认开启一个事务,但事务不会自动提交,意味着需要手动提交该事务,更新操作才会持久化到数据库中
openSession(boolean autoCommit):参数为是否自动提交,如果设置为true,那么不需要手动提交事务