一.ORM思想
- 对象关系映射(Object Relational Mapping,简称ORM):
- 是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。
二.ORM框架
目前流行的ORM框架:
- JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现.
- Hibernate:目前最流行的ORM框架.设计灵巧,性能优秀,文档丰富.
- MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps和DAO,允许开发人员直接编写SQL.等
三.MyBatis
- MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,严格上说应该是一个SQL 映射框架。
- MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。
- MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Ordinary Java Objects,普通的 Java 对象)映射成数据库中的记录。
- MyBatis的前身是iBatis,MyBatis在iBatis的基础上面,对代码结构进行了大量的重构和简化;
四.MyBatis的CURD
目录结构
SQL
DAO实现类UserDAOImpl
public class UserDAOImpl implements IUserDAO<User> {
private String getStatement(String id) {
return "dusk.mapper.UserMapper." + id;
}
public void save(User t) {
// 3:获取session对象
SqlSession session = MyBatisUtil.getSession();
// 4:执行操作
session.insert(getStatement("save"), t);
// 5:提交事务
session.commit();
// 6:关闭资源
session.close();
}
public void update(User t) {
SqlSession session = MyBatisUtil.getSession();
session.update(getStatement("update"),t);
session.commit();
session.close();
}
public void delete(Long id) {
SqlSession session = MyBatisUtil.getSession();
session.delete(getStatement("delete"),id);
session.commit();
session.close();
}
public User query(Long id) {
SqlSession session = MyBatisUtil.getSession();
User user = session.selectOne(getStatement("get"),id);
session.commit();
session.close();
return user;
}
public List<User> list() {
SqlSession session = MyBatisUtil.getSession();
List<User> list = session.selectList(getStatement("list"));
session.commit();
session.close();
return list;
}
}
DAO接口
public interface IUserDAO<T> {
void save(T t);
void update(T t);
void delete(Long id);
T query(Long id);
List<T> list();
}
实体类User
@Setter@Getter@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String password;
private Integer age;
}
实体Mapper配置UserMapper.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="dusk.mapper.UserMapper">
<!-- resultMap:自定义的映射方式 type:一行数据封装成什么对象 -->
<resultMap type="User" id="baseMap">
<!-- property:类中的属性名,column表中的列明 -->
<id property='id' column='uid' />
<result property='username' column='uusername' />
<result property='password' column='upassword' />
<result property='age' column='uage' />
</resultMap>
<insert id="save" useGeneratedKeys="true" keyProperty="id"
parameterType="User">
insert into
t_user(username,password,age)
values(#{username},#{password},#{age})
</insert>
<update id="update" parameterType="User">
update
t_user set
username=#{username},password=#{password},age=#{age}
where
id=#{id}
</update>
<delete id="delete" parameterType="long">
delete from
t_user where
id=#{id}
</delete>
<select id="get" parameterType="long" resultType="User"
resultMap="baseMap">
select id uid, username uusername, password upassword, age
uage from
t_user where id =#{id}
</select>
<select id="list" resultType="User">
select * from
t_user
</select>
</mapper>
测试类App
public class App {
IUserDAO<User> bean = new UserDAOImpl();
@Test
public void testSave() throws Exception {
bean.save(new User(null,"栗子球","2343",23));
}
@Test
public void testUpdate() throws Exception {
bean.update(new User(2L,"彩翼栗子球","23231",341));
}
@Test
public void testDelete() throws Exception {
bean.delete(12L);
}
@Test
public void testGet() throws Exception {
User user = bean.query(2L);
System.out.println(user);
}
@Test
public void testList() throws Exception {
List<User> list = bean.list();
for (User user : list) {
System.out.println(user);
}
}
}
MyBatis工具类MyBatisUtil
public class MyBatisUtil {
private static SqlSessionFactory factory;
private MyBatisUtil() {}
static {
try {
InputStream in = Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
SqlSession session = factory.openSession();
System.out.println(session);
return session;
}
}
数据库连接资源文件druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///dusk
username=root
password=admin
MyBatis日志打印配置文件log4j.properties
#全局的日志配置
log4j.rootLogger=ERROR,stdout
#MyBatis的日志配置,打印哪些名称空间开头的日志
log4j.logger.dusk.mapper=TRACE
#打印日志的地方
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mapper管理文件mybatis.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>
<!-- 往框架中注册属性 必须放在configuration下面第一行 -->
<properties resource="druid.properties" />
<!-- 往框架中注册别名 -->
<typeAliases>
<!-- 注册一个别名 type:类型的全限定名 alias:该全限定名 <typeAlias type="dusk.domain.User"
alias="User"/> -->
<package name="dusk.domain" />
</typeAliases>
<!-- 配置环境 -->
<environments default="default">
<environment id="default">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 管理映射文件 -->
<mappers>
<mapper resource="dusk/domain/UserMapper.xml" />
</mappers>
</configuration>