1.What
Mybatis作为一个持久层,相当于封装JDBC的框架,去掉其中的获取连接、statement等细节,对数据库的数据进行增删改查
2.Why
使用mybatis对jdbc进行了简化
3.For
使用框架,利用维护与开发
4.流程
- 写dao(注解的增删改查操作)与domin(对应数据库表对象的映射)
- 编写数据库连接的propertise文件(url,driver,username,password)
- 编写框架的配置xml文件(映射dao层,传输数据库层,保存domin层)
<?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="jdbcConfig.properties"></properties>
<!--配置别名-->
<typeAliases>
<package name="domain"></package>
</typeAliases>
<!-- 配置环境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 指定带有注解的dao接口所在位置 -->
<mappers>
<package name="dao"/>
</mappers>
</configuration>
映射到package中,避免找不到
- 使用mybatis框架(如下)
5.使用注解来代替jdbc中domin对象的属性与数据库字段属性不一致时起别名
@Select("select * from user")//查询注解,由mybits运行时进行解析
@Results(id="userMap",value = {//相当于起别名,属性的引用,使其他也可以简单地使用这个注解
@Result(id=true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "birthday",property = "userBirthday"),
@Result(column = "sex",property = "userSex"),
@Result(column = "address",property = "userAddress"),
}
)
List<User> findAll();
6.code
- 多对1的多表查询
public interface IAccountDao {
@Select("select * from account")
@Results(id="accountMap",value={@Result(id = true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
@Result(column = "uid",property = "user",one = @One(select = "dao.IUserDAO.findById",fetchType = FetchType.EAGER))}
)
List<Account> findAll();
}
将表中查询出的column = “uid”,放入到one = @One(select = “dao.IUserDAO.findById”,fetchType = FetchType.EAGER)中进行查询,得到的结果放入property = "user"中
- 多对多的多表查询
@Select("select * from user")
@Results(id="userMap",value = {
@Result(id=true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "birthday",property = "userBirthday"),
@Result(column = "sex",property = "userSex"),
@Result(column = "address",property = "userAddress"),
@Result(column = "id",property = "accounts",many = @Many(select = "dao.IAccountDao.findAccountByUid",fetchType = FetchType.LAZY))
}
)
List<User> findAll();
这里的accounts返回的是多个account账户,所以在User类中定义一个接受查询结果的账户属性应该为一个Lsit