public class User { private int id; private String userName; private String password; private String sex; public User(){}
解读:public是权限修饰符,在它之下,还有protected,default,private。protected ,default,private。
private这是类里面对属性的封装。id,userName,password,sex是四个属性,int,String是数据类型。public User(){}是构造器。我用private封装我的属性,这样类外面读取不到,但是我用public公开方法,方便外部类的调用。default是包里面可以调用,protected是包里面和子类也可以调用。
public interface UserDao { // public User getUser(User user); public List<User> getUser(); public void addUser(User user); public void updateUser(User user); public void deleteUser(int id); }
public List<User> gerUser();
public void addUser(User user);
public void updateUser(User user);
public void deleteUser(int id);
接口里面四个方法都是抽象方法,因为没有方法体。第一个括号里面没有参数,是因为它对应的SQL语句是select * from user,不需要参数,查询的是整个表。删除方法里面的参数是int id,是因为对应的SQL语句是delete from user where id = #{id}
addUser 方法里面的参数是(User user),是因为我的SQL语句涉及到了所有的属性,只能用user代替,而user的数据类型可以理解成User类。
解读任务一xml,spring配置
<!-- 自动扫描 --> <context:component-scan base-package="com.ptteng.dao"/> <!-- 配置数据源 datasource就是数据源,DriverManagerDataSource驱动程序管理器数据源--> <bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>org.gjt.mm.mysql.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/springmybaitis</value> <!--springmybaitis是我的数据库 --> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>1234</value> </property> </bean> <!--sql会话工厂--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="jdbcDataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"></property> </bean> <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.ptteng.dao.UserDao"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> </beans>
自动扫描哪里,其实不用加一个扫描dao的,因为dao不用扫描。service才需要扫描,@service一般会加在service类里面,主类的上面一行。 property是性质性能的意思
Session是会话的意思;configLocation是配置位置的意思,后面的value就是类似于路径,这段话的作用就是把数据源和mybatis-config整合起来。ref是参考的意思,至于为什么上面用class,中间用ref,下面用value,我也不知道。因为jdbcDatasource涉及到bean,所以就用ref
后面的目的就是把UserDao和sqlSessionFactory整合起来,SQLSessionFactory又把mybatis-config和数据源整合起来了,而mybatis-config里面又包含了UserDao.xml文件,见下图,总之,配置文件的目的,就是把这么一大波都整合为一体
<configuration> <mappers> <mapper resource="UserDao.xml"/> </mappers> </configuration> 结构
<mapper namespace="com.ptteng.dao.UserDao"> <select id="getUser" resultType="com.ptteng.model.User"> SELECT * FROM user </select> <insert id="addUser" parameterType="com.ptteng.model.User" flushCache="true"> INSERT INTO user (id,userName,password,sex) VALUES (#{id},#{userName},#{password},#{sex}) </insert> <update id="updateUser" parameterType="com.ptteng.model.User"> UPDATE user SET password=#{password} ,userName=#{userName},sex=#{sex} WHERE id=#{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id=#{id} </delete> </mapper>
namespace就是命名空间,当然要找到UserDao类啊。
涉及到属性的就用参数类型,涉及到所有参数,就指向User;涉及到一个参数,就指向int或者string
@ContextConfiguration环境配置,位置指向类路径spring配置文件
@ContextConfiguration(locations={"classpath:ApplicationContext.xml"}) @RunWith(SpringJUnit4ClassRunner.class)//就是运行环境,也就是在spring环境下用junit4测试 public class UserController { @Autowired//算是一种声明,代表告诉spring,我要取你的bean了 private UserDao userDao;//限制符号,上面是default,然后是protected,public。代表开放尺度越来越大 Logger logger =Logger.getLogger(UserController.class);//代表用log4j输出报错,测试结果,打出日志。级别四个,
分别是debug,info,error,warn // 根据姓名查询
@Test public void getUserTest(){ List<User> users =userDao.getUser(); logger.debug("查找结果"+ users); System.out.println(users); }
public void getUserTest(){
List<User> users = userDao.getUser();
System.out.pritln(users)
}
// 通过id删除表中数据 @Test public void deleteUserById(){ userDao.deleteUser(9); }
public void deleteUserByIdTest(){
userDao.deleteDao(9);
// 修改表中数据 @Test public void updateUserTest(){ User user = new User( ); user.setSex("女"); user.setId(10); user.setUserName("龙妈"); user.setPassword("11113"); userDao.updateUser(user); }
public void updateUser(){
User user = new User();
user.setId(10);
user.setName("");
user.setPassword("");
user.setSex("");
userDao.updateUser(user);
System.out.pritln(user);
}
@Test public void addUserTest(){ User user = new User(); user.setId(4); user.setSex(""); user.setUserName("刘飞"); user.setPassword("5856"); userDao.addUser(user); System.out.println(user);
发生了一件事儿,居然只能输出姓名和密码,不能输出性别,查了之后才发现原来to String里面,没有进行sex的tostring方法。