Mybatis入门的学习心得

Mybatis框架入门学习的简单总结

框架的使用简化了我们开发的难度,让我们能专注于功能的实现而不必被一些琐碎的事打扰。初次学习Mybatis,记录一下心得体会

不使用Mapper代理所需配置

  • DTD约束就不做多说,jar包的添加
    在这里插入图片描述

-properties 文件 db.properties 用于记录对数据库的连接的信息

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/你的数据库名?useSSL=false
jdbc.username = root
jdbc.password = 密码
  • mybatis-cfg.xml全局配置文件,放置于src目录下即可,主要用于引入数据库配置文件,设置别名,配置环境,引入映射配置文件`
<?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 resource="db.properties"/>

    <!--设置别名-->
    <typeAliases>
        <typeAlias type="pojo.Users" alias="users"/>
    </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/UsersMapper.xml"/>
    </mappers>
</configuration>
  • 映射配置文件,UsersMapper.xml,配置文件的名称要于mybatis-cfg.xml文件中设置的一样 UserMapper.xml 中主要用于编写对数据库操作的语句
    在这里插入图片描述
    UsersMapper.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.UsersMapper">
<!--这里写你要进行的数据库操作语句-->
</mapper>

SqlSession工具类

SqlSession相当于Connection对象,SqlSessionFactory相当于数据库连接池,多个连接池会导致数据库资源被快速消耗完 所以一般使用单例模式,即一个SqlSessionFactory 对应多个SqlSession

注意:sqlSessionFactory.openSession();默认设置的是手动提交事务,意味着你需要手动提交插入删除更新操作

//创建一个工具类用于封装SqlSession
public class MybatisUtils {
   //确保进程每次都获取当前SqlSession
   private static ThreadLocal<SqlSession> thread = new ThreadLocal<>();
   private static SqlSessionFactory sqlSessionFactory = null; 
   
   static{
       InputStream inputStream = null;
       try{
          //获取数据库连接信息以及配置映射信息
          inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");
       }catch(Exception e){
          e.printStackTrace(); 
       }
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   }

    //获取当前sqlSession
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionThreadLocal.get();
        if(sqlSession == null){
            sqlSession = sqlSessionFactory.openSession();
            sqlSessionThreadLocal.set(sqlSession);
        }
        return sqlSession;
    }
    
    //关闭当前sqlSession
    public static void closeSqlSession(){
        SqlSession sqlSession = sqlSessionThreadLocal.get();
        if(sqlSession != null){
            sqlSession.close();
            sqlSessionThreadLocal.set(null);
        }
    }

}

数据库操作实现

  • 如果使用pojo 或者map来传递参数,那么语句中的#{}要与pojo中对应字段名称或者map的key相同,如果只是单纯的一个参数可以不与之相同
<!--查询用户-->
    <select id="selectAll" resultType="users">
        select * from users
    </select>

<!--查询用户通过id-->
<!--此处建议使用#{}而不是 ${},原因是#{}在预处理时会用占位符?代替,
${}不会,所以${}会有sql注入的风险-->
    <select id="selectByUserID" resultType="users">
        select * from users where userid=#{suiyi}
    </select>

    <update id="update">
        update users set username = #{username} 
        ,usersex = #{usersex} where userid = #{userid}
    </update>

    <!--使用map传递参并返回map对象-->
    <select id="selectByUserNameAndUserSex" resultType="users">
        select * from users where username = #{keyname} and usersex = #{keysex}
    </select>

Dao层实现接口部分代码

    /*
    更新用户
     */
    @Override
    public void update(Users users) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        sqlSession.insert("mapper.UsersMapper.update",users);
    }

    @Override
    public Map<Integer, Users> selectByNameAndSex(String username, String usersex) {
        Map<String, String> map = new HashMap<>();
        //与Mapper中的#{}一致
        map.put("keyname",username);
        map.put("keysex",usersex);
        SqlSession sqlsession = MybatisUtils.getSqlSession();
        //采用namespace+id的方式来获取Mapper中的语句
        Map<Integer,Users> usersMap = sqlsession.selectMap("mapper.UsersMapper.selectByUserNameAndUserSex",map,"userid");
        return usersMap;
    }

值得注意的是selectMap方法第一个参数对应的是mapper里面的select语句的namespace+id,第二参数是传入的对象,第三个参数是返回的map对象的key,对应的是查询返回的表的一个字段。

Service层实现接口部分代码

    @Override
    public Map<Integer, Users> selectByUserNameAndUserSex(String username, String usersex) {
        Map<Integer, Users> map = null;
        try{
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserDao userDao = new UserDaoImpl();
            map = userDao.selectByNameAndSex(username,usersex);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            MybatisUtils.closeSqlSession();
        }
        return map;
    }

测试类

import Service.UserService;
import Service.UserServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pojo.Users;

import java.util.Map;
import java.util.Set;

public class Test {
    private static final Logger logger = LoggerFactory.getLogger(Test.class);
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        Map<Integer, Users> map = userService.selectByUserNameAndUserSex("liming","male");
        Set<Integer> set =  map.keySet();//获取所有的key
        for(Integer key:set){
            Users users = map.get(key);
            logger.debug(users.getUserid()+" "+users.getUsername()+" "+users.getUsersex());
        }

    }
}

使用Mapper动态代理

使用Mapper动态代理就简单一点不用创建Dao层,使用和映射配置文件放在一起的同名接口作为Dao层
在这里插入图片描述
如果要使用Mapper动态代理则需要接口中的方法名和映射配置文件中的id相同才能调用

在这里插入图片描述
对于数据库的操作和不适用Mapper动态代理相同

只是Mapper动态代理通过获取SqlSession对象的getMapper方法来调用对应的接口方法

public class SelectAll {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        List<Users> list = usersMapper.selectAll();
        list.forEach(users -> {
            System.out.println(users);
        });
    }
}

日志的选择

由于在开发中,性能是比较重要的,所以我们一般不用IO操作,因为IO读取会降低程序的性能,同时用户也开不见,所以一般选择输出到日志,这里我用的是slf4j,当然,你也可以用log4j等等,根据个人喜好
在这里插入图片描述

日志等级分为4级

Debug:程序调试信息都可以debug输出
info:对用户有用的信息
warn:可能会导致错误的信息
error:发生错误的地方

配置

log4j.rootLogger=debug,console,logfile

### appender.console输出到控制台 ###
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=<%d> %5p (%F:%L) [%t] (%c) - %m%n
log4j.appender.console.Target=System.out

### appender.logfile输出到日志文件 ###
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=SysLog.log
log4j.appender.logfile.MaxFileSize=500KB
log4j.appender.logfile.MaxBackupIndex=7
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=<%d> %p (%F:%L) [%t] %c - %m%n

使用例子

 private static final Logger logger = LoggerFactory.getLogger(你要使用日志的类);
 //你的代码...
 logger.debug("你要输出的内容");



以上就是Mybatis的简单入门使用,如有错误感谢指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值