mybatis与spring整合
首先引入jar包:
项目结构:
建立与数据库表对应的实体类及映射文件:
User.java文件
package com.yihaomen.mybatis.model;
public class User {
private int id;
private String userName;
private String password;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
User.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.yihaomen.mybatis.dao.UserDao"><!-- 命名空间接口方式编程时这里对应dao接口-->
<!-- 开启二级缓存 -->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
<select id="selectUserByID" parameterType="int" resultType="User">
select * from users where ID=#{id}
</select>
<!-- 为了返回list 类型而定义的returnMap -->
<resultMap type="User" id="resultListUser">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="password" property="password" />
</resultMap>
<!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 '%'||#{userName}||'%' -->
<select id="selectUsers" parameterType="String" resultMap="resultListUser">
select * from users where userName like CONCAT(CONCAT('%', #{userName}),'%')
</select>
<!-- 直接返回map -->
<select id="queryUsers" parameterType="java.util.HashMap" resultType="java.util.HashMap">
select * from users where userName like CONCAT(CONCAT('%', #{userName}),'%')
</select>
<!--执行增加操作的SQL语句。id和parameterType
分别与IUserOperation接口中的addUser方法的名字和
参数类型一致。以#{name}的形式引用Student参数
的name属性,MyBatis将使用反射读取Student参数
的此属性。#{name}中name大小写敏感。引用其他
的gender等属性与此一致。seGeneratedKeys设置
为"true"表明要MyBatis获取由数据库自动生成的主
键;keyProperty="id"指定把获取到的主键值注入
到Student的id属性
添加前缀:suffix="" 删除后缀:suffixOverrides=","
-->
<insert id="addUser" parameterType="User">
insert into users(
<trim suffix="" suffixOverrides=",">
<if test="userName!=null">
userName,
</if>
<if test="password!=null">
password,
</if>
</trim>
) values(
<trim suffix="" suffixOverrides=",">
<if test="userName!=null">
#{userName},
</if>
<if test="password!=null">
#{password},
</if>
</trim>
)
</insert>
<update id="updateUser" parameterType="User" >
update users
<trim prefix="SET" suffixOverrides=",">
<if test="password and password != ''"> PASSWORD=#{password},</if>
</trim>
where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from users where id=#{id}
</delete>
<!-- User 联合文章进行查询 方法之一的配置 (多对一的方式) -->
<!-- 方式一 -->
<resultMap id="resultUserArticleList" type="Article">
<id property="id" column="aid" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="User">
<id property="id" column="id" />
<result property="userName" column="userName" />
<result property="password" column="password" />
</association>
</resultMap>
<!-- User 联合文章进行查询 方法之二的配置 (多对一的方式) -->
<!-- <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>
<resultMap id="resultUserArticleList-2" type="Article">
<id property="id" column="aid" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="User" resultMap="resultListUser" />
</resultMap> -->
<select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList">
select users.id,users.userName,users.password,article.id aid,article.title,article.content
from users ,article
where users.id=article.userid and users.id=#{id}
</select>
</mapper>
另一个实体类用做联合查询测试
Article.java文件:
package com.yihaomen.mybatis.model;
public class Article {
private int id;
private User user;
private String title;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
UserDao.java文件:
package com.yihaomen.mybatis.dao;
import java.util.List;
import java.util.Map;
import com.yihaomen.mybatis.model.Article;
import com.yihaomen.mybatis.model.User;
public interface UserDao {
//接口方法名对应sql的ID
public User selectUserByID(int id);
//查询list
public List<User> selectUsers(String userName);
//参数和返回都用hashMap形式
public List<Map> queryUsers(Map map);
//插入数据
public void addUser(User user);
//更新数据
public void updateUser(User user);
public void deleteUser(int id);
//关联查询
public List<Article> getUserArticles(int id);
}
src下创建config包:
mybatis核心配置文件:Configuration.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>
<typeAliases>
<!-- User.java类取一个别名User -->
<typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/>
<typeAlias alias="Article" type="com.yihaomen.mybatis.model.Article"/>
</typeAliases>
<mappers>
<mapper resource="com/yihaomen/mybatis/model/User.xml"/>
</mappers>
</configuration>
spring核心配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource属性指定要用到的连接池-->
<property name="dataSource" ref="dataSource"/>
<!--configLocation属性指定mybatis的核心配置文件-->
<property name="configLocation" value="config/Configuration.xml"/>
</bean>
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!--sqlSessionFactory属性指定要用到的SqlSessionFactory实例-->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<!--mapperInterface属性指定映射器接口,用于实现此接口并生成映射器对象-->
<property name="mapperInterface" value="com.yihaomen.mybatis.dao.UserDao" />
</bean>
</beans>
测试类:
package com.yihaomen.mybatis.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yihaomen.mybatis.dao.UserDao;
import com.yihaomen.mybatis.model.Article;
import com.yihaomen.mybatis.model.User;
public class MybatisSprintTest {
private static ApplicationContext ctx;
static
{
ctx = new ClassPathXmlApplicationContext("config/applicationContext.xml");
}
public static void main(String[] args)
{
//mybatis里的mapper就是指dao层
UserDao mapper = (UserDao)ctx.getBean("userDao");
//测试id=1的用户查询,根据数据库中的情况,可以改成你自己的.
System.out.println("得到用户id=1的用户信息");
User user = mapper.selectUserByID(2);
System.out.println(user.getUserName()+"--"+user.getPassword());
//得到文章列表测试
System.out.println("得到用户id为1的所有文章列表");
List<Article> articles = mapper.getUserArticles(2);
for(Article article:articles){
System.out.println(article.getContent()+"--"+article.getTitle());
}
}
}