Mybatis学习

Mybatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

Mybatis全局配置




  
<configuration>
	
	<typeAliases>
		<package name="hu.mybatis.pojo"/>
	typeAliases>
	 
	<environments default="default">
		<environment id="default">
			  
			<transactionManager type="JDBC">transactionManager>
			
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=Asia/Shanghai&useSSL=false"/>
				<property name="username" value="test"/>
				<property name="password" value="123"/>
			dataSource>
		environment>
	environments>
	
	<mappers>
		<mapper resource="hu/mybatis/mapper/StudentMapper.xml"/>
	mappers>
configuration>

类型别名

  1. 给Java设置一个短的名字,减少类完全限定名的冗余。
    <typeAliases>
    <typeAlias alias="Author" type="domain.blog.Author"/>
    typeAliases>
    
  2. 指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
    <typeAliases>
    	<package name="hu.mybatis.pojo"/>
    typeAliases>
    
  3. 注解别名
    @Alias("author")
    public class Author {
    	 ...
    }
    

映射器(mappers)

完成全局配置后,就可以定义SQL语句,但需要加载SQL语句的映射文件,可以通过全局配置中的映射器来加载SQL语句的映射文件。
相对于类路径的资源引用

	<mappers>
  		<mapper resource="hu/mybatis/mapper/StudentMapper.xml"/>
	mappers>

亦可以通过包内映射器接口实现全部注册为映射器

<mappers>
  <package name="org.mybatis.builder"/>
mappers>

SQL语句的XML映射文件




<mapper namespace="hu.mybatis.mapper.StudentMapper">
	
	<select id="selTea" parameterType="int" resultType="teacher">
		select * from teacher where id=#{0}
	select>
mapper>
  1. id=“selTea”:selTea为方法名
  2. parameterType=“int”:传参类型为Integer
  3. resultType=“teacher”:返回类型为Teacher(因为全局配置中设定了类型别名,因此可以只写teacher,若未设置类型别名,则返回类型应填为“hu.mybatis.pojo.Teacher”)。
  4. #{0} 传入参数,还可以设定为#{param1} 、#{id}(Teacher类中有id属性)

Java文件中调用

第一种调用方式

		//加载全局配置文件并解析
		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
		SqlSession session=factory.openSession();
		//查询数据库中teacher表
		List<Student> list=session.selectList("hu.mybatis.mapper.StudentMapper.selStu");
		
		System.out.println(list.toString());

第二种调用方式

PeopleMapper.xml文件中



  
<mapper	namespace="hu.mybatis.mapper.PeopleMapper">
	<select id="selByNameAndId" resultType="People">
		select * from people where id=#{param1} and name=#{param2}
	select>
mapper>

新建PeopleMapper.java文件

package hu.mybatis.mapper;

import hu.mybatis.pojo.People;

//接口名要与PeopleMapper.xml文件中的一致(该接口位于hu.mybatis.mapper包下)
public interface PeopleMapper {
	//方法名与PeopleMapper.xml中的查询SQL映射的id值一致
	People selByNameAndId(int id,String name);
}

调用方式为:

		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		
		SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
		
		SqlSession session=factory.openSession();
		
		PeopleMapper pm=session.getMapper(PeopleMapper.class);
		People people = pm.selByNameAndId(3, "张三");
		System.out.println(people);

resultMap

实现单表映射关系

<resultMap type="teacher" id="mymap">
	 
	<id column="id" property="id1" />
	 
	<result column="name" property="name1"/> 
resultMap>
<select id="selAll" resultMap="mymap"> 
	select * from teacher 
select>

关联单个对象(N+1 方式)

N+1 查询方式,先查询出某个表的全部信息,根据这个表的信息查询另一个表的信息.

  1. 在 TeacherMapper 中提供一个查询
<select id="selById" resultType="teacher" parameterType="int">
	 select * from teacher where id=#{0} 
select>
  1. 在StudentMapper 中
<resultMap type="student" id="stuMap"> 
	<id property="id" column="id"/> 
	<result property="name" column="name"/> 
	<result property="age" column="age"/> 
	<result property="tid" column="tid"/>
	 
	<association property="teacher" select="com.bjsxt.mapper.TeacherMapper.selById" column="tid">
	association> 
resultMap> 
<select id="selAll" resultMap="stuMap">
	 select * from student
 select>

提使用 N+1 方式.时如果列名和属性名相同可以不配置,使用 Automapping 特性.但是 mybatis 默认只会给列专配一次,因此在StudentMapper可以简化配置

<resultMap type="student" id="stuMap"> 
	<result property="tid" column="tid"/>
	 
	<association property="teacher" select="com.bjsxt.mapper.TeacherMapper.selById" column="tid">
	association> 
resultMap> 
<select id="selAll" resultMap="stuMap">
	 select * from student
 select>

注解

简化SQL映射的配置文件

  1. 实现查询
    @Select("select * from teacher")
     List<Teacher> selAll();
    
    
  2. 实现新增
    @Insert("insert into teacher values(default,#{name})")
     int insTeacher(Teacher teacher);
    
  3. 实现修改
    @Update("update teacher set name=#{name} where id=#{id}") 
    int updTeacher(Teacher teacher);
    
  4. 实现删除
    @Delete("delete from teacher where id=#{0}")
     int delById(int id);
    
  5. 实现功能
    	@Results(value={ 
    		@Result(id=true,property="id",column="id"), 
    		@Result(property="name",column="name"),
    		@Result(property="list",column="id",many=
    			@Many(select="com.bjsxt.mapper.StudentMapper.selByTid"))
     	}) 
     	@Select("select * from teacher") 
     	List<Teacher> selTeacher();
    

遇到的问题

在全局xml配置文件中链接数据库的url报错:

文件中:

<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=Asia/Shanghai&useSSL=false" />  

报错:The reference to entity “useSSL” must end with the ‘;’ delimiter.

文件中将&改成分号,如下:

<property name="url" value="jdbc:mysql://localhost:3306/ssm?
serverTimezone=Asia/Shanghai;useSSL=false" />     

报错: No timezone mapping entry for ‘Asia/Shanghai;useSSL=false’

原因:在xml文件中 &符号 需要转义(转义规则)

更改后,xml中url配置如下:

<property name="url" value="jdbc:mysql://localhost:3306/ssm?
serverTimezone=Asia/Shanghai&useSSL=false" />  

结果:正常运行

你可能感兴趣的:(Java)