IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mybatis-01 -> 正文阅读

[大数据]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

<?xml version="1.0" encoding="UTF-8"?>  <!--这一行叫文档类型声明,必须在第一行,前面不能有空格有空行,要求非常严格-->
<!--DOCTYPE 说明这个文档接受的校验规则是什么样的-->
<!--configuration  说明这个文档的根节点目录,比如<configuration></configuration>  	-->
<!-- PUBLIC 表示这个规则,这个规范的名字叫"-//mybatis.org//DTD Config 3.0//EN" ,遵守的规则是"http://mybatis.org/dtd/mybatis-3-config.dtd" 这个规则约束了你可以写什么 -->

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">  

<configuration>  
    <!--将数据库的配置文件引过来-->	
	<properties resource="db.properties" />  
	
    
    <environments default="development">    
       <environment id="development">  
            <!--使用mybatis内置的一个事物管理器-->
           <transactionManager type="JDBC"/> 
           <!--使用mybatis内置的一个数据源--> 
           <dataSource type="POOLED">  
               <property name="driver" value="${db.driver}"/>  
               <property name="url" value="${db.url}"/>  
               <property name="username" value="${db.username}"/>  
               <property name="password" value="${db.password}"/>  
           </dataSource>  
       </environment>  
    </environments>  
    
</configuration> 
				

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

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

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

? ? ? ? 映射文件的命名规则

? ? ? ? (1)非mapper代理的方式

? ? ? ? ? ? ? ? UserInfo ==> UserInfo.xml

? ? ? ? ? (2)mapper代理的方式

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

例:UserInfo.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的 -->

<mapper namespace="xxx">
	<select id="getUserById" parameterType="int" resultType="com.beans.UserInfo">
		select *from userInfo where id=#{id}
	</select>

</mapper>

测试文件

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文件

<?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 resource="db.properties" />  
	
    <environments default="development">    
       <environment id="development">  
           <transactionManager type="JDBC"/>  
           <dataSource type="POOLED">  
               <property name="driver" value="${db.driver}"/>  
               <property name="url" value="${db.url}"/>  
               <property name="username" value="${db.username}"/>  
               <property name="password" value="${db.password}"/>  
           </dataSource>  
       </environment>  
    </environments>
    
    <!--引入映射文件-->
    <mappers>
    	<mapper resource="mappings/UserInfo.xml"></mapper>	
    </mappers>  
    
</configuration> 


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

? ? ? 2) 如果指明了 parameterType="int" ,则在传参的时候,必须传int型,如果传String 将出错?
? ? ??
? ? ? 3) mybatis中的几个重要角色
? ? ? ? ?(1) 主配置文件 mybatis-config.xml ?
? ? ? ? ? ? ? 它的名字任意,主要用来配置数据源,事务等运行时环境 ,引入映射文件 (比如上例中的 UserInfo.xml )
? ? ? ? ?
? ? ? ? ?(2) SqlSessionFactory
? ? ? ? ? ? ? 会话工厂, 它是根据配置文件创建的 ,用来创建 SqlSession ?
? ? ? ? ? ? ??
? ? ? ? ?(3) SqlSession
? ? ? ? ? ? ? 称为会话, 是一个接口,用来操作数据库,进行增,删,改,查等操作 ,它类似于过去JDBC中的 Connection 对象
? ? ? ? ? ? ? 一定要注意,它的HttpSession没有任何关系?
? ? ? ? ? ? ? 它是线程不安全的?
3、模糊查询和注入问题? ? ? ? ?

? ?

<select id="getUserByName" resultType"com.beans.UserInfo">
    select *from userinfo where userName like #{userName}
</select>

? ? 1)它的返回结果应该是个List<UserInfo>

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

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

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

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

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

注入问题:

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

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

可以发现,出现注入问题

可以这样写

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

<!--也可以用concat这个函数-->
select * from userInfo where username like concat('%',#{userName},'%')

4、返回自增主键
?

<insert id="addUser" parameterType="com.beans.UserInfo"  useGeneratedKeys="true"  keyProperty="id" keyColumn="id" >
			insert into userInfo (userName,password,note) values (#{userName},#{password},#{note} ) 
		</insert>
		   
	

?? ?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<UserInfo> 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<UserInfo> getAllUsers() {
		return null;
	}

}

2)mapper代理的方式

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

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

几个原则:

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

xml配置文件中指向的是com.mapper.UserMapper接口
?<mapper namespace="com.mapper.UserMapper">

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

mapper中

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

xml中

<!--id的名字和UserMapper中的方法名一样-->
<select id="getUserById"   resultType="com.beans.UserInfo">
			select * from userInfo where id = #{id} 
</select>

? ? ? ? 3)接口中方法的返回值类型,要和映射文件中的resultType一致,参数类型要和ParameterType一致

? ? ? ? 只要符合上面的规则,mybatis就会帮我们实现这个接口的实现类

不要忘了在主配置文件里面注入UserMapper.xml文件

<mappers>
		<mapper resource="mappers/UserMapper.xml" />
 </mappers>

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

? ? ? ? Properties 主要用于配置属性信息

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

? ? ? ? typeAliases 用于配置类别名

? ? ? ? typeHandlers 用于配置类型处理器

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

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

? ? ? ? mappers? 配置映射文件

1)properties 主要用于配置属性信息

? ? ? ? 可以引入外部的属性文件,或者直接在<property name="" value=""/>

mybatis-config.xml中
<properties resource="db.properties" >  
			<property name="cat" value="tomCat"/> //property里面的属性可以用${cat}这样的方式来取
			<property name="fish" value="sharkFish"/>
			<property name="db.password" value="xxxxx"/>  //如果这里的属性和外部文件中的属性同名,则优先使用外部文件中的配置,如果外部文件没有配置,则使用的是当前文件的
</properties>

	<environments default="development">    
				       <environment id="development">  
				           <transactionManager type="JDBC"/>  
				           <dataSource type="POOLED">  
				               <property name="driver" value="${db.driver}"/>  //这里用到了配置的属性
				               <property name="url" value="${db.url}"/>  
				               <property name="username" value="${db.username}"/>  
				               <property name="password" value="${db.password}"/>  
				           </dataSource>  
				       </environment>  
	 </environments>  

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

?<settings>
?? ??? ??? ??? ??? ? ?<setting name="cacheEnabled" value="true" />
?? ??? ??? ??? ??? ? ?<setting name="lazyLoadingEnabled" value="true" /> ?
?? ??? ??? ??? ??? ? ?<setting name="multipleResultSetsEnabled" value="true" /> ?
?? ??? ??? ??? ??? ? ?<setting name="useColumnLabel" value="true" />
?? ??? ??? ??? ??? ? ?<setting name="useGeneratedKeys" value="false" />
?? ??? ??? ??? ??? ? ?<setting name="autoMappingBehavior" value="PARTIAL" />
?? ??? ??? ??? ??? ? ?<setting name="defaultExecutorType" value="SIMPLE" />
?? ??? ??? ??? ??? ? ?<setting name="defaultStatementTimeout" value="25" />
?? ??? ??? ??? ??? ? ?<setting name="safeRowBoundsEnabled" value="false" />
?? ??? ??? ??? ??? ? ?<setting name="mapUnderscoreToCamelCase" value="false" />
?? ??? ??? ??? ??? ? ?<setting name="localCacheScope" value="SESSION" />
?? ??? ??? ??? ??? ? ?<setting name="jdbcTypeForNull" value="OTHER" />
?? ??? ??? ??? ??? ? ?<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
?</settings>?? 

?3)typeAlice? 配置文件的别名

 <typeAliases>
			//单个别名的定义
			<typeAlias type="com.beans.UserInfo" alias="userInfo"/>
						
			//批量定义别名,别名的名称是类的简单名称,首字母大小写均可
			<package name="com.beans"/>
</typeAliases>
					
 定义完别名以后 程序中就可以使用这个别名了 ,resultType里面的UserInfo就是上面配置的别名
<select id="getUserById"   resultType="userInfo">
			select * from userInfo where id = #{id} 
</select>

4)typeHandlers:类型处理器

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

5)plugins? 插件

 下面定义了一个分页插件
				    <plugins>
				        <plugin interceptor="com.github.pagehelper.PageHelper">
				            <property name="dialect" value="mysql"/>
				            <property name="offsetAsPageNum" value="false"/>
				            <property name="rowBoundsWithCount" value="false"/>
				            <property name="pageSizeZero" value="true"/>
				            <property name="reasonable" value="true"/>
				            <property name="supportMethodsArguments" value="false"/>
				            <property name="returnPageInfo" value="none"/>
				        </plugin>
				    </plugins>

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

 <environments default="development">    
				       <environment id="development">  
				           <transactionManager type="JDBC"/>  
				           <dataSource type="POOLED">  
				               <property name="driver" value="${db.driver}"/>  
				               <property name="url" value="${db.url}"/>  
				               <property name="username" value="${db.username}"/>  
				               <property name="password" value="${db.password}"/>  
				           </dataSource>  
				       </environment>  
</environments>  

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

? ? ? ? 引入映射文件的方式:

? ? ? ? (1)相对路径的方式? ? ? ?

<mappers>
		<mapper resource="mappers/UserMapper.xml" />
		<mapper resource="mappers/GoodsMapper.xml" />
 </mappers>

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

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

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

??

<mappers>
	<mapper class="com.mapper.UserMapper" />
</mappers>

? ? ?

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

? ???<mappers>
?? ??? ??? ??? <package name="com.mapper"/>
?? ??</mappers>

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


?? ??? ??? ??? ???

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:55:11  更:2021-10-04 12:56:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:09:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码