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

Mybatis-01

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

Mybatis-01

目录:

1、mybatis简介:

 2、入门程序

3、模糊查询和注入问题     (${ } 和 #{  }的区别)

4、怎样返回自增主键

5、dao层的开发

        1)原始的方式

        2)mapper代理的方式(不用创建dao 的实现类,直接创建接口就可以,实现类由mybatis帮  我们创建) 

6.mybatis主配置文件的其他配置  

          Properties 主要用于配置属性信息

        settings 主要用于配置mybatis的运行时的一些方式

        typeAliases 用于配置类别名

        typeHandlers 用于配置类型处理器

        plugins 用于配置一些插件,比如分页插件

        environments 用于配置一些数据源,连接池等信息

        mappers  配置映射文件

1、mybatis简介:

    MyBatis 本是 apache的一个开源项目iBatis, 2010年这个项目由 apache software foundation 迁移到了google code,
        并且改名为 MyBatis  , 2013年11月迁移到Github , iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
        iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
        MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索
        MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

半ORM框架:ORM对象模型到关系模型的转换

对象模型: 类和对象

class UserInfo{
    id
    name
}

关系模型:数据库表和数据

table userinfo id,name

2、入门程序

1)首先在项目中建一个和src同级的目录lib,将mysql的驱动包和mybatis的驱动包放进去,添加至构建路径

2)建一个和src同级目录的源文件夹config(当然你可以叫其他名):源文件夹就是新建文件夹的时候点击Source Folder

3)config文件下建一个db.properties文件(数据库配置文件)

mysql8的配置

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
db.username=root
db.password=root

mysql5的配置

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf-8
db.username=root        你的数据库用户名
db.password=root        你的数据库密码

4)建mybatis的主配置文件 就在config的文件夹下建,比如我建的名字叫mybatis-config.xml

  




  

  
    	
	  
	
    
        
         
            
            
            
             
                 
                 
                 
                 
             
         
      
    
 
				

5)编写映射文件(通常来说,一个表对应一个)

        随便在哪建一个目录放映射文件

        我就在config下面建一个mappings的文件来放所有的映射文件

        映射文件的命名规则

        (1)非mapper代理的方式

                UserInfo ==> UserInfo.xml

          (2)mapper代理的方式

                Dao 层接口 ==>  UserMapper  ==> UserMapper.xml

例:UserInfo.xml文件

  
  


	
		select *from userInfo where id=#{id}
	

测试文件

public class Test {
	public static void main(String[] args) throws IOException {
		//加载主配置文件
		InputStream in=Resources.getResourceAsStream("mybatis-config.xml");
		
		//创建SqlSessionFactory
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
		
		//得到SqlSession
		SqlSession sqlsession=factory.openSession();
		
		
		//进行数据库操作
		UserInfo user=sqlsession.selectOne("xxx.getUserById", 1);//要带上名称空间
		System.out.println(user);
		//清理
		sqlsession.close();
	}
}

运行:报错Mapped Statements collection does not contain value for getUserById
                   说找不到名为getUserById的值

这是什么原因呢?

因为我们虽然写了mapper文件,但是我们没有在主配置文件里面引入

将mapper的映射文件在配置文件中声明引入

mybatis-config.xml文件

  
  

  	
	    
	
        
         
             
             
                 
                 
                 
                 
             
         
    
    
    
    
    		
      
    
 


      说明 
      1)  parameterType="int" 是用来指明传入的参数的类型 ,本例中,可以省略
          resultType="com.beans.UserInfo" 指的是返回的数据要处理成什么类型 ,一般都不可以省
           #{id} 这个写法相当于运去的 ? 占位符,当参数类型是简单类型的时候,里面的 id 可以写成任何字符串
           
             select *from userinfo where userName like #{userName}

    1)它的返回结果应该是个List

     2)#{}这样的占位,相当于jdbc中的  ?

关于#{ }和${value}这两种写法

        #{ }这样的写法,完全相当于jdbc中的 ? 占位

        ${ value }mybatis会直接将传过来的结果拼到字符串中(所以有注入问题),如果参数是简单类型,${ }里面的值必须叫value

select * from userinfo where userName like '%${ value }%'

注入问题:

例如:使用${value}方式传参引起的注入问题

List userList=session.selectList("xxx.getUserByName","1'or'1'='1'or'1=");

可以发现,出现注入问题

可以这样写

select * from good where goodName like "%"#{searchmessage}"%"  or  goodClassify like "%"#{searchmessage}"%"


select * from userInfo where username like concat('%',#{userName},'%')

4、返回自增主键
 


			insert into userInfo (userName,password,note) values (#{userName},#{password},#{note} ) 
		
		   
	

    keyProperty="id" 表示生成的主键,对应的  UserInfo 的属性是 id 这个字段
    keyColumn="id" 指的是表中id这列是主键

怎么获得自增主键呢?

	static void testAdd() {
			SqlSession session=MybatisUtil.oppenSession();
			UserInfo user=new UserInfo();
			user.setUserName("姜博文");
			user.setPassword("1357");
			user.setNote("哈学院");
			
			int result=session.insert("xxx.addUser",user); 
			session.commit(); 
			
			System.out.println(result==1?"添加成功":"添加失败");
			System.out.println("生成的自增主键是" +user.getId());
			
			session.close();
		}

5、dao层的开发

sqlSessionFactory 应该是单例的,将来要交给spring管理

sqlsession是线程不安全的,要做成局部变量

mybatis开发dao层,有两种方式

        1)原始的方式

        2)mapper代理的方式(不用创建dao 的实现类,直接创建接口就可以,实现类由mybatis帮我们创建)

1)原始的方式

        (1)dao层接口      

public interface UserDao {
	UserInfo getUserById(int id);
	
	int addUser(UserInfo user);
	
	void delete(int id);
	
	int updateUser(UserInfo user);
	
	List getAllUsers();
}

        (2)实现类

public class UserDaoImpl implements UserDao{
	UserDaoImpl(SqlSessionFactory factory){
		this.factory=factory;
	}
	private SqlSessionFactory factory;
	public UserInfo getUserById(int id) {
		SqlSession s=factory.openSession();
		UserInfo user=s.selectOne("xxx.getUserById",id);
		return null;
	}

	public int addUser(UserInfo user) {
		return 0;
	}

	public void delete(int id) {
		
	}

	public int updateUser(UserInfo user) {
		return 0;
	}

	public List getAllUsers() {
		return null;
	}

}

2)mapper代理的方式

使用mapper代理的好处就是不用再写dao层的实现类了,,mybatis会帮我们自己生成

我们只要编写dao层接口就可以

几个原则:

        1)映射文件的namespace属性,要和mapper接口的全名称一致        

xml配置文件中指向的是com.mapper.UserMapper接口
 

        2)mapper接口中方法的名称和映射文件中的SQL的id要相同

mapper中

public interface UserMapper {
			UserInfo getUserById(int id);
									
}

xml中


			select * from userInfo where id = #{id} 

4)typeHandlers:类型处理器

        类型处理器,mybatis中内置的就可以了,不用在定义了

5)plugins  插件

 下面定义了一个分页插件
				    
				        
				            
				            
				            
				            
				            
				            
				            
				        
				    

6)environments:用于配置一些数据源,连接池等相关信息

     
				         
				             
				             
				                 
				                 
				                 
				                 
				             
				         
  

7)mappers: 用于引入映射文件 

        引入映射文件的方式:

        (1)相对路径的方式       


		
		
 

        (2)使用全路径的方式引入

                比如c:/java/mapper/..........

         (3)使用类名包名的方式引入,要求映射文件和接口名必须相同,且在同一个包下

  


	

     

         (4) 使用 mapper 的方式批量加载  

     
               
     

      上例是加载 com.mapper 这个包下所有的映射文件


                  

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

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

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