Mybatis框架-----入门案例
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🔥一、准备工作
1、需要mybatis框架的全局配制文件和映射文件
如果没有联网需要添加全局配制文件的约束文件和映射文件的约束文件
2、需要数据源配制文件
3、需要日志文件
4、创建数据库
5、需要jar文件
点击下载mybatis入门级资源
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🔥二、mybatis入门操作
🌙2.1、文件结构
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌙2.2、效果展示
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌙2.3、步骤详细讲解
⭐2.3.1、在IDEA中创建项目
点击file ---->点击new—>点击Project
选中Web Application(4.0)—>点击next---->然后点击finish
⭐2.3.2、添加配置文件
需要添加全局配置文件、映射文件、支持mybatis框架的jar文件、数据库的配置文件、日志文件、如果没有网的话需要添加全局配置文件和映射文件的dtd文件(约束文件)
🌺2.3.2.1、约束文件(没有网路的情况下)
-
点击file---->点击setting
-
点击Languages&Frameworks—>选择中Schemas and DTDs
-
点击+
-
url填入的是全局配置文件中的约束,文件看你自己将dtd文件放在哪里在
-
然后点击apply并且点击ok就可以
🌺2.3.2.2、全局配置文件
放在src下
🌺2.3.2.3、映射文件
🍀2.3.2.3.1、mybatis中参数的绑定
在映射配置文件中向SQL 语句中绑定参数的语法结构为#{}和${}。
#{} 和 ${}的区别:
#{} 解析为一个 JDBC 预编译语句(PreparedStatement)的参数标记符占位符 ?。使用该方式可避免SQL 注入。
(SQL语句经过编译后 , 然后把 #{}里面的值绑定到SQL语句中)
${} 仅仅为一个纯碎的 String 替换,在Mybatis的动态 SQL 解析阶段将会进行变量替
(直接把${}中的值放进SQL语句中一起编译)
换。${} 在预编译之前已经被变量替换了,这会存在 SQL 注入问题。
🌺2.3.2.4、日志文件(用于输出)
🌺2.3.2.5、jar文件
1、点击file—>选择Project Structure
2、点击+、选择java
3、选择你存放jar文件的地方
4、文件出现在你这里
⭐2.3.3、正文(主要)
🌺2.3.3.1、数据库创建
🌺2.3.3.2、创建pojo,实体类
package wr.nine.pojo;
public class User {
private int userid ;
private String username ;
private String usersex ;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsersex() {
return usersex;
}
public void setUsersex(String usersex) {
this.usersex = usersex;
}
@Override
public String toString() {
return "User{" +
"userid=" + userid +
", username='" + username + '\'' +
", usersex='" + usersex + '\'' +
'}';
}
}
🌺2.3.3.3、映射文件
<?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="wr.nine.mapper.userMapper">
<!-- 做查询操作,查询到的结果集映射到User类上-->
<!-- //查询所有用户-->
<select id="selectUserByAll" resultType="wr.nine.pojo.User">
select * from user ;
</select>
<!-- //通过id查询用户名-->
<!-- #{} 相当于 jdbc中的?占位符-->
<select id="selectUserById" parameterType="_int" resultType="wr.nine.pojo.User">
select * from user where userid = #{userid} ;
</select>
</mapper>
🌺2.3.3.4、创建dao接口以及实现类(按照id查询、全部查询)
UserDao接口 (方法名与映射文件的id值进行绑定的)
实现类*****
package wr.nine.dao.impl;
import jdk.internal.util.xml.impl.Input;
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 wr.nine.dao.UserDao;
import wr.nine.pojo.User;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public List<User> selectUserByAll() throws IOException {
//第一步、读取全局配制文件、创建sqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//启动mybatis需要构建器, 所以需要使用SqlSessionFactoryBuilder ,所以需要使用SqlSessionFactoryBuilder需要依赖全局配制文件,通过配制文件解析,的内容启动mybatis
//然后返回SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//第二步、创建sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//第三步
List <User> userList = sqlSession.selectList("wr.nine.mapper.userMapper.selectUserByAll");
return userList;
}
@Override
public User selectUserById(int id ) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("wr.nine.mapper.userMapper.selectUserById" , 1);
return user ;
}
}
🌺2.3.3.5、测试
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🔥三、Mybatis工具类
🌙3.1、ThreadLocal介绍
ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过 get和 set方法就可以得到当前线程对应的值。
理解:就是在同一个线程中ThreadLocal存储变量,取出来是同一个值,这样可以保证是存入的对象和取出来的对象是同一个对象。因为sqlSession对象相当于封装了Connection对象,如果每一次都创建一个sqlSession的对象的话,极大消耗连接资源
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌙3.2、使用ThreadLocal存储SqlSession
如果多个 DML 操作属于一个事务,因为 commit()和 rollback()都是由SqlSession 完成的,
所以必须保证使用一个SqlSession。但是多个不同的 DML 操作可能在不同类的不同方法中,
每个方法中要单独的获取 SqlSession。比如商城下订单时,其实涉及商品库存变化、订单添
加、订单明细添加、付款、日志添加等多个DML 操作,分布在不同类中。
如何在多个DML 操作之间使用同一个 SqlSession 呢,可以使用ThreadLocal来存储。保证一个线程中的操作使用的都是一个 SqlSession。
(例如:在完成一个业务,可能要对数据库做很多操作,其中大多数操作是DML操作,这个时候控制事务,如果出现一条DML操作失败,那么要回滚所有的DML操作,就要求操作数据库方法的sqlSession对象是同一个)
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌙3.3、创建Mybatis工具类
package wr.nine.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 {
//ThreadLocal提供线程中存储变量
private static ThreadLocal<SqlSession> threadLocal =
new ThreadLocal<>();
private static SqlSessionFactory sqlSessionFactory = null ;
static{
// 创 建 SqlSessionFactory
InputStream is = null;
try{
is = Resources.getResourceAsStream("mybatis-cfg.xml");
}catch (IOException e){
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
//获取SqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
//关闭sqlSession对象
if( sqlSession == null ){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
//关闭sqlSession对象
public static void close() {
SqlSession sqlSession = threadLocal.get();
if(sqlSession!= null ){
sqlSession.close();
threadLocal.set(null);
}
}
}
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌙3.4、Mybatis的事务提交方式
在
Mybatis
中事务提交方式默认为手动提交,这与JDBC 是不同的。在JDBC
中事务默认
提交方式为自动提交。
手动提交事务(默认):
SqlSession sqlSession = sqlSessionFacotry.openSession();
自动提交事务
SqlSession sqlSession = sqlSessionFacotry.openSession(true);
🌙3.5、增删改操作(DML操作)
映射文件
<?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="wr.nine.mapper.userMapper">
<!-- 做查询操作,查询到的结果集映射到User类上-->
<!-- //查询所有用户-->
<select id="selectUserByAll" resultType="wr.nine.pojo.User">
select * from user ;
</select>
<!-- //通过id查询用户名-->
<!-- #{} 相当于 jdbc中的?占位符-->
<select id="selectUserById" parameterType="_int" resultType="wr.nine.pojo.User">
select * from user where userid = #{userid} ;
</select>
<insert id="addUser" parameterType="wr.nine.pojo.User">
insert into user values (default , #{username} , #{usersex}) ;
</insert>
<update id="updateUser" parameterType="wr.nine.pojo.User">
update user set username = #{username} , usersex = #{usersex}
where userid = #{userid} ;
</update>
<delete id="deleteUser" parameterType="_int">
delete from user where userid = #{userid} ;
</delete>
</mapper>
dao层 (实现类) (数据访问层)
package wr.nine.dao;
import wr.nine.pojo.User;
import java.io.IOException;
import java.util.List;
public interface UserDao {
//查询所用用户
public List<User> selectUserByAll() throws IOException;
public User selectUserById(int userid) throws IOException ;
public void addUser (User user) ;
public void updateUser (User user) ;
public void deleteUser (int userid) ;
}
package wr.nine.dao.impl;
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 wr.nine.dao.UserDao;
import wr.nine.pojo.User;
import wr.nine.util.MybatisUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public List<User> selectUserByAll() throws IOException {
//第一步、读取全局配制文件、创建sqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//启动mybatis需要构建器, 所以需要使用SqlSessionFactoryBuilder ,所以需要使用SqlSessionFactoryBuilder需要依赖全局配制文件,通过配制文件解析,的内容启动mybatis
//然后返回SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//第二步、创建sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//第三步
List <User> userList = sqlSession.selectList("wr.nine.mapper.userMapper.selectUserByAll");
return userList;
}
@Override
public User selectUserById(int id ) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("wr.nine.mapper.userMapper.selectUserById" , 1);
return user ;
}
@Override
public void addUser(User user) {
//获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
sqlSession.insert("wr.nine.mapper.userMapper.addUser" , user ) ;
}
@Override
public void updateUser(User user) {
//获取数据库连接
SqlSession sqlSession = MybatisUtils.getSqlSession();
sqlSession.update("wr.nine.mapper.userMapper.updateUser" , user );
}
@Override
public void deleteUser(int userid) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
sqlSession.update("wr.nine.mapper.userMapper.deleteUser" , userid );
}
}
service层(逻辑处理)
package wr.nine.service;
import wr.nine.pojo.User;
public interface UserService {
public void addUser(User user);
public void updateUser(User user);
public void deleteUser(int userid);
}
package wr.nine.service.impl;
import org.apache.ibatis.session.SqlSession;
import wr.nine.dao.UserDao;
import wr.nine.dao.impl.UserDaoImpl;
import wr.nine.pojo.User;
import wr.nine.service.UserService;
import wr.nine.util.MybatisUtils;
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl() ;
@Override
public void addUser(User user) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
try{
userDao.addUser(user);
sqlSession.commit();
}catch (Exception e){
e.printStackTrace();
//进行回滚
sqlSession.rollback();
}finally {
if(sqlSession!=null){
MybatisUtils.close();
}
}
}
@Override
public void updateUser(User user) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
try{
userDao.updateUser(user);
sqlSession.commit();
}catch (Exception e){
e.printStackTrace();
//进行回滚
sqlSession.rollback();
}finally {
if(sqlSession!=null){
MybatisUtils.close();
}
}
}
@Override
public void deleteUser(int userid) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
try{
userDao.deleteUser(userid);
sqlSession.commit();
}catch (Exception e){
e.printStackTrace();
//进行回滚
sqlSession.rollback();
}finally {
if(sqlSession!=null){
MybatisUtils.close();
}
}
}
}
测试代码
增加
package wr.nine.test;
import wr.nine.dao.UserDao;
import wr.nine.dao.impl.UserDaoImpl;
import wr.nine.pojo.User;
import wr.nine.service.UserService;
import wr.nine.service.impl.UserServiceImpl;
public class Demo2 {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
User user = new User();
user.setUsername("王");
user.setUsersex("男");
userService.addUser(user);
}
}
更新
package wr.nine.test;
import wr.nine.pojo.User;
import wr.nine.service.UserService;
import wr.nine.service.impl.UserServiceImpl;
public class Demo3 {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
User user = new User();
user.setUserid(2);
user.setUsername("章");
user.setUsersex("男");
userService.updateUser(user);
}
}
删除
package wr.nine.test;
import wr.nine.service.UserService;
import wr.nine.service.impl.UserServiceImpl;
public class Demo4 {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.deleteUser(2);
}
}
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨