MyBatis(原名iBatis)源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis。它是一个优秀的持久层框架。
官网地址:http://www.mybatis.org/mybatis-3/
为了和数据库进行交互,通常的做法是将SQL语句写在Java代码中,SQL语句和Java代码耦合在一起不利于后期维护修改,而MyBatis能够帮助我们将SQL语句和Java代码分离,方便了后期因需求变动而对SQL语句进行修改。(联系properties文件的作用)
是ORM框架 (对象持久化)
通过mybatis提供得映射方式 可以自由地将数据映射为JavaBean对象
创建工程
创建一个Maven工程
1.引入jar包 mybatis包 从官网下载 (可引入log4j 查询时可看更详细的信息)
2.创建一个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="jdbc.properties"></properties><!-- 配置mysql信息 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 全局配置B
<typeAliases>
<typeAlias type="userinfo.vo.UserInfo" alias="userinfo"/>
</typeAliases>
-->
<!--配置A -->
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${mysql_driver}" />
<property name="url" value="${mysql_url}" />
<property name="username" value="${mysql_username}" />
<property name="password" value="${mysql_passwd}" />
</dataSource>
</environment>
<!--
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/demo" />
<property name="username" value="****" />
<property name="password" value="****" />
</dataSource>
</environment>
-->
</environments>
<mappers>
<mapper resource="userinfo.xml"/>
</mappers>
</configuration>
配置数据库信息 可创建一个jdbc.properties 然后可按第一种方法配置 若没有 则按第二种方法
resource将mapper注册进来
3.配置类信息 如
public class UserInfo {
private String id;
private String userName;
private String password;
private List<Address> addresses;
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "UserInfo [id=" + id + ", userName=" + userName + ", password=" + password + "]";
}
}
注意!若在写查询的时候想要返回某对象所有参数 需要使用list 这时候必须在类中加上toString方法!
4.配置方法mapper.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 namespace="userinfo.dao.IUserInfoDao">
<resultMap type="userinfo.vo.UserInfo" id="userinfo">
<id column="user_id" property="id" />
<result column="user_name" property="userName" />
<result column="passwd" property="password" />
</resultMap>
<!--id主键 -->
<select id="getUserId" parameterType="string" resultMap="userinfo"><!--resultType(引用mybatis中配置的时候 此处使用的为上列的resultMap)可直接写string 八种基本数据类型前需加_ 如_int,_byte 包装类则为小写如int,byte-->
select user_id, user_name, passwd from t_sys_user where user_id=#{id}
</select>
<select id="getByIds" parameterType="list" resultMap="userinfo"><!--resultType可直接写string 八种基本数据类型前需加_ 如_int,_byte 包装类则为小写如int,byte-->
select user_id, user_name, passwd from t_sys_user
<where>
<if test="list != null"><!--注意list不是字符串不会为""不需要and list!='' -->
<foreach collection="list" item="userid" open="and user_id in (" separator="," close=")">
#{userid}
</foreach>
</if>
</where>
</select>
<!-- 查询多条数据 open前缀 separator分隔号 close后缀-->
<!--
<select id="getByDouble" resultMap="userinfo">
select userid, userName, password from t_sys_user where 1=1
<if test="userid != null and userid !=''">
and user_id=#{id}
</if>
<if test="userName != null and userName !=''">
and user_name=#{userName}
</if>
</select>
-->
<select id="getByDouble" resultMap="userinfo">
select user_id, user_name, passwd from t_sys_user
<where>
<if test="id != null and id !=''">
and user_id=#{id}
</if>
<if test="userName != null and userName !=''">
and user_name=#{userName}
</if>
</where>
</select>
<select id="select" resultMap="userinfo"><!-- 全局配置B可自定义resultType -->
select user_id,user_name,passwd from t_sys_user<!-- userName 成员变量名与字段名不同不同 需在总xml配置A-->
</select>
<insert id="add">
insert into t_sys_user(user_id,user_name,passwd) value(#{arg0},#{arg1},#{arg2})
</insert>
<delete id="delete">
delete from t_sys_user where user_id=#{id1}
</delete>
</mapper>
若加入
<resultMap type="userinfo.vo.UserInfo" id="userinfo">
<id column="user_id" property="id"> <!--主键 -->
<result column="user_name" property="userName">
<result column="passwd" property="password">
</resultMap>
可以将
<select id="getUserId" resultType="userinfo"> select user_id id,user_name userName,passwd password from t_sys_user where user_id=#{id} </select>
改为
<select id="getUserId" resultType="userinfo"> select id, userName, password from t_sys_user where user_id=#{id} </select>
模糊查询select user_id from t_sys_user where user_name like '%${value}%'
使用标签select做数据表的查询操作:
属性id 标识映射文件中sql的唯一性 此id成为statementID 原因是此sql被映射到mappedStatement对象中。
#{paramName} 代表占位符 如果入参参数是基本数据类型,paramName可以任意指定,也可以是value
parameterType: 入参参数类型
resultType: 输出结果类型,标识将单条记录映射成java对象
${}: 表示拼接sql字符串 将接收到的参数内容不加任何修饰拼接在sql中,使用 ${}拼接sql可能会引起sql注入
${value}: 接收输入参数的内容,如果传入的是简单类型 ${}中只能使用value
采用mapper代理的方式进行Dao层开发,需要有几个约定(约定大于配置)
1.XXXMapper.xml中namespace的值需要与Dao接口中的全类名相同。(确定哪一个XXXMapper.xml文件)
2.XXXMapper.java接口中的方法名与XXXMapper.xml中的statementId相同(确定使用哪个sql)。
3.XXXMapper.java接口中的方法输入参数需要与XXXMapper.xml中的ParameterType定义的类型相同。(目前新版本不用写ParameterType)
4.XXXMapper.java 接口欧中的方法返回值需要与XXXMapper.xml中resultType定义的类型相同。(如果是基本数据类型也不用写)
5.在方法实现层内定义实现SqlSessionFactory
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//代指文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//SqlSessionFactory代指一次数据库连接
SqlSession sqlSession = sqlSessionFactory.openSession();//打开与数据库对话 默认值为flase 若写为true则自动提交不需要sqlSession.commit();
IUserInfoDao userInfoDao = sqlSession.getMapper(IUserInfoDao.class);//实现Dao层 运用方法