赞
踩
《Mybatis使用手册》(第2篇 / 共5篇,持续更新),收藏 + 关注 不迷路,希望对小伙伴们有所帮助哦~
源码链接在文末 ↓ ↓ ↓
ognl 表达式:它是 apache 提供的一种表达式语言,在 struts2 中也有应用。
Object Graphic Navigation Language 对象图导航语言 它是按照一定的语法格式来获取数据的。
语法格式: #{对象.对象}
例如:#{user.username} 会先去找 user 对象,然后在 user 对象中找到 username 属性,并把值取出来
【注意】
<select>
、<insert>
、<delete>
、<update>
的 id 属性必须和持久层接口的 方法名相同。<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/junlong/dao/UserDao.xml"/>
</mappers>
</configuration>
public interface UserDao {
/**
* 查询所有用户
*
* @return 返回用户实体列表
*/
List<User> findAll();
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 查询所有用户 -->
<select id="findAll" resultType="com.junlong.domain.User">
select * from user
</select>
</mapper>
public class UserDaoTest {
private SqlSession sqlSession;
private InputStream in;
private UserDao userDao;
@Before
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
sqlSession = factory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@After
public void destroy() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
}
/**
* 测试查询所有
*/
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
}
public interface UserDao {
/**
* 根据id查询用户
*
* @param id 用户id
* @return 返回用户对象
*/
User findById(int id);
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 根据id查询用户 -->
<select id="findById" parameterType="int" resultType="com.junlong.domain.User">
select * from user where id = #{id}
</select>
</mapper>
/**
* 测试根据id查询用户
*/
@Test
public void testFindById() {
User user = userDao.findById(41);
System.out.println(user);
}
public interface UserDao {
/**
* 新增用户
*
* @param user 用户对象
*/
void addUser(User user);
}
<mapper namespace="com.junlong.dao.UserDao">
<insert id="addUser" parameterType="com.junlong.domain.User">
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id()
</selectKey>
insert into user (username, birthday, sex, address) values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
</mapper>
/**
* 测试新增用户
*/
@Test
public void testAddUser() {
User user = new User();
user.setUsername("小师妹");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("北京市工人体育馆");
userDao.addUser(user);
System.out.println(user);
}
public interface UserDao {
/**
* 根据id更新用户信息
*
* @param user 用户对象
*/
void updateUser(User user);
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.junlong.domain.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where id = #{id}
</update>
</mapper>
/**
* 测试更新用户
*/
@Test
public void testUpdateUser() {
User user = new User();
user.setId(69);
user.setUsername("大师姐");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("北京市三里屯");
userDao.updateUser(user);
}
public interface UserDao {
/**
* 根据id删除用户
*
* @param id 用户id
*/
void delUser(int id);
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 根据id删除用户 -->
<delete id="delUser" parameterType="int">
delete from user where id = #{id}
</delete>
</mapper>
/**
* 测试根据id删除用户
*/
@Test
public void testDelUser() {
userDao.delUser(73);
}
public interface UserDao {
/**
* 根据用户名模糊查询用户
*
* @param name 用户名
* @return 返回用户对象列表
*/
List<User> findByName(String name);
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 根据用户名模糊查询 -->
<select id="findByName" parameterType="String" resultType="com.junlong.domain.User">
select * from user where username like #{username}
</select>
</mapper>
/**
* 测试根据用户名模糊查询用户
*/
@Test
public void testFindByName() {
List<User> users = userDao.findByName("%王%");
for (User user : users) {
System.out.println(user);
}
}
public interface UserDao {
/**
* 查询用户总记录数
*
* @return 返回int类型的用户总记录数
*/
int findTotal();
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 聚合函数查询用户总记录数 -->
<select id="findTotal" resultType="int">
select count(*) from user
</select>
</mapper>
/**
* 查询用户总记录数
*/
@Test
public void testFindTotal() {
int total = userDao.findTotal();
System.out.println(total);
}
【解决】在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
【解决】将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
【解决】Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的 类型。
【解决】Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的 类型。
sql 语句的传参使用 parameterType 属性来设定。该属性的取值可以 是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类。
【注意】
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/junlong/dao/UserDao.xml" />
</mappers>
</configuration>
public class QueryVo implements Serializable {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
public interface UserDao {
/**
* 根据条件查询所有用户
*
* @param queryVo 查询条件实体类
* @return 返回用户信息列表
*/
List<User> findUserByVo(QueryVo queryVo);
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 根据条件查询所有用户 -->
<select id="findUserByVo" parameterType="com.junlong.domain.QueryVo" resultType="com.junlong.domain.User">
select * from user where username like #{user.username}
</select>
</mapper>
public class UserTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao userDao;
@Before
public void init() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = builder.build(in);
sqlSession = sessionFactory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@After
public void destroy() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
}
@Test
public void testFindByVo() {
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUsername("%王%");
queryVo.setUser(user);
List<User> users = userDao.findUserByVo(queryVo);
for (User u : users) {
System.out.println(u);
}
}
}
resultType 属性用来指定结果集的类型,支持基本类型和实体类类型。
如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
使用实体类名称时,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法进行封装。
public interface UserDao {
/**
* 查询总记录数
*
* @return 返回总记录数
*/
int findTotal();
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 查询总记录数 -->
<select id="findTotal" resultType="int">
select count(*) from user
</select>
</mapper>
public interface UserDao {
/**
* 查询所有用户
*
* @return 返回所有用户列表
*/
List<User> findAll();
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 查询所有用户 -->
<select id="findAll" resultType="com.junlong.domain.User">
select * from user
</select>
<!-- 查询总记录数 -->
<select id="findTotal" resultType="int">
select count(*) from user
</select>
</mapper>
public class User implements Serializable {
private int userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userBirthday=" + userBirthday +
", userSex='" + userSex + '\'' +
", userAddress='" + userAddress + '\'' +
'}';
}
}
public interface UserDao {
/**
* 查询所有用户
*
* @return 返回所有用户列表
*/
List<User> findAll();
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 查询所有用户 -->
<select id="findAll" resultType="com.junlong.domain.User">
select id as userId, username as userName, birthday as userBirthday, sex as userSex, address as userAddress from user
</select>
</mapper>
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
<mapper namespace="com.junlong.dao.UserDao">
<!-- 建立 User 实体类和数据库表的对应关系 -->
<!-- type 属性:指定实体类的全限定类名 -->
<!-- id 属性:唯一标识,给select标签引用使用 -->
<resultMap id="userMap" type="com.junlong.domain.User">
<!-- id标签:指定主键字段 -->
<!-- result标签:指定非主键字段 -->
<!-- column属性:指定数据库列名 -->
<!-- property属性:指定实体类属性名 -->
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="birthday" property="userBirthday"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
</resultMap>
<!-- 查询所有用户 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
</mapper>
使用Mybatis开发持久层,一般有两种方式:传动DAO开发(dao接口实现类)、Mapper接口代理开发
开发种一般使用Mapper接口代理开发的方式。
public interface UserDao {
/**
* 查询所有用户
*
* @return 返回所有用户列表
*/
List<User> findAll();
/**
* 根据id查询用户
* @param id 用户id
* @return 返回用户对象
*/
User findById(int id);
/**
* 保存用户
*
* @param user 用户对象
* @return 返回数据库影响的行数
*/
int saveUser(User user);
/**
* 更新用户
*
* @param user 用户对象
* @return 返回数据库影响的行数
*/
int updateUser(User user);
/**
* 根据id删除用户
* @param id 用户id
* @return 返回数据库影响的行数
*/
int deleteUser(int id);
/**
* 查询总记录数
*
* @return 返回总记录数
*/
int findTotal();
}
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public List<User> findAll() {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("com.junlong.dao.UserDao.findAll");
sqlSession.close();
return users;
}
public User findById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("com.junlong.dao.UserDao.findById", id);
sqlSession.close();
return user;
}
public int saveUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int res = sqlSession.insert("com.junlong.dao.UserDao.saveUser", user);
sqlSession.commit();
sqlSession.close();
return res;
}
public int updateUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int res = sqlSession.update("com.junlong.dao.UserDao.updateUser", user);
sqlSession.commit();
sqlSession.close();
return res;
}
public int deleteUser(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
int res = sqlSession.delete("com.junlong.dao.UserDao.deleteUser", id);
sqlSession.commit();
sqlSession.close();
return res;
}
public int findTotal() {
SqlSession sqlSession = sqlSessionFactory.openSession();
int res = sqlSession.selectOne("com.junlong.dao.UserDao.findTotal");
sqlSession.close();
return res;
}
}
<mapper namespace="com.junlong.dao.UserDao">
<!-- 查询所有用户 -->
<select id="findAll" resultType="com.junlong.domain.User">
select * from user
</select>
<!-- 根据id查询用户 -->
<select id="findById" resultType="com.junlong.domain.User" parameterType="int">
select * from user where id = #{id}
</select>
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.junlong.domain.User">
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
insert into user (username, birthday, sex, address) values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="com.junlong.domain.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<!-- 查询总记录数 -->
<select id="findTotal" resultType="int">
select count(*) from user
</select>
</mapper>
public class UserTest {
private InputStream inputStream;
private SqlSessionFactory sqlSessionFactory;
private UserDao userDao;
@Before
public void init() throws IOException {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
sqlSessionFactory = builder.build(inputStream);
userDao = new UserDaoImpl(sqlSessionFactory);
}
@After
public void destroy() throws IOException {
inputStream.close();
}
/**
* 测试查询所有用户
*/
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
/**
* 测试根据id查询用户
*/
@Test
public void testFindById() {
User user = userDao.findById(42);
System.out.println(user);
}
/**
* 测试保存用户
*/
@Test
public void testSaveUser() {
User user = new User();
user.setUsername("小姐姐");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("深圳");
int res = userDao.saveUser(user);
System.out.println(res);
System.out.println(user);
}
/**
* 测试更新用户
*/
@Test
public void testUpdateUser() {
User user = userDao.findById(74);
user.setUsername("update user1");
int res = userDao.updateUser(user);
System.out.println(res);
System.out.println(user);
}
/**
* 测试根据id删除用户
*/
@Test
public void testDeleteUser() {
int res = userDao.deleteUser(74);
System.out.println(res);
}
/**
* 测试查询总记录数
*/
@Test
public void testFindTotal() {
int total = userDao.findTotal();
System.out.println("共 " + total + " 条记录");
}
}
在使用 properties 标签配置时,我们可以采用两种方式指定属性配置。
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="1234"/>
</properties>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=1234
【注意】resource 属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下
url 属性:统一资源定位符(协议、主机、端口号、URI)
<properties resource="jdbcConfig.properties" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
在 SqlMapConfig.xml 中指定别名
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.junlong.domain.User"/>
<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
<package name="com.junlong.domain"/>
<package name="其它包"/>
</typeAliases>
<mapper resource=""/>
<mapper class=""/>
<package name=""/>
<configuration>
<properties resource="jdbc.properties"/>
<typeAliases>
<package name="com.junlong.domain"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.junlong.dao"/>
</mappers>
</configuration>
源码下载链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。