使用Mybatis完成的CRUD操作 個人總結的一些小規律 學習過程中碰到的錯誤: 雖然報錯信息提示的 很明顯是sql語法報錯,不過我一時之間沒有沒有看出sql語句錯在哪裡,後來才發現是插入sql語句的括弧寫錯了,不是小括弧,而是大括弧 JavaBean類 dao層 配置文件 測試類 typeAli ...
使用Mybatis完成的CRUD操作
個人總結的一些小規律
學習過程中碰到的錯誤:
org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
雖然報錯信息提示的 很明顯是sql語法報錯,不過我一時之間沒有沒有看出sql語句錯在哪裡,後來才發現是插入sql語句的括弧寫錯了,不是小括弧,而是大括弧
錯誤寫法:insert into user(username,address,sex,birthday)value(#(username),#(address),#(sex),#(birthday);
正確寫法:insert into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});
JavaBean類
package com.itheima.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
'}';
}
}
dao層
package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface IUserDao {
//查詢所有用戶
List<User> findAll();
//保存用戶
void saveUser(User user);
//更新用戶
void updateUser(User user);
//根據id刪除用戶
void deleteUser(Integer userId);
//查詢一個,根據id查詢用戶信息
User findById(Integer userId);
//根據名稱模糊查詢用戶信息
List<User> findByName(String username);
//查詢總用戶數
int findTotal();
}
配置文件
<?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.itheima.dao.IUserDao">
<!--查詢所有用戶-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user;
</select>
<!--保存用戶-->
<insert id="saveUser" parameterType="com.itheima.domain.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用戶-->
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<!--刪除用戶-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{id}
</delete>
<!--根據id查詢用戶-->
<select id="findById" parameterType="Integer" resultType="com.itheima.domain.User">
select * from user where id = #{uid}
</select>
<!--根據名稱模糊查詢-->
<select id="findByName" parameterType="String" resultType="com.itheima.domain.User">
select * from user where username like #{name}
</select>
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
</mapper>
測試類
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
private InputStream in;//讀取配置文件
private SqlSession sqlSession;//操作資料庫
private IUserDao userDao;
@Before//用於在測試方法執行之前執行,在其他方法執行之前執行init方法
public void init() throws IOException {
//讀取配置文件,生成位元組輸入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//獲取sqlSession對象
sqlSession = factory.openSession();
//獲取dao的代理對象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用於測試方法執行之後執行
public void destroy() throws IOException {
//提交事務
sqlSession.commit();
//釋放資源
sqlSession.close();
in.close();
}
@Test
//查詢所有用戶
public void testFindAll() throws IOException {
//執行查詢方法
List<User> users = userDao.findAll();
for(User user:users){
System.out.println(user);
}
}
@Test
//保存用戶
public void testSave(){
User user = new User();
user.setUsername("王五");
user.setAddress("北京市");
user.setSex("男");
user.setBirthday(new Date());
System.out.println("保存前"+user);
//執行保存方法
userDao.saveUser(user);
System.out.println("保存後"+user);
}
@Test
//更新用戶
public void testUpdate(){
User user = new User();
user.setId(50);
user.setUsername("李四");
user.setAddress("北京市");
user.setSex("男");
user.setBirthday(new Date());
//執行查詢方法
userDao.updateUser(user);
}
@Test
//刪除用戶
public void testDelete(){
userDao.deleteUser(48);
}
@Test
//查詢一個用戶
public void testFindOne(){
User user = userDao.findById(48);
System.out.println(user);
}
@Test
//查詢一個用戶
public void testFindByName(){
List<User> users = userDao.findByName("%王%");
for(User user :users){
System.out.println(user);
}
}
@Test
//查詢一個用戶
public void testFindTotal(){
int count = userDao.findTotal();
System.out.println(count);
}
}
typeAliases標簽和Package標簽
<!--使用typeAliases配置別名,他只能配置domain中類的別名-->
<typeAliases>
<!--typeAlias用於配置別名,type屬性指定的是實體類許可權定類名 alias屬性指定別名,當指定了別命,不再區分大小寫-->
<!--<typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->
<!--用於指定配置別名的包,當指定之後,該包下的實體類都會註冊別名,並且類名就是別名,不再區分大小寫-->
<package name="com.itheima.domain"></package>
</typeAliases>
<mappers>
<!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
<!--package標簽是用於指定dao介面所在的包,當指定了之後就不需要在寫mapper以及resource或者class了-->
<package name="com.itheima.dao"></package>
</mappers>
mybatis連接池的分類
連接池:我們在實際開發中都會使用連接池,因為他可以減少我們獲取連接所消耗的時間
mybatis中的連接池
mybatis連接池提供了3種方式的配置:
配置的位置:主配置文件SqlMapConfig.xml的dataSource標簽,type屬性就是表示採用何種連接池方式
type屬性的取值有三種
1.POOLED 採用傳統的javax.sql.DataSource規範中的連接池,mybatis中有針對規範的實現
2.UNPOOLED 採用的獲取連接的方式,雖然也實現Javax.sql.DataSource介面,但是並沒有使用池的思想
3.採用伺服器提供的JNDI技術實現,來獲取DataSource對象,不同的伺服器所能拿到DataSource是不一樣的,如果不是web或者maven的war工程,是不能使用的(tomcat伺服器,採用連接池就是dbcp連接池)