MyBatis初探
来源:互联网 发布:淘宝店铺怎么找不到了 编辑:程序博客网 时间:2024/05/29 09:37
一、了解什么是Mybatis
二、前期准备
下载jar包或者使用maven加入依赖,如果使用maven,可加入以下依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version></dependency>
三、配置整体Mybatis配置文件(Configuration.xml)
基本配置文件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><!-- 这些先暂时不用 <settings> //有很多属性可以设置,比如是否使用自动生成的主键,等等。。。 <setting name="useGeneratedKeys" value="false"/> <setting name="useColumnLabel" value="true"/> </settings> --><!--定义别名,方便别处引用,不是必须的--> <typeAliases> <typeAlias alias="UserAlias" type="com.gusi.demo.chat.pojo.User"/> </typeAliases> <!--设置数据库相关的连接信息等--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/autochat"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--设置实体类的映射配置文件xml--> <mappers> <mapper resource="com/gusi/demo/chat/pojo/User.xml"/> </mappers></configuration>
四、书写实体类以及映射配置文件( User.java, User.xml)
User.java 省略
User.xml:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="User">//命名空间,需要唯一 <resultMap type="com.gusi.demo.chat.pojo.User" id="UserResult">//将查询结果映射成JavaBean <id column="id" jdbcType="INTEGER" property="id"/>//数据库中主键映射 <result column="username" jdbcType="VARCHAR" property="username"/>//column表示sql查询返回的列名 <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>//property表示JavaBean中属性名 <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>//jdbcType表示数据库字段类型 </resultMap> //该语句通过命名空间和ID唯一标识,在java代码中调运该语句即可执行该语句对应的sql//parameterType是参数类型,可以是基本类型,也可是JavaBean类型//resultMap表示使用定义的哪个映射关系将结果集合转换为JavaBean <select id="find" parameterType="long" resultMap="UserResult"> SELECT * FROM user WHERE id = #{id:INTEGER} </select> //如果返回的是基本数据类型,就不用resultMap,直接使用resultType指定返回数据类型 <select id="version" parameterType="long" resultType="int"> SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER} </select> //如果没有返回结果,resultMap和resultType都不需要 <delete id="delete" parameterType="com.gusi.demo.chat.pojo.User"> DELETE FROM user WHERE id = #{id:INTEGER} </delete> //在此可以使用别名,方便书写,比如下面的UserAlise是在整体的配置文件中声明的别名 <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false"> INSERT INTO user ( id, username, password, administrator ) VALUES ( #{id}, #{username,jdbcType=VARCHAR}, #{password.encrypted:VARCHAR}, #{administrator,jdbcType=BOOLEAN} ) </insert> <update id="update" parameterType="UserAlias"> UPDATE user SET username = #{username,jdbcType=VARCHAR}, password = #{password.encrypted,jdbcType=VARCHAR}, administrator = #{administrator,jdbcType=BOOLEAN} WHERE id = #{id,jdbcType=INTEGER} </update> <!-- Unique constraint check --> <select id="isUniqueUsername" parameterType="map" resultType="boolean"> SELECT (count(*) = 0) FROM user WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS NULL) <!-- other than me --> AND (username = #{username,jdbcType=VARCHAR}) </select></mapper>
五、通过Mybatis获取的数据库的会话session
// 1通过配置文件获取数据库连接信息InputStream inputStream = Resources.getResourceAsStream("Configuration.xml");//创建SessionFactoryBuilderSqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//通过SessionFactoryBuilder获得SessionFactorySqlSessionFactory sqlSessionFactory = builder.build(inputStream);//通过SessionFactory获得sessionSqlSession sqlSession = sqlSessionFactory.openSession();
六、通过session,对数据库操作(编写dao类)
SqlSession sqlSession = sessionFactory.openSession();//获得sessionList list = sqlSession.selectList("Namespace.sqlId", paramObj);//查询列表集合Object obj = sqlSession.selectOne("Namespace.sqlId", paramObj);//查询一条记录sqlSession.insert("Namespace.sqlId", paramObj);//插入记录sqlSession.update("Namespace.sqlId", paramObj);//修改记录sqlSession.delete("Namespace.sqlId", paramObj);//删除记录sqlSession.commit();//默认事物是不提交的,需要手动自动提交
七、编写测试
@Testpublic void shouldInsertNestedPasswordFieldOfComplexType() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();try { //Create User User user = new User(); user.setId(500000L); user.setPassword(new EncryptedString("secret")); user.setUsername("johnny" + Calendar.getInstance().getTimeInMillis());//random user.setAdministrator(true); sqlSession.insert("User.insert", user); //Retrieve User user = (User) sqlSession.selectOne("User.find", user.getId()); assertNotNull(user.getId()); sqlSession.rollback();} finally { sqlSession.close();}}
到此基本流程完毕!接下来重点说明配置文件User.xml等
配置文件xml详细解释:
整个框架的核心就是实体映射配置文件xxx.xml(User.xml)文件中。通过配置该文件,实现数据库中的数据和JavaBean的交互(读写)。每一个和数据库交互的语句都被放在一个select、insert、update、delete标签内。每个这样的标签有一个唯一标识,java代码就是通过该唯一标识去执行特定的语句,比如上面的sqlSession.selectList("Namespace.sqlId",parameObj)中的“NameSapce.sqlId”就是一条sql语句的唯一标识。标签内的语句可以接受java代码传递的参数,比如上面parameObj就是传递和接收的参数,该参数可以是具体的java基本类型和String类型,也可以是复杂的对象类型或者集合类型,如果是基本类型或者String类型那么在配置文件中通过#{_parameter}获取,如果是集合类型那么在配置文件中通过#{list}获取,如果是复杂对象类型那么在配置文件中通过#{obj的attribute}直接获取。然后根据条件以及接收的参数动态拼装sql,动态拼装sql的时候,会使用的ognl表达式一个各种条件标签如<if><foreach><where><set><trim>等标签。通过上面一系列的操作,最终会得到一个sql语句,Mybatis执行该sql语句以后如果有返回结果,返回结果是基本类型就直接用returnType限定,如果是复杂类型或者集合类型,就通过returnMap转换,然后将转化的结果返回给java代码中的调运结果。整个流程简单总结就是:参数映射->sql解析->sql执行->结果映射,对于数据写入和读取都是同样流程。
配置文件xml标签总结:
标签类型
标签
说明
定义sql语句
select
查询语句
insert
插入语句
update
更新语句
delete
删除语句
结果映射
resultMap
结果集合和javaBean映射配置
collection
一对多中多方集合映射
association
多对一中一放对象映射
动态sql拼接
if
条件标签
choose/when/otherwise
条件选择标签
foreach
循环迭代标签
格式化输出
where
查询时候快捷拼接条件
set
更新时候快捷拼接值
trim
指定前缀后缀等,可达到where/set效果
常量定义使用
sql
定义一段常量
include
引用一段常量
resultMap
结果集合映射到JavaBean中,返回的结果是JavaBean
resultType
结果返回的是一个Java基础类型或者String类型,不需要映射
parameterMap
请求参数的JavaBean映射,不推荐使用
parameterType
定义请求参数的class类型,可以是JavaBean类型,也可以是基础java类型或者String
#{}/${}
#{}表示的是问好(?)占位符,更常用。${}表示的是直接用参数代替,不会加引号,一般在排序的时候可能会用到。
#{}/ognl内容取值
简单类型参数用#{_parameter},集合类型用#{list},JavaBean类型直接用#{attribute}
- myBatis初探
- 初探MyBatis
- MyBatis初探
- 初探MyBatis
- Mybatis初探
- MyBatis初探
- myBatis初探
- MyBatis 初探
- Mybatis初探
- MyBatis初探
- Mybatis初探
- MyBatis初探
- 初探MyBatis
- Mybatis二级缓存初探
- Mybatis migration使用初探
- MyBatis框架之初探
- JAVA mybatis:初探
- Mybatis学习总结(一).初探Mybatis
- maven 安装
- mount.nfs: access denied by server while mounting 一个解决办法
- 整理 iOS 9 适配中出现的坑
- IntelliJ Idea 常用快捷键列表
- Eclipse下导入外部jar包的3种方式
- MyBatis初探
- MyEclipse在Java文件中设置作者、日期
- 百度JSP版坐标转换 限定不大于10个每次的处理办法
- 【Bugly 一岁了】所有的努力,都需要时间的鉴证。
- 查询某条记录在数据库中是 第几行
- Java用itext操作PDF
- maven jdk 版本配置
- Lvs之NAT、DR、TUN三种模式的应用配置案例
- 窗宽窗位与其处理方法