mybattis的操作


主配置文件mybatis-config,放到rescource

<?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="db.properties"></properties>
	<!-- 如果使用log4j2.x 必必须设置log4j版本 -->
	<settings>
		<setting name="logImpl" value="LOG4J2"/>
	</settings>
	<!-- 配置的别名 -->
	<typeAliases>
		<typeAlias type="org.fkjava.mybatis.domain.User" alias="User" />
		<!-- 通过包扫描设置包下面Domain组件对应的别名:默认就是包下面组件对应的简单类名
			Department,Employee,不区分大小写
		 -->
		<package name="org.fkjava.mybatis.domain"/>
	</typeAliases>
	
	<!-- 配置MyBatis的环境 :默认是使用的是 default环境 -->
	<environments default="default">
		<!-- id : 当前环境的标识符 -->
		<environment id="default">
			<!-- 配置事物环境默认是: JDBC -->
			<transactionManager type="JDBC" />
			<!-- 配置连接池相关数据 -->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 配置映射文件 -->
	<mappers>
	<!-- 引入映射文件 -->
		<mapper resource="org/fkjava/mybatis/domain/UserMapper.xml" />
		<!--引入注解接口配置 -->
		<mapper class="org.fkjava.mybatis.annomapper.AnnoMapper"/>
		<!--引入注解接口和配置文件 -->
		<package name="org.fkjava.mybatis.mapper"/>
	</mappers></configuration>

在rescources放db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///mybatis
username=root
password=admin

在rescources放log4j.properties

# Global logging configurationlog4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
#扫描dao包就可以log4j.logger.org.fkjava.mybatis.mapper=TRACE
# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?><configuration status="ERROR">
	<appenders>
		<!-- 配置一个Console的输出目标,name是用来给ref使用的 -->
		<Console name="Console" target="SYSTEM_OUT">
			<!-- 日志输出的格式 -->
			<!-- %-5level 表示左对齐的5个字符的日志级别,比如debug、info等 -->
			<!-- %d{yyyy-MM-dd HH:mm:ss.SSS} 精确到毫秒的日志记录时间 -->
			<!-- %t 日志输出的线程 -->
			<!-- %logger{36} 最长36个字符的日志记录器的名称,通常就是类名,如果太长会自动把包名简写 -->
			<!-- %msg 日志内容的主体 -->
			<!-- %n 换行 -->
			<PatternLayout
				pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />
		</Console>
	</appenders>
	<loggers>
		<logger name="org.fkjava" level="debug"></logger>
		<!-- <logger name="org.mybatis" level="debug"></logger> -->

		<!-- root日志记录器 -->
		<root level="error">
			<appender-ref ref="Console" />
		</root>
	</loggers></configuration>

通过ibatis操作

XxxMapper.xml没有什么规则,只要那么namespace=XxxMapper.xml放置的路径即可, 这个时候dao的接口不会起作用,可以不写接口 namespace="org.fkjava.domain.XxxMapper"

InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);		
		// 创建SqlSession对象
		SqlSession session = factory.openSession();		
		//查询一条记录,通过namespace+id查找sql
		User user = session.selectOne("org.fkjava.mybatis.domain.UserMapper.findById", 2);		
		//查询所有记录
		List<User> users = session.selectList("org.fkjava.mybatis.domain.UserMapper.findAll");		
		//带参数查询
		List<User> users = session.selectList("org.fkjava.mybatis.domain.UserMapper.findByLike", "人");		
		//插入数据
		session.insert("org.fkjava.mybatis.domain.UserMapper.insertUserInfo", user);		
		//修改数据
		session.update("org.fkjava.mybatis.domain.UserMapper.updateUserInfo", user);		
		//删除数据
		session.delete("org.fkjava.mybatis.domain.UserMapper.deleteById", 7);		
		// MyBatis事物默认是手动提交的,需要开发者自己提交事物
		session.commit();
		session.close();

通过Mapper动态代理

需要提供一个dao接口,接口和XxxMapper.xml有规则:

XXXMapper.xml和dao接口的文件名一样;
XXXMapper.xml的命名空间namespace等于dao接口的全限定名(类路径);
XXXMapper.xml的id等于接口的方法名;
XXXMapper.xml的参数类型等于方法的参数类型;
XxxMapper.xml的返回数据类型等于方法的返回类型。

注解和配置文件的操作是一样的,不同的是一个要XxxMapper.xml,一个用注解代替 ,在主配置文件mybatis-config.xml扫描不一样,注解只扫描接口,配置文件只扫描XxxMapper.xml,包扫描就两个都包含

InputStream inputStream = Resources.getResourceAsStream(resource);		
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);		
// 创建SqlSession对象
SqlSession session = factory.openSession();		
// 通过MyBatis动态创建UserMapper接口的代理对象
	UserMapper mapper = session.getMapper(UserMapper.class);		
	//调用接口自定义的方法
	User user = mapper.findById(1);		
	List<User> users = mapper.findAll();		
	List<User> users = mapper.findByIds(ids);		
	session.comit();		
	session.close();

注解的配置

public interface AnnoMapper {
	@Select("select * from user where id = #{id}")	User findById(Integer id);
	
	@Select("select * from user")
	List<User> findAll();
	
	@Delete("delete from user where id = #{id}")
	void deleteById(Integer id);
	
	@Update("update user set name=#{name},age=#{age},password=#{password} where id =#{id}")
	void updateUser(User user);
	
	@Insert("insert into user (name,age,password) values(#{name},#{age},#{password})")
	void insertUser(User user);
	
	
}

接口参数传递配置

public interface UserMapper {	
	User findById(Integer id);
	
	List<User> findAll();
	
	void updateUserInfo(User user);
	
	void insertUserInfo(User user);
	
	void deleteById(Integer id);	
	
	User login(@Param("name")String name,@Param("password")String password);	
	User login1(Map<String, Object> map);
	
	
	List<User> findByCondition(QueryObject qo);
	

	List<User> findByIds(@Param("ids")Integer[] ids);
	
}

XxxMapper.xml一般放在dao接口一样位置

<?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">
  <!-- namespace: 命名空间,确保当前映射文件的唯一标识 -->
  <mapper namespace="org.fkjava.mybatis.mapper.UserMapper">
  
  	<!-- 单行查询操作
  		id: 当前数据表操作的唯一标识
  		parameterType : 需要传入参数的类型
  		resultType :查询结果返回的数据类型
  	 -->
  	<select id="findById" parameterType="Integer" resultType="User">
  		select * from user where id = #{id}
  	</select>
  	
  	<!-- 多行查询
  	注意 :无论是单行查询还是多行查询,resultType返回类型都是 domain对应的类型 
  	 数据的返回类型  resultType(自动映射),resultMap(手动映射)这两个属性同时
  	 只能出现一个
  	 -->
  	<select id="findAll"  resultMap="user_map">
  		select id u_id,name u_name,age u_age,password u_password from user  	</select>
  	<!-- 创建resultMap 进行手动映射列和属性 -->
  	<resultMap type="User" id="user_map">
  		<!-- 手动映射主键列 
  			property :domain 对应的属性
  			column :查询结果集对于的列名
  			javaType :java中对应的数据类型
  			jdbcType :数据库中数据列对应的类型
  		-->
  		<id property="id" column="u_id" javaType="Integer" jdbcType="INTEGER" />
  		<!-- 手动映射非主键列 -->
  		<result property="name" column="u_name"/>
  		<result property="age" column="u_age"/>
  		<result property="password" column="u_password"/>
  	</resultMap>
  	
  	
  	<!-- 模糊查询
  	  #{} 用于预编译SQL语句设置对应的值 select * from user where id = #{id}/?
  	  ${} 用于拼接字符串的SQL语句设置对应的值 select * from user where name like '%${value}%'
  	  ${}中的名称必须是value :${value}
  	 -->
  	<select id="findByLike" parameterType="String" resultType="User">
  		select * from user where name like '%${value}%'  	</select>
  	
  	
  	<!-- 修改用户信息:修改操作 -->
  	<update id="updateUserInfo" parameterType="User" >
  	<!--update user set name=#{name},age=#{age},password=#{password} where id=#{id} -->
  		update user 
  		<set>
  			<if test="name!=null">name=#{name},</if>
  			<if test="age!=null">age=#{age},</if>
  			<if test="password!=null">password=#{password}</if>
  		</set>
  		where id = #{id}
  	</update>
  	
  	<!-- 删除用户 -->
  	<delete id="deleteById" parameterType="Integer">
  		delete from user where id = #{id}
  	</delete>
  	
  	<!-- 添加用户
  		keyProperty: 数据表中对应domain的主键的属性
  		useGeneratedKeys : 是否能获取生成主键
  	 -->
  	<insert id="insertUserInfo" parameterType="User"
  	 keyProperty="id"  useGeneratedKeys="true">
  		insert into user (name,age,password)values(#{name},#{age},#{password})  	</insert>
  	
  	<!-- 登录操作 -->
  	<select id="login" parameterType="String" resultType="User">
  		select * from user where name = #{name} and password = #{password}
  	</select>
  	
  	<!-- 登录操作 -->
  	<select id="login1" parameterType="String" resultType="User">
  		select * from user where name = #{name} and password = #{password}
  	</select>
  	<!--======================动态SQL,高级查询=====================-->
  	<!-- 条件查询 -->
  	
  	<select id="findByCondition" resultType="User" parameterType="org.fkjava.mybatis.query.QueryObject">
  		select * from user  		<where>
  			<if test="name !=null">
  				name = #{name}
  			</if>
  			<if test="age !=null">
  				or age = #{age}
  			</if>
  		</where>	
  	</select>
  	
  	<!--查询指定id的所有用户信息  -->
  	<select id="findByIds" parameterType="Integer" resultType="User">
  		<!-- select * from user where id in(1,2,3) -->
		select * from user where id in		<foreach collection="ids" open="(" close=")" item="id" separator=",">
			#{id}		
		</foreach>
  	</select>
  <!--关联查询一对多  -->	
  <select id="findByDeptId" parameterType="Integer" resultMap="dept_map">
  		select * from department where id = #{id}
  	</select>
  	
  	<resultMap type="Department" id="dept_map">
  		<id property="id" column="id"/>
  		<!--column为参数,select为namespace+id -->
  		<collection property="employees" column="id" 
  		select="org.fkjava.mybatis.mapper.EmployeeMapper.findByDeptId"></collection>
  	</resultMap>
  	
  	<select id="findById" parameterType="Integer" resultMap="emp_map">
		select * from employee where id = #{id}
	</select>
	<!--关联查询一对一  -->
	<resultMap type="Employee" id="emp_map">
		<id property="id" column="id"/>
		<association property="dept" column="dept_id" 
		select="org.fkjava.mybatis.mapper.DepartmentMapper.findByDept_ID"/>
	</resultMap>
	
	<!-- 公共部分 -->
	<sql id="query_sql">
		<where>
			<if test="typeCode!=null">
				type_code like '${typeCode}%'			</if>
			<if test="keyword!=null">
				and title like '%${keyword}%'			</if>
		</where>
	</sql>
	<!-- 根据条件查询出对应的商品 -->
	<select id="findByCondition" parameterType="ArticleQueryObject"
		resultMap="article_map">
		select * from ec_article		<!-- 公共部分引用 -->
		<include refid="query_sql"/>
		limit #{beginIndex},#{pageSize}
	</select>
  </mapper>