栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SSM-MyBatis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SSM-MyBatis

MyBatis

一、MyBatis是什么?二、使用步骤

新建Mavean项目1.创建数据库文件2.导入依赖3.编写mybatis核心配置文件4.编写mybatis工具类5.编写代码6.测试 三、MyBatis的CRUD

1.操作Dao层的UserMapper类2.操作对应Dao层的Mapper.xml文件3.进行测试4.用Map改良Mapper(注解更佳) 四、MyBatis的配置解析mybatis-config.xml内的

1.环境、事务管理器、数据源2.属性3.类型别名4.★★设置★★5.映射器 五、生命周期和作用域

1.SqlSessionFactoryBuilder2.SqlSessionFactory3.SqlSession 六、解决属性名与字段名不一致问题

解决1:起别名解决2:使用resultMap 七、日志

1.LOG4J2.STDOUT_LOGGING


提示:这里可以添加本文要记录的大概内容:

一、MyBatis是什么?

持久层(Dao层)框架,优点
1、简单易学灵活
2、sql和代码的分离,提高了可维护性。
3、提供映射标签,支持对象与数据库的orm字段关系映射提供对象关系映射标签,支持对象关系组建维护
4、提供xml标签,支持编写动态sql

二、使用步骤 新建Mavean项目 1.创建数据库文件
CREATE DATAbase `mybatis` ;
use mybatis;
CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
2.导入依赖

pom.xml文件中


	
	
	    org.mybatis
	    mybatis
	    3.5.7
	
	
	
	    mysql
	    mysql-connector-java
	    8.0.21
	
	
	
	    junit
	    junit
	    4.13.2
	    test
	



	
		
			src/main/resources
			
				***.xml
			
			false
		
		
			src/main/java
			
				***.xml
			
			false
		
	

3.编写mybatis核心配置文件

在resource文件夹下新建mybatis-config.xml文件,写入






	
	
		
			
			
			
				
                
                
                
			
		
	
	 
    
        
    

4.编写mybatis工具类
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;

    static {
        try {
            // 获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}
5.编写代码

1、建立pojo的实体类

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 + ''' +
                '}';
    }
}

2、在Dao层创建对应Mapper类
(实际上是讲原本的接口类(Dao类)转变成Mapper类)

public interface UserMapper {
	//查询所有用户
    List getUserList();
}

3、为Dao类创建Mapper.xml文件,并进行配置
(实际上是将原本的接口实现类(DapImpl)转变成Mapper配置文件)






    
    
        select * from mybatis.user
    
	
    
        select * from mybatis.user where name like "%"#{name}"%";
    

3.进行测试

增删改操作需要提交事务

public class UserDaoTest {
    //测试:查询所有用户
    @Test
    public void getUserList_Test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        try {
            UserMapper userDao = sqlSession.getMapper(UserMapper.class);
            List userList = userDao.getUserList();

            //遍历
            for (User user : userList) {
                System.out.println(user);
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            //关闭sqlSession
            sqlSession.close();
        }
    }

    //测试:查询所有用户(根据id)
    @Test
    public void getUserById_Test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);

        sqlSession.close();
    }

    //测试:新增用户
    @Test
    public void insertUser_Test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int result = mapper.insertUser(new User(4, "张三", "1555"));
        if (result > 0){
            System.out.println("用户添加成功");
        }else {
            System.out.println("用户添加失败");
        }
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    //测试:更新用户信息
    @Test
    public void updateUser_Test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int result = mapper.updateUser(new User(4, "李白", "123"));
        if (result > 0){
            System.out.println("用户修改成功");
        }else {
            System.out.println("用户修改失败");
        }
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    //测试:删除用户
    @Test
    public void deleteUser_Test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int result = mapper.deleteUser(4);
        if (result > 0){
            System.out.println("用户删除成功");
        }else {
            System.out.println("用户删除失败");
        }
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

	//模糊查询(根据名字)
    @Test
    public void getUserLike(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List userList = mapper.getUserLike("李");

        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}
4.用Map改良Mapper(注解更佳)

当实体类或数据库的表中参数或字段过多时,应该考虑用Map来优化,以便减少不必要的操作
优化Mapper

//UserMapper类中
//优化增删改操作,以新增操作为例子
int insertUserMap(Map map);

//UserMapper.xml文件中


    insert into mybatis.user (id, name, pwd) values (#{user_id},#{username},#{password});


//测试类中
//测试:优化添加用户测试
@Test
public void insertUserMap_Test(){
    SqlSession sqlSession = MyBatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map map = new HashMap<>();
    //这里的键值对要与UserMapper.xml中的sql属性对应
    map.put("user_id", 6);
    map.put("username", "李逵");
    map.put("password", "321");

    int result = mapper.insertUserMap(map);
    if (result > 0){
        System.out.println("Map优化之用户添加成功");
    }else {
        System.out.println("Map优化之用户添加失败");
    }
    //提交事务
    sqlSession.commit();
    sqlSession.close();
}
四、MyBatis的配置解析 mybatis-config.xml内的 1.环境、事务管理器、数据源

	
    
    	
        
        
        
        	
            
            
            
            
        
    

2.属性

properties,作用:引入外部配置文件

//db.properties文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=UTF-8
username=root
password=123456

//mybatis-config.xml文件 



    
    
        
	
        
    

    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

3.类型别名

typeAliases,减少类名完全限定名的冗余
(当实体类多时,建议使用形式二或注解)

//mybatis-config.xml文件中

 
    
    
    
    


//对应的UserMapper.xml文件中


    select * from mybatis.user where id = #{id};

4.★★设置★★

settings,非常重要

mapUnderscoreToCamelCase,是否开启自动驼峰命名规则映射
loglmpl,指定MyBatis所用日志的具体实现,未指定时将自动查找
5.映射器

mappers,作用:为每个Mapper类绑定注册


	
    
	
	
	
	

五、生命周期和作用域

错误的使用会导致严重的【并发问题】

1.SqlSessionFactoryBuilder

一旦创建了SqlSessionFactory就不需要SqlSessionFactoryBuilder了,故应设为局部变量

2.SqlSessionFactory

可以理解为数据库连接池,一旦创建就一直存在,不需要重复创建,应该设为全局变量

3.SqlSession

一个连接数据库连接池的请求,线程不安全所以用完之后必须要关闭

六、解决属性名与字段名不一致问题

当数据库【表中的字段】与【实体类中定义的变量名】不一致时,可能会导致该不一致的属性无法被获取,如下:
表字段

实体类

解决1:起别名

通过类型处理器,在对应的Mapper.xml中修改sql


	select * from mybatis.user where id= #{id}

七、日志 1.LOG4J

在mybatis-config.xml中开启日志


    

在pom.xml中导包


  log4j
  log4j
  1.2.17

再resource包下新建log4j.properties文件,写入

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/veterlemon.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

简单使用

public class UserDaoTest {
    static Logger logger = Logger.getLogger(UserDaoTest.class);

    //测试:查询所有用户
    @Test
    public void getUserList_Test() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        logger.info("测试,成功进入getUserList_Test()方法");

        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        User user = userDao.getUserById(1);

        System.out.println(user);

        sqlSession.close();
    }

    @Test
    public void Log4j_Test(){
        logger.info("info:进入了log4j_test");
        logger.debug("debug:进入了log4j_test");
        logger.error("error:进入了log4j_test");
    }
}

2.STDOUT_LOGGING

在mybatis-config.xml中开启日志


    

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号