听说公司很多开发框架都是基于SpringMVC+MyBatis来开发,也是时候学习这个了,为后面出来工作加快融进开发环境做铺垫。这里初始下MyBatis,前面又说到SpringMVC的,后面再将两者结合起来。
MyBatis的今生前世这里就不多说,直接说说怎么搭建,以及最基本的CURD操作。
先下载MyBatis的jar包,MyBatis的核心包就一个,我这里用的是这个mybatis-3.2.8.jar,如果跟spring结合的话还有一个jar包,这个后面再说。导进jar包这个就不用说了,然后再配上log4j.properties,当然相关的jar也要记得导进去才行。
MyBatis的核心配置文件
<?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>
<!-- 这里写的是类的别名,type指明的是具体的类位置,alias指明类的别名,
别名是为了在sql的映射文件中方便书写类名
-->
<typeAliases>
<typeAlias type="lxs.pojo.User" alias="user"/>
</typeAliases>
<!-- 这里配置的是数据库源的信息 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/jikebook"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- sql映射文件 -->
<mappers>
<mapper resource="lxs/map/user.xml"/>
</mappers>
</configuration>
MyBatis推崇的是一种sql与代码相分离的思想,也就是sql都会写在xml文件中,然后代码在根据sql的id去调用执行数据库操作,这个有点像hibernate的命名查询getNamedQuery()。
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="/">
<!--id标识sql,parameterType指传入的参数类型,resultType指返回的参数类型,#{id}指变量值-->
<select id="findById" parameterType="int" resultType="user">
select * from User where id=#{id}
</select>
<!-- keyProperty通常跟useGeneratedKeys在一起,表明id自增长-->
<insert id="addUser" parameterType="user" statementType="PREPARED" keyProperty="id" useGeneratedKeys="true">
<!-- insert into user (userName,password) values (#{userName},#{password}) -->
insert into User
(userName,password) values
(#{userName},#{password})
</insert>
<update id="updateUser" parameterType="user">
update User set userName=#{userName},password=#{password} where id=#{id}
</update>
<!-- parameterType="hashmap"表明传入的参数是一个hashmap,也是键值对的形式传入-->
<select id="loginSelect" resultType="user" parameterType="hashmap">
select * from User where userName=#{userName} and password=#{password}
</select>
<!--返回的是一个List<User>集合-->
<select id="selectUserList" resultType="user">
select * from User
</select>
<!--自定义一个返回类型,解决联合sql查询再进行对象封装-->
<resultMap id="UserMap" type="User">
<id property="id" column="id" />
<result property="userName" column="userName"/>
<result property="password" column="password"/>
</resultMap> <select id="selectUserMap" resultMap="UserMap">
select * from User
</select>
<select id="deleteUser" parameterType="int">
delete from User where id=#{id}
</select>
</mapper>
这里补充下resultMap的用法,像上面id=selectUserMap的select,返回的是resultMap=UserMap,刚开始感觉直接返回resultType=User不就行了吗,干嘛还要多次一举。原来resultMap是为了解决当pojo与表字段不一致的使用,因为如果一致的话,select查询得到的字段值是会自动封装进pojo对象,但此时如果pojo属性不一致,那么set方法可能就会不一样,那么封装就会出错,所以需要resultMap来统一。
public class TestHello {
public static void main(String[] args) {
// TODO Auto-generated method stub
String resource = "lxs/map/MyBatisConfig.xml";
Reader reader = null;
SqlSession session;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder()
.build(reader);
session = sqlMapper.openSession();
/*User temp = session.selectOne("findById", 4);
System.out.println(temp.getUserName());*/
/*User user=new User();
user.setUserName("lxiaosg");
user.setPassword("123456");
session.insert("addUser", user);*/
/*User user=new User();
user.setId(1);
user.setUserName("like");
user.setPassword("123456");
session.update("updateUser", user);*/
/*HashMap<String,String> hm=new HashMap();
hm.put("userName", "like");
hm.put("password","123456");
User temp=session.selectOne("loginSelect",hm);
if(temp!=null)
{
System.out.println(temp.toString());
System.out.println("登陆成功!");
}*/
/*List<User> ap=session.selectList("selectUserList");
for(int i=0;i<ap.size();i++){
System.out.println(ap.get(i).toString());
}*/
/*List<User> ap=session.selectList("selectUsers");
for(JiKeUser temp:ap) {
System.out.println("用户名="+temp.getUserName());
}*/
//session.delete("deleteUser", new Integer(1));
List<User> ap=session.selectList("selectUserMap");
for(User temp:ap) {
System.out.println("用户名="+temp.getUserName());
}
session.commit();
session.close();
}
}