mybatis基本配置和使用
附加jar包就不说了 从配置开始 我使用的版本是mybatis3.4.6
首先在src目录下 新建一个mybatis.xml的配置文件 这是mybatis的核心配置文件
<?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>
<!-- 配置类的别名 开始 -->
<typeAliases>
<package name="包名"/> <!-- 配置这个包下所有的类,别名都是简短类名,这样在映射配置中可以不用写完整类名 直接写简短类名-->
</typeAliases>
<!-- 配置类的别名 结束 -->
<!-- 配置第三方插件 开始(不是必须配置的,没有插件可以不用配置) -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper" /><!-- 配置分页插件(这个分页插件不是必须的 只不过可以借助这个插件实现分页查询 比较方便) -->
</plugins>
<!-- 配置第三方插件 结束 -->
<!-- 核心配置 数据源 开始 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="连接驱动jar包" />
<property name="url" value="数据库连接字符串" />
<property name="username" value="数据库用户名" />
<property name="password" value="数据库密码" />
</dataSource>
</environment>
</environments>
<!-- 核心配置 数据源结束 -->
<!-- 映射文件配置 开始 -->
<mappers>
<!-- 单独添加一个映射文件 <mapper resource="从src目录到当前映射的文件的路径"/> -->
<package name="包名"/> <!-- 添加一个包的映射文件 如果使用这个方式配置 dao接口的名字必须和映射文件完全同名-->
</mappers>
<!-- 映射文件配置 结束-->
</configuration>
sql语句映射的文件
<?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="命名空间名 一般写dao接口的完整名 方便mybatis生成代理类" >
<!-- 配置结果集映射 有时候连接查询 或者表中列名与类中属性名不一致 mybatis无法自动封装成对象 手动指定对应关系
在 resultmap标签中 association标签 和 collection标签 可以随意嵌套 -->
<resultMap id="名字任意 唯一即可 " type="要生成对象的类名" >
<id column="表中列名" property="类中属性名"/> <!-- 配置主键使用这个标签 -->
<result column="表中列名" property="类中属性名" /><!-- 配置主键使用这个标签 -->
<association property="类中对象属性名" column="表中的列名,该列的值作为调用下一个select语句的参数 不是必须的" javaType="对象的java类名"
select="只能引用别的select标签 跨映射文件 使用 命名空间.id 就可以引用 " >
<!-- 在association标签内 可以直接使用 <id/> 和<result/> 设置对象的属性值,association标签处理属性是对象-->
</association>
<collection property="类中集合属性名" column="表中的列名,该列的值作为调用下一个select语句的参数" ofType="集合中存放的类型的类名"
select="只能引用别的select标签 跨映射文件 使用 命名空间.id 就可以引用 ">
<!--在collection标签内 可以直接使用 <id/> 和<result/> 设置集合中对象的值-->
</collection>
</resultMap>
<!-- 查询方法 -->
<sql id="与接口中查询的方法名一致queryAllUser" resultType="返回值类型 之前配置了别名之后 这里可以只写简短类名"
parameterType="输入参数类型 常用类型mybatis已经配置过别名如String Integer ,自己定义的类 配置过别名 也可以只写简短类名"
resultMap="定义好的resultmap的标签的id值, 如果引用别的映射文件 加上命名空间.id"
>
查询语句 #{参数名} ,如果传入的是一个对象 想访问对象的属性值 #{对象名.属性名}
${参数名} 这样传入的参数 不会做为字符解析,会有被sql注入的风险 但是如果是 order by 排序 必须要使用这个传参
</sql>
<!-- 添加方法 -->
<insert id="" parameterType="输入参数类型 常用类型mybatis已经配置过别名如String Integer ,自己定义的类 配置过别名 也可以只写简短类名"
如果想将插入信息之后 将主键值返回 可以设置
useGeneratedKeys="true",
keyProperty="对象的主键属性名" keyColumn="主键列名" oracle数据库必须指定
insert方法的返回值还是受影响的行数,但保存的对象中主键属性已经是返回的主键值
>
插入语句
</insert>
<!-- 修改方法 -->
<update>
输入参数与其他标签一致 自动的返回值是受影响的行数
</update>
<! -- 删除方法 -->
<delete>
输入参数与其他标签一致 自动的返回值是受影响的行数
</delete>
一般还会定义一个帮助类 获得mybatis的session对象
public class MybatisUtil { private static SqlSessionFactory sessionFactory; static{ try { // 类加载时 实例化 SqlSessionFactory对象 String resource = "mybatis.xml"; //指定核心配置文件名 InputStream inputStream = Resources.getResourceAsStream(resource); //将配置文件读入输入字节流 sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//使用SqlSessionFactoryBuilder类的build()方法 传入配置文件字节流 //返回一个SqlSessionFactory对象实例 赋值给静态成员变量sessionFactory inputStream.close(); //关闭输入字节流 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static SqlSession getSession(){ return sessionFactory.openSession(); } private MybatisUtil(){}; //私有构造方法 }
这时候 通过MybatisUtil类静态方法getSession()就可以返回Sqlsession类的实例
测试代码 如下
public class test{ public static void main(String[] args){ Sqlsession session=mybatisUtil.getSession();//获得sqlsession实例 UserDao userdao=session.getMapper(UserDao.class);//通过sqlsession对象生成指定接口的实现类 userdao.saveUser(new User("张三",18));//执行具体方法 } }
再补充一下 动态sql
if标签 : 一般用于判断属性的值是否存在 如果存在 会将标签中的文本追加到sql语句后
<if test="stuName !=null and stunName !='' "> and stu_name like #{stuName} </if>
如果if标签中 判断的属性是一个对象,并且想判断这个对象属性的属性不为null,必须先判断这个属性不为null 才能判断这个这个属性的属性
例子: <if test="student !=null and student.stuName!=null">
--------------------------------------------------------------------
choose 标签: 多个条件 只选取其中一个 类似java中的switch
<choose>
<when test="表达式" >
sql语句
</when>
<when test="表达式" >
sql语句
</when>
<otherwise> <!-- 所有条件都不满足 默认执行这个 -->
sql语句
</otherwise>
</choose>
---------------------------------------------------------------------------------
where 标签: where元素会判断其包含的if标签是否有值 如果有值 会自动追加where语句 并且会去掉第一个and或者or
select * from t_student
<where>
<if test"stuSex!=null"> and stu_sex=#{stuSex} </if>
<if test"stuName!=null and stuName!=''"> and stu_name=#{stuName} </if>
</where>
-----------------------------------------------------------------------------------
trim 标签: 可以给sql语句加前缀名和后缀名 并去除指定的字符
<trim prefix="前缀内容" suffix="后缀内容"
prefixesToOverride="如果以这个指定的文本开头将被删除 一般写AND|OR 去除多余and和or"
suffixToOverride="如果以这个指定的文本结尾将被删除 一般写 ,号 用于删除多余的,号"></trim>
------------------------------------------------------------
set 标签: 一般用于处理修改 动态生成要修改的列 判断if里面的值 如果有 会自动加上set 关键字 并且消除多余 ,号
<set>
<if test"stuSex!=null"> stu_sex=#{stuSex}, </if>
<if test"stuName!=null and stuName!=''"> stu_name=#{stuName}, </if>
</set>
------------------------------------------------------------------
foreach 标签:可以遍历一个集合 可以用在动态删除和动态添加
<foreach item="代表集合中的每一个元素" index="index" collection="遍历的类型 如果是集合就写list 数组就写array"
open="以指定文本开头" separator="以指定文本分割每一个元素的值" close="以指定文本结尾">
</foreach>