Mybatis-结构介绍+初级入门程序

        主要是介绍mybatis的相关初级知识,配置文件讲解,初级增删改查的入门程序。

一、简介

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码

Mybatis通过xml或注解的方式将要执行的各种statementstatementpreparedStatementCallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

                   


    
  1. mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

  1. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

  2. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

  3. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

  4. MappedStatement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个MappedStatement对象,sqlid即是Mappedstatementid

  5. MappedStatementsql执行输入参数进行定义,包括HashMap、基本类型、pojoExecutor通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

  6. MappedStatementsql执行输出结果进行定义,包括HashMap、基本类型、pojoExecutor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

二、入门程序

    1、配置文件

    需要的相关jar

asm-3.3.1.jar

cglib-2.2.2.jar

commons-logging-1.1.1.jar

javassist-3.17.1-GA.jar

junit-4.9.jar

log4j-1.2.17.jar

log4j-api-2.0-rc1.jar

log4j-core-2.0-rc1.jar

mybatis-3.2.7.jar

mysql-connector-java-5.1.38.jar

slf4j-api-1.7.5.jar

slf4j-log4j12-1.7.5.jar

 

        配置文件

SqlMapConfig.xml文件的内容说明


<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

PUBLIC"-//mybatis.org//DTDConfig 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!--和spring整合后environments配置将废除-->

<environmentsdefault="development">

<environmentid="development">

<!--使用jdbc事务管理-->

<transactionManagertype="JDBC"/>

<!--数据库连接池-->

<dataSourcetype="POOLED">

<propertyname="driver"value="com.mysql.jdbc.Driver"/>

<propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>

<propertyname="username"value="root"/>

<propertyname="password"value="123456"/>

</dataSource>

</environment>

</environments>

<mappers>

<--加载映射文件-->

<mapperresource="User.xml"/>

</mappers>

</configuration>

    2、映射文件

<?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 namespace="test">
<!-- 
	id:sql语句的唯一标识符
	parameterType:指定传入的参数的类型
	resultType:指定返回的参数的类型
	#{}:如果是基本数据类型(Integer、String、double...),那么#{}花括号中的变量可随意填写,如果是pojo那么必须保证
	和pojo的变量名一致
 -->
	<select id="findById" parameterType="int" resultType="org.lier.zz.User">
		select *  from user where id = #{id}
	</select>
</mapper>

    3、入门程序

      查询

单个
	<select id="findById" parameterType="int" resultType="org.lier.zz.User">
		select *  from user where id = #{id}
	</select>
返回多个结果
			程序中使用selectList返回一个集合,所以映射文件中返回的类型应该是一个集合的泛型的类型——List<User>的User类型
	<select id="findByName" parameterType="string" resultType="org.lier.zz.User">
		select *  from user where username  like '%${value}%'
	</select>
		@Test
	public void  selectUserTest() throws IOException {
		String resource = "SqlMapConfig.xml";
//		通过输入流加载配置文件创建回话工厂,获取session
		InputStream is = Resources.getResourceAsStream(resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession  session = factory.openSession();
//		两个参数:第一个:namespace+sql_id,第二个是参数s
		User user =session.selectOne("test.findById", 1);
						//selectList
		System.out.println(user.toString());
		session.commit();
		session.close();
	}
  问题:

        %${value}%,%是字符串原样拼接符,如果传入的基本类型floatdoubleint等包括String,那么${}花括号中的东西必须的是value


    插入

    

<!-- 如果#{}中传入的是pojo,那么#{}中的名字必须和pojo的属性名一致 -->
	<insert id="insertUser" parameterType="org.lier.zz.User">
		<!-- 
			1、keyProperty:关键属性,一般是主键
			2、order:BEFOR、AFTER 表示这个查询实在sql之前还是之后进行操作
			3、		
		 -->
		<selectKey keyProperty="id" order="AFTER" resultType="int">
			select last_insert_id()/ select UUID()
		</selectKey>
		insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
	</insert>
    

遇见的问题:

        1、连接问题,不管是查询还是插入总是会提示连接所悟,提示要使用SSL连接,这个问题很怪因为之前我并没有使用SSL连接也能正常使用,mysql5.7的,网上说是要SSL连接的,解决办法是修改连接的URL连接中补上useSSL=true/false.但是如果将这个拼接到最后面,会提示UnSupportcharacter encoding 'utf-8;useSSL=false,真是奇怪的问题。最终是这样的

jdbc:mysql://localhost:3306/mybatis?usessl=true;characterEncoding=utf-8

        2sql书写问题如果在sql#{}不写入相关的东西也是回报错,这个是个人的粗心引起的。

        3、主键selectlast_insert_id()返回的是自增加的主键,如果要返回id则需要ORDER=”AFTER”selectUUID()返回的是32的字符串,所以一定要保证表中的字段一致才行。

    修改

<update id="updateUser" parameterType="org.lier.zz.User" >
		update user set username = #{username},sex = #{sex} ,birthday = #{birthday},address = #{address} where id = #{id};
	</update>
	相对简单没什么好说的……

    删除

<delete id="delUserById" parameterType="int">
		delete from user where id =#{id}
	</delete>
	没什么好说的

    4、原生dao整合Mybatis开发

Dao层:
	public interface UserDao {
	
	public List<User> selectUsersByName(String username);
}

	IMPL层:
	private SqlSessionFactory factory = null;
	
	public UserDaoImpl(SqlSessionFactory factory) {
		this.factory = factory;
	}
	
	@Override
	public List<User> selectUsersByName(String username) {
//		session线程不安全,放入放入方法体中,随用随毁
		SqlSession session = factory.openSession();
		List<User> users =session.selectList("test.findByName", "王五");
		session.commit();
		session.close();
		return users;
	}
	
	这个方法也是进行简单的封装,还是有大量的重复是代码产生。需要自行写实现类,不够简洁。

    5、动态代理方式(Mapper代理)

    1、创建MapperDao文件

public interface UserDaoMapper {
	public List<User> findByName(String username);
}
<!-- 
	mapper文件的编写规则:mapperdao和mapper.xml除了扩展名之外别的都要相同。
		1、namespace等于dao接口的全路径
		2、sql中的id等于dao接口的方法名
		3、paramterType等于方法的参数类型
		4、resultType要与方法的返回类型一织
 -->
<mapper namespace="org.lier.usermapper.UserDaoMapper">
	<select id="findByName" parameterType="string" resultType="org.lier.zz.User">
		select *  from user where username  like '%${value}%'
	</select>
</mapper>
	
在SqlMapConfig.xml中引入mapper文件

	<mappers>
		<mapper resource="User.xml"/>
		<mapper class="org.lier.usermapper.UserDaoMapper"/>
	</mappers>
测试:
	@Test
	public void mapperDaoTest() {
		SqlSession session = factory.openSession();
		UserDaoMapper mapper = session.getMapper(UserDaoMapper.class);
		List<User> users = mapper.findByName("王五");
		System.out.println(users);
	}

    6、SqlMapConfig.xml内容

    properties(属性)

    settings(全局配置参数)

    typeAliases(类型别名)

    typeHandlers(类型处理器)

    objectFactory(对象工厂)

    plugins(插件)

    environments(环境集合属性对象)

    environment(环境子属性对象)

    transactionManager(事务管理)

    dataSource(数据源)

     mappers(映射器)

        

    qlMapConfig.xml可以引用java属性文件中的配置信息如下:

在classpath下定义db.properties文件,
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

    SqlMapConfig.xml引用如下:

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

注意: MyBatis将按照下面的顺序来加载属性:

  • properties元素体内定义的属性首先被读取。

  • 然后会读取properties元素中resourceurl加载的属性,它会覆盖已读取的同名属性。

    7、别名

    

常用数据类型别名


别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

map

Map

    在SqlMapConfig.xml中配置别名

<typeAliases>
	<!-- 单个别名定义 -->
	<typeAlias alias="user" type="cn.itcast.mybatis.po.User"/>
	<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
	<package name="cn.itcast.mybatis.po"/>
	<package name="其它包"/>
</typeAliases> 

8、映射器

      1. <mapperresource=" " />

        使用相对于类路径的资源

        如:<mapperresource="sqlmap/User.xml" />

   2、<mapperclass=" " />

        使用mapper接口类路径

      如:<mapperclass="cn.lier.mybatis.mapper.UserMapper"/>

      注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

        3、<packagename=""/>

    

        注册指定包下的所有mapper接口

        如:<packagename="cn.lier.mybatis.mapper"/>

        注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。



    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值