Mybatis入门

1. ORM:对象关系映射
 作用:以面向对象行为操作数据表
2. mybatis概述
 1、它是半自动化orm框架
 a、可以以对象方式操作数据表
 b、编写定制sql语句
 2、前身ibatis
 3、支持缓存
 4、轻量级、灵活、简单
3. mybatis与hibernate的区别
 1、hibernate它是全自动的orm构架
      mybatis它是半自动的orm构架
 2、难度
  Hibernate难度较大
 3、hibernate针对pojo提供对象状态管理
    mybatis没有pojo对象状态的管理
 4、缓存
      mybatis也支持缓存设置,hibernate比mybatis要强,特别是针对脏读
 5、可移植性
     hibernate比mybatis要强
 6、总结:
   mybatis比hibernate简单、易用、轻巧
4. 如何使用mybatis?
 1、导入核心的库文件
  mybatis-3.4.1.jar
  mysql-connector-java-5.1.29.jar
  log4j-1.2.17.jar
 2、创建数据表
drop table tb_user;
	truncate table tb_user;
	create TABLE tb_user
	(
		ID int(11) primary key auto_increment,
		NAME varchar(18) default null,
		SEX char(2) default null,
		AGE int(11) default null
	);
 3、创建数据表对应的pojo类
public class User implements Serializable{
	private Integer id;
	private String name;
	private String sex;
	private Integer age;
	省略setter/getter…
}
 4、mybatis全局文件配置
 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<!-- 配置mybatis全局信息 -->
<configuration>
	
	<!-- 指定 MyBatis 所用日志的具体实现 -->
	<settings>
		<setting name="logImpl" value="LOG4J"/>
	</settings>
	
	<!-- 别名 -->
	<typeAliases>
		<typeAlias type="com.gec.domain.User" alias="user"/>
	</typeAliases>
	
	<!-- 环境配置 -->
	<environments default="mysql">
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" 
value=" com.mysql.jdbc.Driver"/>
        		<property name="url" 
value=" jdbc:mysql://localhost:3306/mybatis"/>
        		<property name="username" value="root"/>
        		<property name="password" value="123"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/gec/domain/UserMapper.xml"/>
	</mappers>
</configuration>  
 5、编写映射文件:编写定制sql的任务方法
 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<!-- 
	作用:编写定制sql的任务方法
	命名空间:写成包名+类名
 -->
<mapper namespace="com.gec.domain.UserMapper">
	<!-- 
		id:定制sql的方法名
		parameterType:传入方法的参数类型
	 -->
	<insert id="saveUser" parameterType="user">
		<!-- 编写定制sql -->
		insert into tbl_user(name,sex,age,address)
				values(#{name},#{sex},#{age},#{address})
	</insert>
</mapper>
 6、测试用例
public class TestMybatis {
	public static void main(String[] args) throws IOException {
		//读取全局配置文件
		InputStream inputStream = 
			Resources.getResourceAsStream("mybatis-config.xml");
		
		//根据全局配置文件,生成工厂类对象
		SqlSessionFactory sf = 
new SqlSessionFactoryBuilder().build(inputStream);
		
		//通过工厂类的对象,产生SqlSession对象
		SqlSession session = sf.openSession();
		
		User user = new User();
		user.setName("李四");
		user.setSex("女");
		user.setAge(24);
		session.insert("com.gec.domain.UserMapper.saveUser", 
							user);
		session.commit();
		session.close();
	}
}
5. 全局配置文件
 5.1 properties:导入外部配置文件
 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123
  mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<!-- 配置mybatis全局信息 -->
<configuration>
	<!-- 导入外部配置文件 -->
	<properties resource="jdbc.properties"/>
	<settings>
		<setting name="logImpl" value="LOG4J"/>
	</settings>
	<!-- 别名 -->
	<typeAliases>
		<typeAlias type="com.gec.domain.User" alias="user"/>
	</typeAliases>
	<!-- 注册类型处理器 -->
	<typeHandlers>
		<typeHandler handler="com.gec.typehandler.AddressTypeHandler"/>
	</typeHandlers>
	
	<!-- 环境配置 -->
	<environments default="mysql">
		<environment id="mysql">
			<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>
	<mappers>
		<mapper resource="com/gec/domain/UserMapper.xml"/>
	</mappers>
</configuration> 
 5.2 typeAliases:设置实体别名
  mybatis-config.xml
<typeAliases>
		<typeAlias type="com.gec.domain.User" alias="user"/>
</typeAliases>
  UserMapper.xml
<select id="findUserById" parameterType="int" resultType="user">
		select * from tbl_user where id=#{id}
</select>
 5.3 typeHandler:类型处理器
 javaType(pojo的属性数据类型) 
 jdbcType(数据表的数据类型)
 如何自定义一个类型处理器
 1、编写一个类,此类要继承BaseTypeHandler<java的数据类型>
 2、实现set和get方法
 a、set方法
作用:将java数据类型转换赋值到数据表字段
 b、get方法
作用:从数据表的字段值内容转换到java数据类型
    AddressTypeHandler.java
   
public class AddressTypeHandler extends BaseTypeHandler<Address>{
	@Override
	public void setNonNullParameter(PreparedStatement ps, 
int index, Address address, JdbcType jdbcType)
			throws SQLException {
		ps.setString(index, address.toString());
	}


	@Override
	public Address getNullableResult(ResultSet rs, 
String columnName) throws SQLException {
		String content = rs.getString(columnName);
		String[] address = content.split(",");
		String province = address[0];
		String city = address[1];
		return new Address(province, city);
	}


	@Override
	public Address getNullableResult(ResultSet rs,
 int columnIndex) throws SQLException {
		String content = rs.getString(columnIndex);
		String[] address = content.split(",");
		String province = address[0];
		String city = address[1];
		return new Address(province, city);
	}


	@Override
	public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		return null;
	}
}
 3、注册类型处理器
在全局配置文件 mybatis-config.xml注册类型处理器
<!-- 注册类型处理器 -->
<typeHandlers>
<typeHandler handler="com.gec.typehandler.AddressTypeHandler"/>
</typeHandlers>
 3、测试
SqlSession session = sf.openSession();
User user = new User();
user.setName("李四");
user.setSex("女");
user.setAge(24);
Address address = new Address("广东","广州");
user.setAddress(address);	
session.insert("com.gec.domain.UserMapper.saveUser", user);
session.commit();
session.close();
6. mybatis基本操作
6.1 添加
 如何获取回设主键值
 useGeneratedKeys="true"  keyColumn="id"  keyProperty="id"
<insert id="saveUser" parameterType="user" 
		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
		insert into tbl_user(name,sex,age,address) 
		values(#{name},#{sex},#{age},#{address})
</insert>
 parameterType:设计传入参数数据类型
 a、pojo对象数据(针对添加)
b、map对象数据(针对添加)
<insert id="saveUser2" parameterType="map" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
	insert into tbl_user(name,sex,age,address) values(#{name},#{sex},#{age},#{address})
</insert>
c、基本数据类型(针对查询)
6.2 查询
(1) 返回单个结果
<!-- int会解析成Integer -->
<select id="findUserById" parameterType="int" resultType="user">
		select * from tbl_user where id=#{id}
</select>

测试:

SqlSession session = sf.openSession();
User user = session.selectOne("com.gec.domain.UserMapper.findUserById", 7);
System.out.println(user);
session.close();

(2) 返回多个结果
<select id="findAllUser" resultType="user">
		select * from tbl_user
</select>
Java的操作方法:

a、

List<User> userlist = session.selectList("com.gec.domain.UserMapper.findAllUser", null);

b、
session.select("com.gec.domain.UserMapper.findAllUser", new ResultHandler<User>() {
			@Override
			public void handleResult(ResultContext<? extends User> resultContext) {
						User user = resultContext.getResultObject();
						System.out.println(user);
					}
});
c、
Cursor cs = session.selectCursor("com.gec.domain.UserMapper.findAllUser", null);
Iterator<User> it =  cs.iterator();
while(it.hasNext()) {
	User user = it.next();
	System.out.println(user);
}
d、
Map<Integer,User> userMap = session.selectMap("com.gec.domain.UserMapper.findAllUser", "id");
6.3 修改
<update id="updateUser2" parameterType="user">
	update tbl_user set name=#{name},sex=#{sex},age=#{age},
   address=#{address} where  id=#{id}
</update>
 测试:
User user = session.selectOne("com.gec.domain.UserMapper.findUserById", 7);
user.setName("ken");
user.setSex("女");
session.update("com.gec.domain.UserMapper.updateUser2", user);
System.out.println(user);
session.commit();
session.close();
6.4 删除
<delete id="deleteUser" parameterType="int">
	delete from tbl_user where id=#{id}
</delete>
 测试:
SqlSession session =  sf.openSession();
session.delete("com.gec.domain.UserMapper.deleteUser", 6);
session.commit();
session.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值