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 这个包下所有的映射文件


                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值