两次面试都被问及这个问题,最开始我完全不知所云,第一次没来得及解决这个问题,第二次被问到的时候心里十分的不快,打算好好研究一下这个问题。查阅相关资料,大概解决方案有这几个。
- 数据库关键字自增,插入记录后用select last_insert_id()方法获得插入最后的关键字,但是这个方法是对表无关的,
- 使用select max(id) +1取出来,然后再将其赋值给插入记录的关键字。或则是插入后再使用select max(id)去获得关键字。
- 或则是利用存储过程写sql语句。
- 这次我主要研究了mybatis中的返回方式。
首先造轮子。创建实体类User:
首先给出工程目录和使用的jar包:
jar包:
(有多余的jar包)
public class User {
private int userId;
private String userName;
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;
}
}
对应的表:
定义dao:
public interface UserDao {
//插入User
public void insertUser(User user);
//查找所有User
public List<User> getAllUser();
}
配置文件mybatis.xml:
主要配置数据环境和实体类的定义和mapper:
<?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>
<!-- 这里定义实体类,最mapper里的类型里会只用到这里 -->
<typeAliases>
<typeAlias alias="User" type="entity.User" />
</typeAliases>
<!-- 数据环境配置,可以配置多个环境,和默认使用的环境 -->
<environments default="myEvir">
<environment id="myEvir">
<!-- 事务管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/micro" />
<property name="password" value="root" />
<property name="username" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 这里定义mapper名字 ,直接使用mapper的名字,不要添加路径-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
接下来定义sqlmap,就定义了两个方法,注意在插入那里用到的参数useGenderateKey和关键字的定义。
<?xml version="1.0" encoding="UTF-8"?>
<!-- mapper这里和configuration这里对比 -->
<!-- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper里定义对应的dao的路径 -->
<mapper namespace="dao.UserDao">
<resultMap type="entity.User" id="userList">
<result property="userId" column="user_id" />
<result property="userName" column="user_name" />
</resultMap>
<select id="getAllUser" resultMap="userList">
select * from user order by user_id
</select>
<!-- 这里使用到了userGenerateKeys为true,关键字为userId,插入记录后用user.getUserId就可以获取插入那个的关键字userId了 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" parameterType="User">
insert into user(user_id,user_name) values(#{userId},#{userName})
</insert>
</mapper>
测试类:
public class TestORM {
//工厂模式获得session
public static Reader reader;
public static SqlSessionFactory sqlSessionFactory;
static
{
try
{
//加载配置文件
reader = Resources.getResourceAsReader("mybatis.xml");
//获取工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory()
{
return sqlSessionFactory;
}
//定义插入方法
public static void insertUser(User user)
{
//打开session
SqlSession session = sqlSessionFactory.openSession();
try
{
//得到接口mapper
UserDao userdao = session.getMapper(UserDao.class);
userdao.insertUser(user);
//对数据库的修改要提交事务
session.commit();
System.out.println("增加了User");
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
session.close();
}
}
//定义获得所有的列表
public static List<User> getAllUser()
{
SqlSession session = sqlSessionFactory.openSession();
List<User> list = null;
try
{
UserDao userDao = session.getMapper(UserDao.class);
list = userDao.getAllUser();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
session.close();
}
return list;
}
public static void main(String args[])
{
//实例化一个user
User user = new User();
user.setUserName("xiaoma");
//插入user
insertUser(user);
//获得自增的id
System.out.println(user.getUserId());
//获取所有列表
List<User> list = getAllUser();
//打印所有User
for(User u : list)
{
System.out.println("user id为"+u.getUserId()+" user name:"+u.getUserName());
}
}
}
运行一次:
运行五次: