MyBatis就是一个持久层的框架,它让程序员只关注sql本身,而不需要关注连接的创建,statement的创建,MyBatis将输入参数,输出结果进行映射
从上面原理可以看出,首先我们要写配置文件
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"> <configuration> <!--引入database配置文件 --> <properties resource="db.properties"> </properties> <!--配置mybatis的环境,如果和spring结合,则由spring管理 --> <environments default="development"> <environment id="development"> <!-- 事物管理,配置JDBC表示 --> <transactionManager type="JDBC"></transactionManager> <!--配置数据源,采用mybatis连接池,使用POOLED方式 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 映射XMl文件 --> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>从上面可以看出,我们引入了database配置文件,也可以不引入,直接在value中写值
db.properties文件如下:
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8 username=root password=123pojo类:
public class User implements Serializable{ private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 //订单信息 private List<Orders> orders; public List<Orders> getOrders() { return orders; } public void setOrders(List<Orders> orders) { this.orders = orders; } 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 + "]"; } } 映射文件: <?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="test"> <!-- select:表示一个MappedStatement对象 id:Statement的唯一标示 parameterType:传入参数的java类型,parameterType只能有一个,所以入参只能有一个 resultType:输出结果所映射的java类型 #{}:表示一个占位符 #{id}:里面的参数表示输入的参数名称,如果是基本类型,则参数名称任意,如果是其它类型,则必须写对应的参数名 --> <select id="findByUserId" parameterType="int" resultType="com.study.mpo.User"> SELECT * FROM user WHERE id=#{id} </select> </mapper>测试代码:
@Test public void test1() throws IOException{ String resource="SqlMapConfig.xml"; //读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); //创建session SqlSession session=sqlSessionFactory.openSession(); //调用session的增删改查 User customer=session.selectOne("test.findByUserId", 1); System.out.println(customer.getUsername()); }项目中有时候再插入数据的时候,要得到它的id,怎么实现了
前面我们所看到的都是dao的开发方式,MyBatis提供了Mapper代理的开发方式
使用Mapper代理的开发规范:
1、 mapper接口的全限定名要和mapper映射文件的namespace值一致。
2、 mapper接口的方法名称要和mapper映射文件的statement的id一致。
3、 mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
4、 mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
mapper接口:
public interface UserMapper { // 1、 根据用户ID查询用户信息 public User findUserById(int id) throws Exception; }
mapper映射文件
<?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"> <!--namespace必须和mapper接口的全限定名一致--> <mapper namespace="com.study.mybatis.mapper.UserMapper"> <!-- 根据用户ID查询用户信息 --> <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM USER WHERE id =#{id} </select> </mapper> 测试:
// 创建UserMapper对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 由mybatis通过sqlsession来创建代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.findUserById(1); System.out.println(user); sqlSession.close();