代码文件结构
文件结构
使用规则
- Mybatis动态代理开发,目的是简化开发,只需要写dao层的接口,不需要写实现类
- 持久层包名dao改为mapper
- mapper包下定义接口,!不用实现类,Mybatis框架自动生成接口的实现类对象
- 定义接口UserMapper,查询所有数据的方法(抽象)
- UserMapper.xml配置文件,配置user表的sql语句
- 配置文件必须和接口在同一文件夹下
- 配置文件中的namespace的属性值必须和接口的全类名相同
- 接口中的方法名必须和配置xml中的SQL语句的标签id相同,参数resultType和方法返回值必须相同
资源类
- 因为sql语句配置文件和接口代码一起放在了mapper包下,所以mapper的resource属性需要改
SqlMapConfig.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">
<!--约束文件,位置在mybatis的jar包-->
<configuration>
<!-- 别名配置-->
<typeAliases>
<!-- 配置别名,数据类型是pojo对象,简化为user-->
<!-- <typeAlias type="com.ahu.pojo.User" alias="user"></typeAlias>-->
<!-- 定义别名也可以使用包扫描,在xml文件中直接使用类名小写即可-->
<package name="com.ahu.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!--
transactionManager 事务管理配置
type="JDBC" 使用的是最原始的JDBC的事务处理机制
type="MANAGERED" 不管理事务
-->
<transactionManager type="JDBC" />
<!--
dataSource 配置数据源,连接池
type="POOLED" 使用连接池
MyBatis自带连接池 (type=""UNPOOLED)
-->
<dataSource type="POOLED">
<!-- 使用自带的数据库连接池-->
<!--配置的是,数据库连接四大信息-->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3305/mybatis?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="ahulml005" />
</dataSource>
</environment>
</environments>
<!--
配置的是映射关系 ORM Java对象和数据表
-->
<mappers>
<!--
配置文件不在同一个文件下,填写地址应该注意
-->
<!-- <mapper resource="com/ahu/mapper/UserMapper.xml" />-->
<!--
可以使用自动扫描配置,自动扫描xml文件
一个数据表对应一个xml
mapper标签的属性 resource="xml路径"
package标签的属性 name="包名"
-->
<package name="com.ahu.mapper"/>
</mappers>
</configuration>
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="com.ahu.mapper.UserMapper">
<select id="queryUser" resultType="com.ahu.pojo.User">
select * from user;
</select>
<!-- 使用别名user-->
<select id="queryUserById" parameterType="Integer" resultType="user">
select * from user where id=#{id}
</select>
<insert id="saveUser" parameterType="com.ahu.pojo.User">
insert into user values (null,#{username},#{sex},#{birthday},#{address})
</insert>
<delete id="deleteById" parameterType="Integer">
delete from user where id=#{id}
</delete>
<!-- 注意使用的参数-->
<select id="queryUserByName" parameterType="com.ahu.pojo.UserVO" resultType="user">
select * from user where username like #{user.username}
</select>
</mapper>
User表操作代码
User.java
package com.ahu.pojo;
import java.util.Date;
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
UserMapper.java
package com.ahu.mapper;
import com.ahu.pojo.User;
import java.util.List;
public interface UserMapper {
/**
* 查询所有数据
* @return 返回User的集合
*/
List<User> queryUser();
}
MybatisProxy.java
- 参数是被代理接口的class文件,返回值是被代理接口的实现类对象,UserMapper userMapper = sqlSession.getMapper(UserMapper.class)实现代理
package com.ahu.mybatis;
import com.ahu.mapper.OrdersMapper;
import com.ahu.mapper.UserMapper;
import com.ahu.pojo.Orders;
import com.ahu.pojo.User;
import com.ahu.pojo.UserVO;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* Mybatis动态代理开发,目的是简化开发,只需要写dao层的接口,不需要写实现类
* 持久层包名dao改为mapper
* mapper包下定义接口,!不用实现类,Mybatis框架自动生成接口的实现类对象
* 定义接口UserMapper,查询所有数据的方法(抽象)
* UserMapper.xml配置文件,配置user表的sql语句
* 配置文件必须和接口在同一文件夹下
* 配置文件中的namespace的属性值必须和接口的全类名相同
* 接口中的方法名必须和配置xml中的SQL语句的标签id相同,参数resultType和方法返回值必须相同
*/
public class MybatisProxy {
private SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws IOException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
}
/**
* 动态代理方式,代理mapper下的接口
* 查询所有用户
*/
@Test
public void testQueryUser(){
SqlSession sqlSession = sqlSessionFactory.openSession();
/*
参数是被代理接口的class文件,返回值是被代理接口的实现类对象
*/
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.queryUser();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
/**
* 根据id查询用户
*/
@Test
public void testQueryUserById(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.queryUserById(9);
System.out.println(user);
sqlSession.close();
}
/**
* 新增用户
*/
@Test
public void testSaveUser(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("rose");
user.setSex("F");
user.setBirthday(new Date());
user.setAddress("England");
userMapper.saveUser(user);
sqlSession.commit();
sqlSession.close();
}
/**
* 删除指定id的用户
*/
@Test
public void testDeleteById(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int row = userMapper.deleteById(13);
System.out.println("total delete:" + row);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testQueryByName(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("%刘%");
UserVO userVO = new UserVO();
userVO.setUser(user);
List<User> users = userMapper.queryUserByName(userVO);
for (User user1 : users) {
System.out.println(user1);
}
}
xml别名配置
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
map | Map |
- 可以在xml使用前一列的数据类型,自动转为后一列的数据类型
- 可以自定义添加别名,在SqlMapConfig.xml中的configuration标签内添加
命名别名可以使用包扫描
<typeAliases>
<!-- 配置别名,数据类型是pojo对象,简化为user-->
<!-- <typeAlias type="com.ahu.pojo.User" alias="user"></typeAlias>-->
<!-- 定义别名也可以使用包扫描-->
<package name="com.ahu.pojo"/>
</typeAliases>
pojo包装类对象
- 一个pojo对象有属性是其他的pojo对象(使用UserVO.java包装User对象)
package com.ahu.pojo;
/**
* Value Object值对象,存储常用的数据值
*/
public class UserVO {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "UserVO{" +
"user=" + user +
'}';
}
}
数据库操作需要注意参数
<!-- 注意使用的参数-->
<select id="queryUserByName" parameterType="com.ahu.pojo.UserVO" resultType="user">
select * from user where username like #{user.username}
</select>
查询结果集手动映射
- 设置数据库表列名和pojo属性不对应(查询的结果除了不对应的属性无法查出来其他都正常),需要手动映射,列名为user_id,pojo属性为userId
sql
-- ----------------------------
-- Table structure for `orders`
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
);
-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('3', '3', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '3', '1000011', '2015-02-03 13:22:41', null);
INSERT INTO `orders` VALUES ('5', '4', '1000012', '2015-02-12 16:13:23', null);
pojo
package com.ahu.pojo;
import java.util.Date;
public class Orders{
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
@Override
public String toString() {
return "Orders [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
+ ", note=" + note + "]";
}
}
OrdersMapper.java
package com.ahu.mapper;
import com.ahu.pojo.Orders;
import java.util.List;
public interface OrdersMapper {
/**
* 查询所有订单
* @return
*/
List<Orders> queryOrders();
}
MybatisProxy.java添加查询代码
/**
* 测试查询所有订单
* pojo类的属性userId和列名user_id不对应,需要手动映射
*/
@Test
public void testQueryOrder(){
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
List<Orders> orders = ordersMapper.queryOrders();
for (Orders order : orders) {
System.out.println(order);
}
sqlSession.close();
}
OrdersMapper.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="com.ahu.mapper.OrdersMapper">
<select id="queryOrders" resultType="orders">
select * from orders
</select>
</mapper>
testQueryOrder执行结果
修改后的OrdersMapper.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="com.ahu.mapper.OrdersMapper">
<!--
配置使用自己的映射
select的属性resultMap
-->
<select id="queryOrders" resultType="orders" resultMap="ordersResultMap">
select * from orders
</select>
<!-- 查询的结果还是orders-->
<resultMap id="ordersResultMap" type="orders">
<!--
配置数据表的列和pojo成 员变量的映射关系
id配置的是主键
columns列名
property pojo属性名
-->
<!-- 配置主键-->
<id column="id" property="id"></id>
<!-- 配置其他列映射关系-->
<result column="user_id" property="userId"></result>
<result column="number" property="number"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
</resultMap>
</mapper>
手动映射后可以正确查询