Mybatis学习笔记(1)
----不在沉默中爆发,就在沉默中灭亡
Mybatis的概念大家去网上搜一下吧。在这里我只是写一下我个人从零开始学习Mybatis的路程,希望自己能坚持下去,也希望大家能留言交流。
好了,言归正传,现在我想搭建一个最简单的Mybatis环境,需要哪些东西呢?
先给大家看下目录结构吧
![Mybatis工程目录结构](https://img-blog.csdn.net/20161202001735250)
1. jar包![需要两个jar包](https://img-blog.csdn.net/20161130221418299)
2. 配置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>
<properties resource="mybatis.properties"></properties>
<!-- <typeAlias alias="User" type="com.zz.model.User"/>
这个别名非常重要,你在 具体的类的映射中,比如User.xml 中 resultType 就是对应这里的。要保持一致,
当然这里的 resultType 还有另外单独的定义方式 -->
<typeAliases>
<typeAlias alias="User" type="com.zz.model.User"/>
</typeAliases>
<!--数据库连接的基本信息-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<!--该处是用来映射sql语句的,告诉mybatis去哪里找这些sql语句-->
<mappers>
<mapper resource="com/zz/model/User.xml"/>
</mappers>
</configuration>
在上面配置文件中导入了一个外部的属性文件,MyBatis配置文件中的属性引入可以是直接包含在properties元素中的,也可以是利用properties元素从外部引入的,还可以是在创建SqlSessionFactory的时候,作为一个参数properties传入。既然MyBatis配置文件中的属性可以从这么多地方引入,那就牵涉到一个优先级的问题,MyBatis将会按照下面的顺序来寻找它们:
1、先是配置文件中,properties元素体中的属性被读取
2、再是利用properties元素从外部引入的属性文件中的属性被读取,会覆盖前面读取的相同的属性
3、最后是创建SqlSessionFactory时传入的properties中的属性被读取,同样会覆盖前面相同的属性
- 就是User.java和User.xml
User.java就是平时最常见的实体类
package com.zz.model;
public class User {
private int id;
private String userName;
private String userAge;
private String userAddress;
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 getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
}
User.xml是对该实体类User.java进行操作的sql语句
<?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.zz.inter.IUserOperation">
<select id="selectUserById" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
<!--这里的resultMap是自定义一个返回值类型对象,用于接收selectUsers方法查询返回的结果集 -->
<resultMap type="User" id="resultListUser">
<id column="id" property="id"/>
<result column="userName" property="userName"/>
<result column="userAge" property="userAge"/>
<result column="userAddress" property="userAddress"/>
</resultMap>
<select id="selectUsers" parameterType="string" resultMap="resultListUser">
select * from user where userName like #{userName}
</select>
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user(userName,userAge,userAddress) values(#{userName},#{userAge},#{userAddress})
</insert>
<update id="updateUser" parameterType="User" >
update user set userName=#{userName},userAge=#{userAge},userAddress=#{userAddress} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
这个mapper.xml文件中,namespace需要指定一个接口类,该接口类是用于对该User对象进行数据库操作的方法。id是跟这个接口类中的方法名相同,否则在程序运行的时候会报错。
package com.zz.inter;
import java.util.List;
import com.zz.model.User;
public interface IUserOperation {
public User selectUserById(int id);
public List<User> selectUsers(String userName);
public int addUser(User user);
public int updateUser(User user);
public int deleteUser(int id);
}
然后在测试的时候写一个Test.java测试类进行测试。
package com.mybatis.test;
import java.io.Reader;
import java.util.List;
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 com.zz.inter.IUserOperation;
import com.zz.model.User;
public class Test {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static{
try{
reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSessionFactory getSession(){
return sqlSessionFactory;
}
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
// selectDemo1(session);
selectUsers(session);
// addUser(session);
// updateUser(session);
// deleteUser(session);
} finally {
session.close();
}
}
private static void deleteUser(SqlSession session) {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
int i = userOperation.deleteUser(4);
session.commit();
System.out.println(i>0?"删除成功":"删除失败");
}
private static void updateUser(SqlSession session) {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = userOperation.selectUserById(2);
user.setUserName("吴彦祖");
int i = userOperation.updateUser(user);
session.commit();
System.out.println(i>0?"更新成功":"更新失败");
}
private static void addUser(SqlSession session) {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
User user = new User();
user.setUserName("马大哈");
user.setUserAddress("hangzhou");
user.setUserAge("24");
int i = userOperation.addUser(user);
session.commit();
System.out.println(i>0?"新增成功":"新增失败");
}
private static void selectUsers(SqlSession session) {
IUserOperation userOperation = session.getMapper(IUserOperation.class);
List<User> list = userOperation.selectUsers("%");
for (User user : list) {
System.out.println(user.getId()+ "||" + user.getUserAddress()+ "||" +user.getUserAge()+ "||" +user.getUserName());
}
}
private static void selectDemo1(SqlSession session) {
User user = (User) session.selectOne("com.zz.inter.IUserOperation.selectUserById", 2);
System.out.println(user.getUserAddress());
System.out.println(user.getUserName());
}
}
看的时候其实会感觉很简单,如果你做的时候就会发现有很多问题,当你做完了,又会有很多新的认识。所以不要光看,一定要动手做,切记共勉。