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也支持缓存设置,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、创建数据表
mybatis-config.xml
UserMapper.xml
5.1 properties:导入外部配置文件
jdbc.properties
mybatis-config.xml
javaType(pojo的属性数据类型)
jdbcType(数据表的数据类型)
如何自定义一个类型处理器
1、编写一个类,此类要继承BaseTypeHandler<java的数据类型>
2、实现set和get方法
a、set方法
作用:将java数据类型转换赋值到数据表字段
b、get方法
作用:从数据表的字段值内容转换到java数据类型
AddressTypeHandler.java
在全局配置文件 mybatis-config.xml注册类型处理器
6.1 添加
如何获取回设主键值
useGeneratedKeys="true" keyColumn="id" keyProperty="id"
a、pojo对象数据(针对添加)
b、map对象数据(针对添加)
6.2 查询
(1) 返回单个结果
作用:以面向对象行为操作数据表
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();